Merge "Tap Mirror API and scenario tests"
diff --git a/neutron_tempest_plugin/api/admin/test_networks.py b/neutron_tempest_plugin/api/admin/test_networks.py
index 17a8990..a67afa3 100644
--- a/neutron_tempest_plugin/api/admin/test_networks.py
+++ b/neutron_tempest_plugin/api/admin/test_networks.py
@@ -86,3 +86,55 @@
         network = self.admin_client.show_network(
             network['id'])['network']
         self.assertEqual('vxlan', network['provider:network_type'])
+
+    @decorators.idempotent_id('bbb9a2be-c9a7-4693-ac8e-d51b5371b68d')
+    def test_list_network_filter_provider_attributes(self):
+        if not config.CONF.neutron_plugin_options.provider_vlans:
+            raise self.skipException("No provider VLAN networks available")
+        project_id = self.client.project_id
+        physnet_name = config.CONF.neutron_plugin_options.provider_vlans[0]
+        # Check project networks pre-created.
+        body = self.client.list_networks(project_id=project_id)['networks']
+        num_networks_precreated = len(body)
+
+        networks = []
+        num_networks = 5
+        for _ in range(num_networks):
+            networks.append(self.create_network(
+                provider_network_type='vlan',
+                provider_physical_network=physnet_name,
+                project_id=project_id))
+
+        # Check new project networks created.
+        body = self.client.list_networks(project_id=project_id)['networks']
+        self.assertEqual(num_networks + num_networks_precreated, len(body))
+
+        vlan_ids = [net['provider:segmentation_id'] for net in networks]
+
+        # List networks with limit (from 1 to num_networks).
+        # Each filter (except from the 'provider:segmentation_id'), uses the
+        # value directly and in a list.
+        for idx in range(1, num_networks + 1):
+            # Filter by 'provider:network_type'
+            kwargs = {'provider:network_type': 'vlan',
+                      'project_id': project_id, 'limit': idx}
+            body = self.client.list_networks(**kwargs)['networks']
+            self.assertEqual(idx, len(body))
+            kwargs['provider:network_type'] = ['vlan']
+            body = self.client.list_networks(**kwargs)['networks']
+            self.assertEqual(idx, len(body))
+
+            # Filter by 'provider:physical_network'.
+            kwargs = {'provider:physical_network': physnet_name,
+                      'project_id': project_id, 'limit': idx}
+            body = self.client.list_networks(**kwargs)['networks']
+            self.assertEqual(idx, len(body))
+            kwargs['provider:physical_network'] = [physnet_name]
+            body = self.client.list_networks(**kwargs)['networks']
+            self.assertEqual(idx, len(body))
+
+            # Filter by 'provider:segmentation_id'
+            kwargs = {'provider:segmentation_id': vlan_ids,
+                      'project_id': project_id, 'limit': idx}
+            body = self.client.list_networks(**kwargs)['networks']
+            self.assertEqual(idx, len(body))
diff --git a/neutron_tempest_plugin/api/test_routers.py b/neutron_tempest_plugin/api/test_routers.py
index 1470a7b..0012ffe 100644
--- a/neutron_tempest_plugin/api/test_routers.py
+++ b/neutron_tempest_plugin/api/test_routers.py
@@ -506,9 +506,17 @@
                     remove_gateways[0])
 
         external_gateways[1] = remove_gateways[0]
-        res_update_gws = self.admin_client.router_update_external_gateways(
-            router['id'],
-            external_gateways)
+        try:
+            res_update_gws = self.admin_client.router_update_external_gateways(
+                router['id'],
+                external_gateways)
+        except lib_exc.Conflict as exc:
+            if 'IpAddressAlreadyAllocated' in str(exc):
+                self.skipTest(
+                    'The IP address of the removed gateway port is already '
+                    'used by other test, thus this exception is dismissed and '
+                    'the rest of the test skipped')
+            raise exc
 
         self.assertEqual(len(res_update_gws['router']['external_gateways']), 2)
         for n in range(0, 2):
diff --git a/neutron_tempest_plugin/bgpvpn/base.py b/neutron_tempest_plugin/bgpvpn/base.py
index b436a5d..aeecbfc 100644
--- a/neutron_tempest_plugin/bgpvpn/base.py
+++ b/neutron_tempest_plugin/bgpvpn/base.py
@@ -72,13 +72,8 @@
     @classmethod
     def skip_checks(cls):
         super(BaseBgpvpnTest, cls).skip_checks()
-        msg = None
         if not utils.is_extension_enabled('bgpvpn', 'network'):
             msg = "Bgpvpn extension not enabled."
-        elif not CONF.bgpvpn.run_bgpvpn_tests:
-            msg = ("Running of bgpvpn related tests is disabled in "
-                   "plugin configuration.")
-        if msg:
             raise cls.skipException(msg)
 
     def create_bgpvpn(self, client, **kwargs):
diff --git a/neutron_tempest_plugin/common/ip.py b/neutron_tempest_plugin/common/ip.py
index 5335219..e87219b 100644
--- a/neutron_tempest_plugin/common/ip.py
+++ b/neutron_tempest_plugin/common/ip.py
@@ -159,21 +159,22 @@
         # ip addr del 192.168.1.1/24 dev em1
         return self.execute('address', 'del', address, 'dev', device)
 
-    def add_route(self, address, device, gateway=None):
+    def add_route(self, address, device, gateway=None, ip_version=4):
         if gateway:
-            # ip route add 192.168.1.0/24 via 192.168.22.1 dev em1
             return self.execute(
                 'route', 'add', address, 'via', gateway, 'dev', device)
         else:
-            # ip route add 192.168.1.0/24 dev em1
-            return self.execute('route', 'add', address, 'dev', device)
+            return self.execute(
+                f'-{ip_version}', 'route', 'add', address, 'dev', device)
 
-    def delete_route(self, address, device):
-        # ip route del 192.168.1.0/24 dev em1
-        return self.execute('route', 'del', address, 'dev', device)
+    def delete_route(self, address, device, ip_version=4):
+        return self.execute(
+            f'-{ip_version}', 'route', 'del', address, 'dev', device)
 
-    def list_routes(self, *args):
-        output = self.execute('route', 'show', *args)
+    def list_routes(self, *args, device=None, ip_version=4):
+        if not args and device:
+            args = ("dev", device)
+        output = self.execute(f'-{ip_version}', 'route', 'show', *args)
         return list(parse_routes(output))
 
     def get_nic_name_by_mac(self, mac_address):
diff --git a/neutron_tempest_plugin/common/ssh.py b/neutron_tempest_plugin/common/ssh.py
index 700d21b..6e7e2c5 100644
--- a/neutron_tempest_plugin/common/ssh.py
+++ b/neutron_tempest_plugin/common/ssh.py
@@ -230,8 +230,6 @@
 
             # Update local environment
             lang, encoding = locale.getlocale()
-            if not lang:
-                lang, encoding = locale.getdefaultlocale()
             _locale = '.'.join([lang, encoding])
             channel.update_environment({'LC_ALL': _locale,
                                         'LANG': _locale})
diff --git a/neutron_tempest_plugin/config.py b/neutron_tempest_plugin/config.py
index 38d6ac6..880d3a6 100644
--- a/neutron_tempest_plugin/config.py
+++ b/neutron_tempest_plugin/config.py
@@ -100,6 +100,7 @@
                help='User name used to connect to "ssh_proxy_jump_host".'),
     cfg.StrOpt('ssh_proxy_jump_password',
                default=None,
+               secret=True,
                help='Password used to connect to "ssh_proxy_jump_host".'),
     cfg.StrOpt('ssh_proxy_jump_keyfile',
                default=None,
@@ -158,22 +159,11 @@
                 default=False,
                 help='Schedule BGP speakers to agents explicitly.'),
 ]
+neutron_group = cfg.OptGroup(name="neutron_plugin_options",
+                             title="Neutron Plugin Options")
 
-# TODO(amuller): Redo configuration options registration as part of the planned
-# transition to the Tempest plugin architecture
-for opt in NeutronPluginOptions:
-    CONF.register_opt(opt, 'neutron_plugin_options')
 
 BgpvpnGroup = [
-    # TODO(tkajinam): This has been required since the plugin tests was merged
-    # into neutron-tempest-plugin in Train. Remove this after 2025.1 release.
-    cfg.BoolOpt('run_bgpvpn_tests',
-                default=True,
-                help=("If it is set to False bgpvpn api and scenario tests "
-                      "will be skipped"),
-                deprecated_for_removal=True,
-                deprecated_reason='Tests are skipped according to '
-                                  'the available extensions.'),
     cfg.IntOpt('min_asn',
                default=100,
                help=("Minimum number for the range of "
@@ -191,48 +181,17 @@
                help=("Maximum number for the range of "
                      "assigned number for distinguishers.")),
 ]
-
 bgpvpn_group = cfg.OptGroup(name="bgpvpn", title=("Networking-Bgpvpn Service "
                                                   "Options"))
-CONF.register_group(bgpvpn_group)
-CONF.register_opts(BgpvpnGroup, group="bgpvpn")
 
 FwaasGroup = [
-    # TODO(tkajinam): This has been required since the plugin tests was merged
-    # into neutron-tempest-plugin in Train. Remove this after 2025.1 release.
-    cfg.BoolOpt('run_fwaas_tests',
-                default=True,
-                help=("If it is set to False fwaas api and scenario tests "
-                      "will be skipped"),
-                deprecated_for_removal=True,
-                deprecated_reason='Tests are skipped according to '
-                                  'the available extensions.'),
     cfg.StrOpt('driver',
                default=None,
                choices=['openvswitch', 'ovn'],
                help='Driver used by the FWaaS plugin.'),
 ]
-
 fwaas_group = cfg.OptGroup(
     name="fwaas", title=("Neutron-fwaas Service Options"))
-CONF.register_group(fwaas_group)
-CONF.register_opts(FwaasGroup, group="fwaas")
-
-SfcGroup = [
-    # TODO(tkajinam): This has been required since the plugin tests was merged
-    # into neutron-tempest-plugin in Train. Remove this after 2025.1 release.
-    cfg.BoolOpt('run_sfc_tests',
-                default=True,
-                help=("If it is set to False SFC api and scenario tests "
-                      "will be skipped"),
-                deprecated_for_removal=True,
-                deprecated_reason='Tests are skipped according to '
-                                  'the available extensions.'),
-]
-
-sfc_group = cfg.OptGroup(name="sfc", title=("Networking-sfc Service Options"))
-CONF.register_group(sfc_group)
-CONF.register_opts(SfcGroup, group="sfc")
 
 
 TaasGroup = [
@@ -249,8 +208,6 @@
 ]
 taas_group = cfg.OptGroup(name='taas',
                           title='TaaS Tempest Options')
-CONF.register_group(taas_group)
-CONF.register_opts(TaasGroup, group="taas")
 
 
 DynamicRoutingGroup = [
@@ -259,12 +216,9 @@
                help=('Base image used to build the image for connectivity '
                      'check')),
 ]
-
 dynamic_routing_group = cfg.OptGroup(
     name="dynamic_routing",
     title=("Neutron-Dynamic-Routing Service Options"))
-CONF.register_group(dynamic_routing_group)
-CONF.register_opts(DynamicRoutingGroup, group="dynamic_routing")
 
 
 # DNS Integration with an External Service
@@ -276,5 +230,3 @@
 ]
 dns_feature_group = cfg.OptGroup(
     name='designate_feature_enabled', title='Enabled Designate Features')
-CONF.register_group(dns_feature_group)
-CONF.register_opts(DnsFeatureGroup, group="designate_feature_enabled")
diff --git a/neutron_tempest_plugin/fwaas/api/fwaas_v2_base.py b/neutron_tempest_plugin/fwaas/api/fwaas_v2_base.py
index f4f63ec..e54c643 100644
--- a/neutron_tempest_plugin/fwaas/api/fwaas_v2_base.py
+++ b/neutron_tempest_plugin/fwaas/api/fwaas_v2_base.py
@@ -21,13 +21,4 @@
 
 
 class BaseFWaaSTest(fwaas_v2_client.FWaaSClientMixin, base.BaseNetworkTest):
-
-    @classmethod
-    def skip_checks(cls):
-        super(BaseFWaaSTest, cls).skip_checks()
-        msg = None
-        if not CONF.fwaas.run_fwaas_tests:
-            msg = ("Running of fwaas related tests is disabled in "
-                   "plugin configuration.")
-        if msg:
-            raise cls.skipException(msg)
+    pass
diff --git a/neutron_tempest_plugin/fwaas/scenario/fwaas_v2_manager.py b/neutron_tempest_plugin/fwaas/scenario/fwaas_v2_manager.py
index 9cc0a6a..371a186 100644
--- a/neutron_tempest_plugin/fwaas/scenario/fwaas_v2_manager.py
+++ b/neutron_tempest_plugin/fwaas/scenario/fwaas_v2_manager.py
@@ -31,16 +31,6 @@
 
     credentials = ['primary']
 
-    @classmethod
-    def skip_checks(cls):
-        super(ScenarioTest, cls).skip_checks()
-        msg = None
-        if not CONF.fwaas.run_fwaas_tests:
-            msg = ("Running of fwaas related tests is disabled in "
-                   "plugin configuration.")
-        if msg:
-            raise cls.skipException(msg)
-
 
 class NetworkScenarioTest(ScenarioTest):
     """Base class for network scenario tests.
diff --git a/neutron_tempest_plugin/plugin.py b/neutron_tempest_plugin/plugin.py
index fc41bdd..029fdab 100644
--- a/neutron_tempest_plugin/plugin.py
+++ b/neutron_tempest_plugin/plugin.py
@@ -16,8 +16,11 @@
 
 import os
 
+from tempest import config
 from tempest.test_discover import plugins
 
+from neutron_tempest_plugin import config as neutron_config
+
 
 class NeutronTempestPlugin(plugins.TempestPlugin):
     def load_tests(self):
@@ -28,7 +31,31 @@
         return full_test_dir, base_path
 
     def register_opts(self, conf):
-        pass
+        config.register_opt_group(conf, neutron_config.neutron_group,
+                                  neutron_config.NeutronPluginOptions)
+        config.register_opt_group(conf, neutron_config.bgpvpn_group,
+                                  neutron_config.BgpvpnGroup)
+        config.register_opt_group(conf, neutron_config.fwaas_group,
+                                  neutron_config.FwaasGroup)
+        config.register_opt_group(conf, neutron_config.taas_group,
+                                  neutron_config.TaasGroup)
+        config.register_opt_group(conf, neutron_config.dynamic_routing_group,
+                                  neutron_config.DynamicRoutingGroup)
+        config.register_opt_group(conf, neutron_config.dns_feature_group,
+                                  neutron_config.DnsFeatureGroup)
 
     def get_opt_lists(self):
-        pass
+        return [
+            (neutron_config.neutron_group.name,
+             neutron_config.NeutronPluginOptions),
+            (neutron_config.bgpvpn_group.name,
+             neutron_config.BgpvpnGroup),
+            (neutron_config.fwaas_group.name,
+             neutron_config.FwaasGroup),
+            (neutron_config.taas_group.name,
+             neutron_config.TaasGroup),
+            (neutron_config.dynamic_routing_group.name,
+             neutron_config.DynamicRoutingGroup),
+            (neutron_config.dns_feature_group.name,
+             neutron_config.DnsFeatureGroup)
+        ]
diff --git a/neutron_tempest_plugin/scenario/test_vlan_transparency.py b/neutron_tempest_plugin/scenario/test_vlan_transparency.py
index 85648bc..11ff510 100644
--- a/neutron_tempest_plugin/scenario/test_vlan_transparency.py
+++ b/neutron_tempest_plugin/scenario/test_vlan_transparency.py
@@ -123,8 +123,8 @@
             self, port_security=True, use_allowed_address_pairs=False):
         self._ensure_ethtype()
         vlan_tag = data_utils.rand_int_id(start=MIN_VLAN_ID, end=MAX_VLAN_ID)
-        vlan_ipmask_template = '192.168.%d.{ip_last_byte}/24' % (vlan_tag %
-                                                                 256)
+        vtag = vlan_tag % 256
+        vlan_ipmask_template = '192.%d.%d.{ip_last_byte}/24' % (vtag, vtag)
         vms = []
         vlan_ipmasks = []
         floating_ips = []
diff --git a/neutron_tempest_plugin/sfc/tests/api/base.py b/neutron_tempest_plugin/sfc/tests/api/base.py
index 606aed6..329bed8 100644
--- a/neutron_tempest_plugin/sfc/tests/api/base.py
+++ b/neutron_tempest_plugin/sfc/tests/api/base.py
@@ -34,16 +34,6 @@
 ):
 
     @classmethod
-    def skip_checks(cls):
-        super(BaseFlowClassifierTest, cls).skip_checks()
-        msg = None
-        if not CONF.sfc.run_sfc_tests:
-            msg = ("Running of SFC related tests is disabled in "
-                   "plugin configuration.")
-        if msg:
-            raise cls.skipException(msg)
-
-    @classmethod
     def resource_setup(cls):
         super(BaseFlowClassifierTest, cls).resource_setup()
         if not utils.is_extension_enabled('flow_classifier', 'network'):
diff --git a/neutron_tempest_plugin/sfc/tests/scenario/base.py b/neutron_tempest_plugin/sfc/tests/scenario/base.py
index 44b5cd2..5945aef 100644
--- a/neutron_tempest_plugin/sfc/tests/scenario/base.py
+++ b/neutron_tempest_plugin/sfc/tests/scenario/base.py
@@ -31,16 +31,6 @@
     manager.NetworkScenarioTest
 ):
 
-    @classmethod
-    def skip_checks(cls):
-        super(SfcScenarioTest, cls).skip_checks()
-        msg = None
-        if not CONF.sfc.run_sfc_tests:
-            msg = ("Running of SFC related tests is disabled in "
-                   "plugin configuration.")
-        if msg:
-            raise cls.skipException(msg)
-
     def _check_connectivity(
         self, source_ip, destination_ip, routes=None,
         username=None, private_key=None
diff --git a/releasenotes/notes/remove-run-tests-opts-152c092bee1dc81d.yaml b/releasenotes/notes/remove-run-tests-opts-152c092bee1dc81d.yaml
new file mode 100644
index 0000000..bd3fb45
--- /dev/null
+++ b/releasenotes/notes/remove-run-tests-opts-152c092bee1dc81d.yaml
@@ -0,0 +1,8 @@
+---
+upgrade:
+  - |
+    The following options have been removed.
+
+    - ``[bgpvpn] run_bgpvpn_tests``
+    - ``[fwaas] run_fwaas_tests``
+    - ``[sfc] run_sfc_tests``
diff --git a/tools/customize_ubuntu_image b/tools/customize_ubuntu_image
index 34b22fe..438d97e 100755
--- a/tools/customize_ubuntu_image
+++ b/tools/customize_ubuntu_image
@@ -69,14 +69,19 @@
     bind_dir "/sys" "${mount_dir}/sys"
     if [ -f /etc/apt/sources.list ]; then
       mirror=$(grep -oP 'https?://\K[^/ ]+' /etc/apt/sources.list|head -1)
-      if [ -f ${mount_dir}/etc/apt/sources.list ]; then
-          source ${mount_dir}/etc/os-release
-          sudo tee ${mount_dir}/etc/apt/sources.list <<EOF
-          deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME} main universe
-          deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-updates main universe
-          deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-backports main universe
-          deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-security main universe
+      if [ -n "${mirror}" ]; then
+          if sudo test -f ${mount_dir}/etc/apt/sources.list.d/ubuntu.sources; then
+              sudo sed -Ei "s|(http[s]?://)([^/]+)|\1${mirror}|g" ${mount_dir}/etc/apt/sources.list.d/ubuntu.sources
+              sudo sed -i "/URIs:/a Trusted: yes" ${mount_dir}/etc/apt/sources.list.d/ubuntu.sources
+          elif sudo test -f ${mount_dir}/etc/apt/sources.list; then
+              source <(sudo cat ${mount_dir}/etc/os-release)
+              sudo tee ${mount_dir}/etc/apt/sources.list <<EOF
+              deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME} main universe
+              deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-updates main universe
+              deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-backports main universe
+              deb [ trusted=yes ] https://${mirror}/ubuntu ${UBUNTU_CODENAME}-security main universe
 EOF
+          fi
       fi
     fi
 
diff --git a/zuul.d/2023_1_jobs.yaml b/zuul.d/2023_1_jobs.yaml
index 0bda403..824c4b2 100644
--- a/zuul.d/2023_1_jobs.yaml
+++ b/zuul.d/2023_1_jobs.yaml
@@ -2,7 +2,11 @@
     name: neutron-tempest-plugin-openvswitch-2023-1
     parent: neutron-tempest-plugin-openvswitch
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: &required-projects-2023-1
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 2023.1-last
+      - openstack/tempest
     vars:
       network_api_extensions_openvswitch:
         - dhcp_agent_scheduler
@@ -107,7 +111,7 @@
     name: neutron-tempest-plugin-openvswitch-iptables_hybrid-2023-1
     parent: neutron-tempest-plugin-openvswitch-iptables_hybrid
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_common: *api_extensions
       network_api_extensions_openvswitch:
@@ -146,7 +150,7 @@
     name: neutron-tempest-plugin-openvswitch-enforce-scope-new-defaults-2023-1
     parent: neutron-tempest-plugin-openvswitch-2023-1
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         # Enabeling the scope and new defaults for services.
@@ -164,7 +168,7 @@
     name: neutron-tempest-plugin-linuxbridge-2023-1
     parent: neutron-tempest-plugin-linuxbridge
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_common: *api_extensions
       network_api_extensions_linuxbridge:
@@ -207,7 +211,7 @@
     name: neutron-tempest-plugin-ovn-2023-1
     parent: neutron-tempest-plugin-ovn
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_ovn:
         - vlan-transparent
@@ -218,9 +222,13 @@
           (^tempest.api.compute.servers.test_multiple_create)"
       # NOTE(liushy): This branch of Neutron does not support
       # the address_group feature for the OVN driver.
+      # NOTE(ralonsoh): The advance image used "ubuntu-22.04-minimal" has a reported issue (LP#2110520)
+      # with the IGMP report messages. Because of that and because ML2/OVN has "igmp_snooping_enable"
+      # set, the receiver VM cannot subscribe to the IGMP group nor receive any IGMP message.
       tempest_exclude_regex: "\
           (^neutron_tempest_plugin.scenario.test_security_groups.StatefulNetworkSecGroupTest.test_remote_group_and_remote_address_group)|\
-          (^neutron_tempest_plugin.scenario.test_security_groups.StatelessNetworkSecGroupIPv4Test.test_remote_group_and_remote_address_group)"
+          (^neutron_tempest_plugin.scenario.test_security_groups.StatelessNetworkSecGroupIPv4Test.test_remote_group_and_remote_address_group)|\
+          (^neutron_tempest_plugin.scenario.test_multicast.MulticastTestIPv4.test_multicast_between_vms_on_same_network)"
       devstack_localrc:
         NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_ovn) | join(',') }}"
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -241,7 +249,7 @@
     name: neutron-tempest-plugin-dvr-multinode-scenario-2023-1
     parent: neutron-tempest-plugin-dvr-multinode-scenario
     nodeset: openstack-two-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_common: *api_extensions
       network_api_extensions_dvr:
@@ -255,7 +263,7 @@
     name: neutron-tempest-plugin-designate-scenario-2023-1
     parent: neutron-tempest-plugin-designate-scenario
     nodeset: neutron-nested-virt-ubuntu-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_common: *api_extensions
       devstack_localrc:
@@ -265,7 +273,7 @@
     name: neutron-tempest-plugin-sfc-2023-1
     parent: neutron-tempest-plugin-sfc
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -274,7 +282,7 @@
     name: neutron-tempest-plugin-bgpvpn-bagpipe-2023-1
     parent: neutron-tempest-plugin-bgpvpn-bagpipe
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -283,7 +291,7 @@
     name: neutron-tempest-plugin-dynamic-routing-2023-1
     parent: neutron-tempest-plugin-dynamic-routing
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -298,7 +306,7 @@
     name: neutron-tempest-plugin-fwaas-2023-1
     parent: neutron-tempest-plugin-fwaas-openvswitch
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -307,7 +315,7 @@
     name: neutron-tempest-plugin-vpnaas-2023-1
     parent: neutron-tempest-plugin-vpnaas
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false
@@ -316,7 +324,7 @@
     name: neutron-tempest-plugin-tap-as-a-service-2023-1
     parent: neutron-tempest-plugin-tap-as-a-service
     nodeset: openstack-single-node-jammy
-    override-checkout: stable/2023.1
+    required-projects: *required-projects-2023-1
     vars:
       network_api_extensions_common: *api_extensions
       network_api_extensions_tempest:
diff --git a/zuul.d/2025_1_jobs.yaml b/zuul.d/2025_1_jobs.yaml
index f1e5b2b..f0c1da5 100644
--- a/zuul.d/2025_1_jobs.yaml
+++ b/zuul.d/2025_1_jobs.yaml
@@ -189,12 +189,12 @@
       # set, the receiver VM cannot subscribe to the IGMP group nor receive any IGMP message.
       # NOTE(ykarel) Known issue in OVN version included in OVN jammy
       # https://bugs.launchpad.net/neutron/+bug/2112620, skipping random failing tests
-      # test_vlan_transparent_allowed_address_pairs
-      # test_packets_of_any_connection_state_can_reach_dest
+      # neutron_tempest_plugin.scenario.test_vlan_transparency
+      # neutron_tempest_plugin.scenario.test_security_groups
       tempest_exclude_regex: "\
         (^neutron_tempest_plugin.scenario.test_multicast.MulticastTestIPv4.test_multicast_between_vms_on_same_network)|\
-        (test_vlan_transparent_allowed_address_pairs)|\
-        (test_packets_of_any_connection_state_can_reach_dest)"
+        (^neutron_tempest_plugin.scenario.test_vlan_transparency)|\
+        (^neutron_tempest_plugin.scenario.test_security_groups)"
 
 - job:
     name: neutron-tempest-plugin-dvr-multinode-scenario-2025-1