Merge "Remove useless cover target"
diff --git a/ironic_tempest_plugin/config.py b/ironic_tempest_plugin/config.py
index 47bcb55..38a67eb 100644
--- a/ironic_tempest_plugin/config.py
+++ b/ironic_tempest_plugin/config.py
@@ -20,6 +20,10 @@
 from tempest import config  # noqa
 
 
+_INSPECTOR_REASON = ('ironic-inspector was retired in favor of the built-in'
+                     'agent inspect interface.')
+
+
 # NOTE(TheJulia): The following options are loaded into a tempest
 # plugin configuration option via plugin.py.
 ironic_service_option = cfg.BoolOpt('ironic',
@@ -29,6 +33,8 @@
 
 inspector_service_option = cfg.BoolOpt("ironic_inspector",
                                        default=False,
+                                       deprecated_for_removal=True,
+                                       deprecated_reason=_INSPECTOR_REASON,
                                        help="Whether or not ironic-inspector "
                                        "is expected to be available")
 
@@ -40,6 +46,8 @@
 
 inspector_scope_enforcement = cfg.BoolOpt('ironic_inspector',
                                           default=True,
+                                          deprecated_for_removal=True,
+                                          deprecated_reason=_INSPECTOR_REASON,
                                           help='Whether or not '
                                                'ironic-inspector is expected '
                                                'to enforce auth scope.')
@@ -288,28 +296,42 @@
 BaremetalIntrospectionGroup = [
     cfg.StrOpt('catalog_type',
                default='baremetal-introspection',
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Catalog type of the baremetal provisioning service"),
     cfg.StrOpt('endpoint_type',
                default='publicURL',
                choices=['public', 'admin', 'internal',
                         'publicURL', 'adminURL', 'internalURL'],
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="The endpoint type to use for the baremetal introspection"
                     " service"),
     cfg.IntOpt('introspection_sleep',
                default=30,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Introspection sleep before check status"),
     cfg.IntOpt('introspection_timeout',
                default=600,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Introspection time out"),
     cfg.IntOpt('introspection_start_timeout',
                default=90,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Timeout to start introspection"),
     cfg.IntOpt('hypervisor_update_sleep',
                default=60,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Time to wait until nova becomes aware of "
                     "bare metal instances"),
     cfg.IntOpt('hypervisor_update_timeout',
                default=300,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Time out for wait until nova becomes aware of "
                     "bare metal instances"),
     # NOTE(aarefiev): status_check_period default is 60s, but checking
@@ -317,14 +339,20 @@
     # 80s would be enough to make one more check.
     cfg.IntOpt('ironic_sync_timeout',
                default=80,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Time it might take for Ironic--Inspector "
                     "sync to happen"),
     cfg.IntOpt('discovery_timeout',
                default=300,
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="Time to wait until new node would enrolled in "
                     "ironic"),
     cfg.BoolOpt('auto_discovery_feature',
                 default=False,
+                deprecated_for_removal=True,
+                deprecated_reason=_INSPECTOR_REASON,
                 help="Is the auto-discovery feature enabled. Enroll hook "
                      "should be specified in node_not_found_hook - processing "
                      "section of inspector.conf"),
@@ -332,11 +360,17 @@
                # TODO(dtantsur): change to fake-hardware when Queens is no
                # longer supported.
                default='fake',
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="The driver expected to be set on newly discovered nodes. "
                     "Only has effect with auto_discovery_feature is True."),
     cfg.StrOpt('auto_discovery_target_driver',
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="The driver to set on the newly discovered nodes. "
                     "Only has effect with auto_discovery_feature is True."),
     cfg.StrOpt('data_store',
+               deprecated_for_removal=True,
+               deprecated_reason=_INSPECTOR_REASON,
                help="The storage backend for storing introspection data."),
 ]
diff --git a/ironic_tempest_plugin/tests/api/admin/test_portgroups.py b/ironic_tempest_plugin/tests/api/admin/test_portgroups.py
index 332c791..80724fe 100644
--- a/ironic_tempest_plugin/tests/api/admin/test_portgroups.py
+++ b/ironic_tempest_plugin/tests/api/admin/test_portgroups.py
@@ -21,7 +21,7 @@
 class TestPortGroups(base.BaseBaremetalTest):
     """Basic positive test cases for port groups."""
 
-    min_microversion = '1.23'
+    min_microversion = '1.26'  # portgroup mode and properties introduced
 
     def setUp(self):
         super(TestPortGroups, self).setUp()
diff --git a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_advanced_ops.py b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_advanced_ops.py
index 0a7116a..b66309b 100644
--- a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_advanced_ops.py
+++ b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_advanced_ops.py
@@ -27,6 +27,7 @@
     driver = 'redfish'
     deploy_interface = 'direct'
     boot_interface = 'redfish-virtual-media'
+    # To force interface retoggling.
     image_ref = CONF.baremetal.whole_disk_image_ref
     image_checksum = CONF.baremetal.whole_disk_image_checksum
     wholedisk_image = True
@@ -95,7 +96,23 @@
 
         # Get the latest state for the node.
         self.node = self.get_node(self.node['uuid'])
+        # This test, as far as I'm remembering after the fact, was developed
+        # in an environment where neutron was the default network interface.
+        # so we must try to set it to properly ensure dhcp-less operation.
         prior_prov_net = self.node['driver_info'].get('provisioning_network')
+        try:
+            self.client.update_node(self.node['uuid'],
+                                    [{'path': '/network_interface',
+                                      'op': 'replace',
+                                      'value': 'neutron'}])
+            self.addCleanup(self.update_node,
+                            self.node['uuid'],
+                            [{'op': 'replace',
+                              'path': '/network_interface',
+                              'value': 'flat'}])
+        except Exception:
+            raise self.skipException(
+                "Ironic configuration incorrect to exercise this test.")
 
         ip_version = CONF.validation.ip_version_for_ssh
         tenant_cidr = '10.0.6.0/24'
diff --git a/releasenotes/notes/deprecate-inspector-0de255090cd2cb82.yaml b/releasenotes/notes/deprecate-inspector-0de255090cd2cb82.yaml
new file mode 100644
index 0000000..0607071
--- /dev/null
+++ b/releasenotes/notes/deprecate-inspector-0de255090cd2cb82.yaml
@@ -0,0 +1,10 @@
+---
+deprecations:
+  - |
+    Support for ironic-inspector has been deprecated, because ironic-inspector
+    was already retired. Due to this deprecation, the following options are
+    also deprecated.
+
+    - ``[service_available] ironic_inspector``
+    - ``[enforce_scope] ironic_inspector``
+    - All options in the ``[baremetal_introspection]`` section.
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 8ba9c3a..c89b63e 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -7,34 +7,29 @@
       jobs:
         # NOTE(dtantsur): keep N-3 and older non-voting for these jobs.
         - ironic-tempest-functional-python3
+        - ironic-tempest-functional-python3-2025.2
         - ironic-tempest-functional-python3-2025.1
-        - ironic-tempest-functional-python3-2024.2
+        # NOTE(TheJulia): Consensus in the 2026.1 PTG is that we don't need
+        # to run the anaconda job as heavily as we need to run the normal
+        # tempest jobs.
         - ironic-standalone-anaconda
-        - ironic-standalone-anaconda-2025.1
-        - ironic-standalone-anaconda-2024.2
         - ironic-standalone-redfish
+        - ironic-standalone-redfish-2025.2
         - ironic-standalone-redfish-2025.1
-        - ironic-standalone-redfish-2024.2
-        # NOTE(dtantsur): inspector is deprecated and rarely sees any changes,
-        # no point in running many jobs
-        - ironic-inspector-tempest
         # NOTE(dtantsur): these jobs cover rarely changed tests and are quite
         # unstable, so keep them non-voting.
         - ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode:
             voting: false
-        - ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2025.1:
+        - ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2025.2:
             voting: false
         - ironic-inspector-tempest-discovery:
             voting: false
     gate:
       jobs:
         - ironic-tempest-functional-python3
+        - ironic-tempest-functional-python3-2025.2
         - ironic-tempest-functional-python3-2025.1
-        - ironic-tempest-functional-python3-2024.2
         - ironic-standalone-anaconda
-        - ironic-standalone-anaconda-2025.1
-        - ironic-standalone-anaconda-2024.2
         - ironic-standalone-redfish
+        - ironic-standalone-redfish-2025.2
         - ironic-standalone-redfish-2025.1
-        - ironic-standalone-redfish-2024.2
-        - ironic-inspector-tempest
diff --git a/zuul.d/stable-jobs.yaml b/zuul.d/stable-jobs.yaml
index d573737..f67694b 100644
--- a/zuul.d/stable-jobs.yaml
+++ b/zuul.d/stable-jobs.yaml
@@ -1,12 +1,7 @@
 - job:
-    name: ironic-standalone-2024.2
-    parent: ironic-standalone
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-standalone-2024.1
-    parent: ironic-standalone
-    override-checkout: stable/2024.1
+    name: ironic-standalone-redfish-2025.2
+    parent: ironic-standalone-redfish
+    override-checkout: stable/2025.2
 
 - job:
     name: ironic-standalone-redfish-2025.1
@@ -14,14 +9,9 @@
     override-checkout: stable/2025.1
 
 - job:
-    name: ironic-standalone-redfish-2024.2
-    parent: ironic-standalone-redfish
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-standalone-redfish-2024.1
-    parent: ironic-standalone-redfish
-    override-checkout: stable/2024.1
+    name: ironic-standalone-anaconda-2025.2
+    parent: ironic-standalone-anaconda
+    override-checkout: stable/2025.2
 
 - job:
     name: ironic-standalone-anaconda-2025.1
@@ -29,14 +19,9 @@
     override-checkout: stable/2025.1
 
 - job:
-    name: ironic-standalone-anaconda-2024.2
-    parent: ironic-standalone-anaconda
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-standalone-anaconda-2024.1
-    parent: ironic-standalone-anaconda
-    override-checkout: stable/2024.1
+    name: ironic-tempest-functional-python3-2025.2
+    parent: ironic-tempest-functional-python3
+    override-checkout: stable/2025.2
 
 - job:
     name: ironic-tempest-functional-python3-2025.1
@@ -44,46 +29,11 @@
     override-checkout: stable/2025.1
 
 - job:
-    name: ironic-tempest-functional-python3-2024.2
-    parent: ironic-tempest-functional-python3
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-tempest-functional-python3-2024.1
-    parent: ironic-tempest-functional-python3
-    override-checkout: stable/2024.1
-
-- job:
-    name: ironic-tempest-functional-rbac-scope-enforced-2024.2
-    parent: ironic-tempest-functional-rbac-scope-enforced
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-tempest-functional-rbac-scope-enforced-2024.1
-    parent: ironic-tempest-functional-rbac-scope-enforced
-    override-checkout: stable/2024.1
+    name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2025.2
+    parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
+    override-checkout: stable/2025.2
 
 - job:
     name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2025.1
     parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
     override-checkout: stable/2025.1
-
-- job:
-    name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2024.2
-    parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode-2024.1
-    parent: ironic-tempest-ipa-wholedisk-direct-tinyipa-multinode
-    override-checkout: stable/2024.1
-
-- job:
-    name: ironic-inspector-tempest-2024.2
-    parent: ironic-inspector-tempest
-    override-checkout: stable/2024.2
-
-- job:
-    name: ironic-inspector-tempest-2024.1
-    parent: ironic-inspector-tempest
-    override-checkout: stable/2024.1