Merge "Test graphical console novnc connection"
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index c978a52..0000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,6 +0,0 @@
-include AUTHORS
-include ChangeLog
-exclude .gitignore
-exclude .gitreview
-
-global-exclude *.pyc
diff --git a/README.rst b/README.rst
index e4e5a10..d9d0d29 100644
--- a/README.rst
+++ b/README.rst
@@ -1,15 +1,16 @@
-==============================================
-Tempest plugin for ironic and ironic-inspector
-==============================================
+=========================
+Tempest plugin for Ironic
+=========================
 
-This repository contains a Tempest_ plugin for OpenStack `Bare Metal`_ and
-`Bare Metal Introspection`_ projects.
+.. image:: https://governance.openstack.org/tc/badges/ironic-tempest-plugin.svg
+
+This repository contains a Tempest_ plugin for OpenStack `Bare Metal`_
+project.
 
 * Free software: Apache license
 * Documentation: https://docs.openstack.org/ironic-tempest-plugin
 * Source: https://opendev.org/openstack/ironic-tempest-plugin
-* Bugs: https://storyboard.openstack.org/#!/project/951
+* Bugs: https://bugs.launchpad.net/ironic/+bugs
 
 .. _Tempest: https://docs.openstack.org/tempest/latest/
 .. _Bare Metal: https://docs.openstack.org/ironic/latest/
-.. _Bare Metal Introspection: https://docs.openstack.org/ironic-inspector/latest/
diff --git a/doc/source/index.rst b/doc/source/index.rst
index b036a93..c10c050 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,4 +1,17 @@
-.. include:: ../../README.rst
+=========================
+Tempest plugin for Ironic
+=========================
+
+This repository contains a Tempest_ plugin for OpenStack `Bare Metal`_
+project.
+
+* Free software: Apache license
+* Documentation: https://docs.openstack.org/ironic-tempest-plugin
+* Source: https://opendev.org/openstack/ironic-tempest-plugin
+* Bugs: https://bugs.launchpad.net/ironic/+bugs
+
+.. _Tempest: https://docs.openstack.org/tempest/latest/
+.. _Bare Metal: https://docs.openstack.org/ironic/latest/
 
 Contents:
 
@@ -15,4 +28,3 @@
 * :ref:`genindex`
 * :ref:`modindex`
 * :ref:`search`
-
diff --git a/ironic_tempest_plugin/tests/api/admin/test_shards.py b/ironic_tempest_plugin/tests/api/admin/test_shards.py
index 5a5e4ba..c2c83bb 100644
--- a/ironic_tempest_plugin/tests/api/admin/test_shards.py
+++ b/ironic_tempest_plugin/tests/api/admin/test_shards.py
@@ -137,7 +137,7 @@
     def setUp(self):
         super(TestGetAllShards, self).setUp()
         _, self.chassis = self.create_chassis()
-        self.shards = ["shard1", "shard2", "shard3"]
+        self.shards = {"shard1", "shard2", "shard3"}
         self.node_ids = []
         for shard in self.shards:
             _, node = self.create_node(self.chassis['uuid'], shard=shard)
@@ -146,6 +146,6 @@
     @decorators.idempotent_id('fc786196-63c7-4e0d-bd14-3e478d4d1e3e')
     def test_get_all_shards(self):
         _, fetched_shards = self.client.get_shards()
-        fetched_shards = [shard['name'] for shard in fetched_shards['shards']]
+        fetched_shards = {shard['name'] for shard in fetched_shards['shards']}
 
-        self.assertCountEqual(self.shards, fetched_shards)
+        self.assertTrue(self.shards.issubset(fetched_shards))
diff --git a/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py b/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
index e3a9a58..6b68e56 100644
--- a/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
+++ b/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
@@ -14,6 +14,7 @@
 # under the License.
 
 from oslo_log import log as logging
+from tempest.common import compute
 from tempest.common import utils
 from tempest.common import waiters
 from tempest import config
@@ -26,7 +27,8 @@
 CONF = config.CONF
 
 
-class BaremetalBasicOps(baremetal_manager.BaremetalScenarioTest):
+class BaremetalBasicOps(baremetal_manager.BaremetalScenarioTest,
+                        compute.NoVNCValidateMixin):
     """This smoke test tests an Ironic driver.
 
     It follows this basic set of operations:
@@ -222,9 +224,25 @@
             # set the lessee.
             self.assertEqual(iinfo['project_id'], self.node['lessee'])
 
+    def validate_console(self):
+
+        body = self.servers_client.get_vnc_console(self.instance['id'],
+                                                   type='novnc')['console']
+        self.assertEqual('novnc', body['type'])
+        # Do the initial HTTP Request to novncproxy to get the NoVNC JavaScript
+        self.validate_novnc_html(body['url'])
+        # Do the WebSockify HTTP Request to novncproxy to do the RFB connection
+        self.websocket = compute.create_websocket(body['url'])
+        self.addCleanup(self.websocket.close)
+        # Validate that we successfully connected and upgraded to Web Sockets
+        self.validate_websocket_upgrade()
+        # Validate the RFB Negotiation to determine if a valid VNC session
+        self.validate_rfb_negotiation()
+
     def baremetal_server_ops(self):
         self.add_keypair()
         self.instance, self.node = self.boot_instance(image_id=self.image_ref)
+        self.validate_console()
         self.validate_image()
         self.validate_ports()
         self.validate_scheduling()
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 4849f56..dfdd81f 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -17,6 +17,7 @@
         - ironic-standalone-redfish-2025.2
         - ironic-standalone-redfish-2025.1
         - ironic-tempest-standalone-advanced
+        - ironic-tempest-bios-ipmi-direct
         # NOTE(dtantsur): these jobs cover rarely changed tests and are quite
         # unstable, so keep them non-voting.
         - ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode:
@@ -34,3 +35,4 @@
         - ironic-standalone-redfish
         - ironic-standalone-redfish-2025.2
         - ironic-standalone-redfish-2025.1
+        - ironic-tempest-bios-ipmi-direct