Merge "Drop explicit description about default values"
diff --git a/neutron_tempest_plugin/api/test_networks.py b/neutron_tempest_plugin/api/test_networks.py
index d79b7ab..b9298c3 100644
--- a/neutron_tempest_plugin/api/test_networks.py
+++ b/neutron_tempest_plugin/api/test_networks.py
@@ -132,8 +132,6 @@
         _check_list_networks_fields(['project_id', 'tenant_id'], True, True)
 
 
-# TODO(ihrachys): check that bad mtu is not allowed; current API extension
-# definition doesn't enforce values
 # TODO(ihrachys): check that new segment reservation updates mtu, once
 # https://review.opendev.org/#/c/353115/ is merged
 class NetworksMtuTestJSON(base.BaseNetworkTest):
diff --git a/neutron_tempest_plugin/api/test_networks_negative.py b/neutron_tempest_plugin/api/test_networks_negative.py
index d4941e4..f0f6995 100644
--- a/neutron_tempest_plugin/api/test_networks_negative.py
+++ b/neutron_tempest_plugin/api/test_networks_negative.py
@@ -43,3 +43,37 @@
         with testtools.ExpectedException(lib_exc.BadRequest):
             self.client.create_network(
                 mtu=CONF.neutron_plugin_options.max_mtu + 1)
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('53537bba-d6c3-4a2e-bda4-ab5b009fb7d9')
+    def test_create_subnet_mtu_below_minimum_ipv4(self):
+        network = self.create_network(mtu=67)
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.create_subnet(network, ip_version=4, cidr='10.0.0.0/24')
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('1de68cb6-e6d4-47df-b820-c5048796f33a')
+    @testtools.skipUnless(config.CONF.network_feature_enabled.ipv6,
+                          'IPv6 is not enabled')
+    def test_create_subnet_mtu_below_minimum_ipv6(self):
+        network = self.create_network(mtu=1279)
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.create_subnet(network, ip_version=6, cidr='2001:db8:0:1::/64')
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('5213df6d-7141-40b2-90ea-a958d9bc97e5')
+    def test_update_network_mtu_below_minimum_ipv4(self):
+        network = self.create_network(mtu=1280)
+        self.create_subnet(network, ip_version=4, cidr='10.0.0.0/24')
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.client.update_network(network['id'], mtu=67)
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('1a714fc4-24b1-4c07-a005-d5c218672eab')
+    @testtools.skipUnless(config.CONF.network_feature_enabled.ipv6,
+                          'IPv6 is not enabled')
+    def test_update_network_mtu_below_minimum_ipv6(self):
+        network = self.create_network(mtu=1280)
+        self.create_subnet(network, ip_version=6, cidr='2001:db8:0:1::/64')
+        with testtools.ExpectedException(lib_exc.Conflict):
+            self.client.update_network(network['id'], mtu=1279)
diff --git a/neutron_tempest_plugin/common/shell.py b/neutron_tempest_plugin/common/shell.py
index 073bf55..723c30e 100644
--- a/neutron_tempest_plugin/common/shell.py
+++ b/neutron_tempest_plugin/common/shell.py
@@ -16,7 +16,6 @@
 
 import collections
 import subprocess
-import sys
 
 from oslo_log import log
 from tempest.lib import exceptions as lib_exc
@@ -131,12 +130,6 @@
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
 
-    if timeout and sys.version_info < (3, 3):
-        # TODO(fressi): re-implement to timeout support on older Pythons
-        LOG.warning("Popen.communicate method doens't support for timeout "
-                    "on Python %r", sys.version)
-        timeout = None
-
     # Wait for process execution while reading STDERR and STDOUT streams
     if timeout:
         try:
diff --git a/neutron_tempest_plugin/scenario/test_multicast.py b/neutron_tempest_plugin/scenario/test_multicast.py
index 390e0f0..a28328b 100644
--- a/neutron_tempest_plugin/scenario/test_multicast.py
+++ b/neutron_tempest_plugin/scenario/test_multicast.py
@@ -333,12 +333,20 @@
                     "Receiver {!r} didn't get multicast message".format(
                         receiver['id'])))
 
-        # TODO(slaweq): add validation of answears on sended server
-        replies_result = sender['ssh_client'].execute_script(
-            "cat {path} || echo '{path} not exists yet'".format(
-                path=self.sender_output_file))
-        for receiver_id in receiver_ids:
-            self.assertIn(receiver_id, replies_result)
+        def _sender_completed():
+            replies_result = sender['ssh_client'].execute_script(
+                "cat {path} 2>/dev/null || echo ''".format(
+                    path=self.sender_output_file))
+            for receiver_id in receiver_ids:
+                expected_pattern = "received reply b'{}' from".format(
+                    receiver_id)
+                if expected_pattern not in replies_result:
+                    return False
+            return replies_result.count('received reply') == len(receiver_ids)
+
+        utils.wait_until_true(
+            _sender_completed,
+            exception=RuntimeError("Sender didn't complete properly"))
 
         def check_unregistered_host():
             unregistered_result = unregistered['ssh_client'].execute_script(
diff --git a/zuul.d/master_jobs.yaml b/zuul.d/master_jobs.yaml
index 96e16b1..4484768 100644
--- a/zuul.d/master_jobs.yaml
+++ b/zuul.d/master_jobs.yaml
@@ -34,8 +34,6 @@
         ADVANCED_INSTANCE_USER: ubuntu
         CUSTOMIZE_IMAGE: true
         BUILD_TIMEOUT: 784
-        # TODO(lucasagomes): Re-enable MOD_WSGI after
-        # https://bugs.launchpad.net/neutron/+bug/1912359 is implemented
         NEUTRON_DEPLOY_MOD_WSGI: true
       devstack_plugins:
         neutron: https://opendev.org/openstack/neutron.git
@@ -1025,7 +1023,6 @@
       - ^neutron/privileged/.*$
       - ^neutron/plugins/ml2/drivers/.*$
       - ^neutron/scheduler/.*$
-      - ^neutron/services/.*$
       - ^neutron_tempest_plugin/api/test_.*$
       - ^neutron_tempest_plugin/api/admin/test_.*$
       - ^neutron_tempest_plugin/(bgpvpn|fwaas|neutron_dynamic_routing|sfc|tap_as_a_service|vpnaas).*$
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
index 1720745..69a380c 100644
--- a/zuul.d/project.yaml
+++ b/zuul.d/project.yaml
@@ -213,14 +213,7 @@
         - neutron-tempest-plugin-bgpvpn-bagpipe-2024-1
         - neutron-tempest-plugin-bgpvpn-bagpipe-2024-2
         - neutron-tempest-plugin-bgpvpn-bagpipe-2025-1
-        - neutron-tempest-plugin-dynamic-routing:
-            # TODO(ralonsoh): this job is temporarily disabled; it will be
-            # restored once [1] is merged. This patch has been successfully
-            # tested in [2]. This job is removed from the gate queue,
-            # thus **remember to restore it in this queue too**.
-            # [1]https://review.opendev.org/c/openstack/neutron/+/941202
-            # [2]https://review.opendev.org/c/openstack/neutron-tempest-plugin/+/940906
-            voting: false
+        - neutron-tempest-plugin-dynamic-routing
         - neutron-tempest-plugin-dynamic-routing-2024-1
         - neutron-tempest-plugin-dynamic-routing-2024-2
         - neutron-tempest-plugin-dynamic-routing-2025-1
@@ -245,5 +238,6 @@
       jobs:
         - neutron-tempest-plugin-sfc
         - neutron-tempest-plugin-bgpvpn-bagpipe
+        - neutron-tempest-plugin-dynamic-routing
         - neutron-tempest-plugin-fwaas-ovn
         - neutron-tempest-plugin-vpnaas-ovn