Merge "[customize_image] Override infra mirror only if set"
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/zuul.d/2023_1_jobs.yaml b/zuul.d/2023_1_jobs.yaml
index d69054c..9c8439a 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
@@ -241,7 +245,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 +259,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 +269,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 +278,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 +287,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 +302,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 +311,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 +320,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:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false