Merge "Add IPv6 to list_routes and delete_route"
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/config.py b/neutron_tempest_plugin/config.py
index 38d6ac6..cbf593d 100644
--- a/neutron_tempest_plugin/config.py
+++ b/neutron_tempest_plugin/config.py
@@ -165,15 +165,6 @@
     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 "
@@ -198,15 +189,6 @@
 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'],
@@ -218,22 +200,6 @@
 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 = [
     cfg.StrOpt('provider_physical_network',
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/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 d69054c..93a82cf 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:
       devstack_localrc:
         NEUTRON_DEPLOY_MOD_WSGI: false