Merge "Make the multinode job non-voting"
diff --git a/ironic_tempest_plugin/config.py b/ironic_tempest_plugin/config.py
index d5cdcfa..004612a 100644
--- a/ironic_tempest_plugin/config.py
+++ b/ironic_tempest_plugin/config.py
@@ -178,6 +178,9 @@
     cfg.IntOpt('introspection_timeout',
                default=600,
                help="Introspection time out"),
+    cfg.IntOpt('introspection_start_timeout',
+               default=90,
+               help="Timeout to start introspection"),
     cfg.IntOpt('hypervisor_update_sleep',
                default=60,
                help="Time to wait until nova becomes aware of "
diff --git a/ironic_tempest_plugin/tests/scenario/introspection_manager.py b/ironic_tempest_plugin/tests/scenario/introspection_manager.py
index c45f285..0131089 100644
--- a/ironic_tempest_plugin/tests/scenario/introspection_manager.py
+++ b/ironic_tempest_plugin/tests/scenario/introspection_manager.py
@@ -177,11 +177,24 @@
             node_ids = [node_ids]
         start = int(time.time())
         not_introspected = {node_id for node_id in node_ids}
+        introspection_start_timeout = (
+            CONF.baremetal_introspection.introspection_start_timeout)
 
         while not_introspected:
             time.sleep(CONF.baremetal_introspection.introspection_sleep)
             for node_id in node_ids:
-                status = self.introspection_status(node_id)
+                try:
+                    status = self.introspection_status(node_id)
+                except lib_exc.NotFound as exc:
+                    if int(time.time()) - start >= introspection_start_timeout:
+                        message = ('Node %(node_id)s did not appear in the '
+                                   'baremetal introspection API after '
+                                   '%(timeout)d seconds: %(error)s' %
+                                   {'node_id': node_id, 'error': exc,
+                                    'timeout': introspection_start_timeout})
+                        raise exceptions.IntrospectionFailed(message)
+                    else:
+                        continue
                 if status['finished']:
                     if status['error']:
                         message = ('Node %(node_id)s introspection failed '
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index 48246df..bfb6706 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -2,17 +2,26 @@
     name: ironic-standalone-train
     parent: ironic-standalone
     override-branch: stable/train
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-standalone-stein
     parent: ironic-standalone
     override-branch: stable/stein
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-dsvm-standalone-rocky
     parent: ironic-standalone
     override-branch: stable/rocky
     nodeset: openstack-single-node-xenial
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-dsvm-standalone-queens
@@ -24,6 +33,7 @@
         FIXED_NETWORK_SIZE: 4096
         EBTABLES_RACE_FIX: True
         IRONIC_USE_MOD_WSGI: True
+        USE_PYTHON3: False
 
 - job:
     name: ironic-tempest-functional-python3-train
@@ -50,11 +60,17 @@
     name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-train
     parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
     override-branch: stable/train
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-stein
     parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
     override-branch: stable/stein
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-tempest-dsvm-ipa-wholedisk-agent_ipmitool-tinyipa-multinode-rocky
@@ -69,6 +85,7 @@
         EBTABLES_RACE_FIX: True
         PUBLIC_BRIDGE: br_ironic_vxlan
         OVS_BRIDGE_MAPPINGS: 'mynetwork:brbm,public:br_ironic_vxlan'
+        USE_PYTHON3: False
     group-vars:
       subnode:
         devstack_localrc:
@@ -87,6 +104,7 @@
         EBTABLES_RACE_FIX: True
         PUBLIC_BRIDGE: br_ironic_vxlan
         OVS_BRIDGE_MAPPINGS: 'mynetwork:brbm,public:br_ironic_vxlan'
+        USE_PYTHON3: False
     group-vars:
       subnode:
         devstack_localrc:
@@ -100,6 +118,7 @@
       devstack_localrc:
         FIXED_NETWORK_SIZE: 4096
         EBTABLES_RACE_FIX: True
+        USE_PYTHON3: False
 
 - job:
     name: ironic-inspector-tempest-stein
@@ -109,6 +128,7 @@
       devstack_localrc:
         FIXED_NETWORK_SIZE: 4096
         EBTABLES_RACE_FIX: True
+        USE_PYTHON3: False
 
 - job:
     name: ironic-tempest-dsvm-ironic-inspector-rocky
@@ -119,6 +139,7 @@
       devstack_localrc:
         FIXED_NETWORK_SIZE: 4096
         EBTABLES_RACE_FIX: True
+        USE_PYTHON3: False
 
 - job:
     name: ironic-tempest-dsvm-ironic-inspector-queens
@@ -129,25 +150,38 @@
       devstack_localrc:
         FIXED_NETWORK_SIZE: 4096
         EBTABLES_RACE_FIX: True
+        USE_PYTHON3: False
 
 - job:
     name: ironic-inspector-tempest-discovery-train
     parent: ironic-inspector-tempest-discovery
     override-branch: stable/train
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-inspector-tempest-discovery-stein
     parent: ironic-inspector-tempest-discovery
     override-branch: stable/stein
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-inspector-tempest-dsvm-discovery-rocky
     parent: ironic-inspector-tempest-discovery
     override-branch: stable/rocky
     nodeset: openstack-single-node-xenial
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False
 
 - job:
     name: ironic-inspector-tempest-dsvm-discovery-queens
     parent: ironic-inspector-tempest-discovery
     override-branch: stable/queens
     nodeset: openstack-single-node-xenial
+    vars:
+      devstack_localrc:
+        USE_PYTHON3: False