Merge "Add stable/2025.2 job"
diff --git a/octavia_tempest_plugin/common/decorators.py b/octavia_tempest_plugin/common/decorators.py
index b484497..15c3c17 100644
--- a/octavia_tempest_plugin/common/decorators.py
+++ b/octavia_tempest_plugin/common/decorators.py
@@ -52,3 +52,49 @@
                     message = e.resp_body.get('faultstring', message)
                 raise testtools.TestCase.skipException(message)
     return wrapper
+
+
+def retry_on_port_in_use(start_port, max_retries=3):
+    """Decorator to retry a test function if the specified port is in use.
+
+    This handles cases where a test fails due to a port conflict, typically
+    caused by another service binding the same port on the host. The decorator
+    catches '[Errno 98] Address already in use' errors and retries the test
+    using incrementally higher port numbers.
+
+    The decorated function must accept `port` as its first parameter.
+
+    :param start_port: Initial port to attempt.
+    :param max_retries: Number of retries with incremented port values.
+    """
+    def decorator(func):
+        @wraps(func)
+        def wrapper(self, *args, **kwargs):
+            port = start_port
+            last_exception = None
+
+            for _ in range(max_retries):
+                try:
+                    return func(self, port, *args, **kwargs)
+                except exceptions.NotImplemented as e:
+                    message = (
+                        "The configured provider driver '{driver}' does not "
+                        "support a feature required for this test.".format(
+                            driver=CONF.load_balancer.provider
+                        )
+                    )
+                    if hasattr(e, 'resp_body'):
+                        message = e.resp_body.get('faultstring', message)
+                    raise testtools.TestCase.skipException(message)
+
+                except Exception as e:
+                    if "Address already in use" in str(e):
+                        last_exception = e
+                        port += 1
+                    else:
+                        raise
+
+            raise Exception(f"All port attempts failed after {max_retries} "
+                            f"retries. Last error: {last_exception}")
+        return wrapper
+    return decorator
diff --git a/octavia_tempest_plugin/tests/api/v2/test_listener.py b/octavia_tempest_plugin/tests/api/v2/test_listener.py
index 46735a5..249c1ff 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_listener.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_listener.py
@@ -245,14 +245,26 @@
     def test_http_listener_create(self):
         self._test_listener_create(const.HTTP, 8000)
 
+    @decorators.idempotent_id('4aaf06a4-a9e0-440d-9ff8-d4be13ddea96')
+    def test_http_listener_create_no_allowed_cidrs(self):
+        self._test_listener_create(const.HTTP, 8100, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('2cc89237-fc6b-434d-b38e-b3309823e71f')
     def test_https_listener_create(self):
         self._test_listener_create(const.HTTPS, 8001)
 
+    @decorators.idempotent_id('6085be5d-c49c-4275-87a9-2e256dc2ac9b')
+    def test_https_listener_create_no_allowed_cidrs(self):
+        self._test_listener_create(const.HTTPS, 8101, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('45580065-5653-436b-aaff-dc465fa0a542')
     def test_tcp_listener_create(self):
         self._test_listener_create(const.TCP, 8002)
 
+    @decorators.idempotent_id('f20ab493-d92f-4c86-a053-0d788efaec11')
+    def test_tcp_listener_create_no_allowed_cidrs(self):
+        self._test_listener_create(const.TCP, 8102, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('1a6ba0d0-f309-4088-a686-dda0e9ab7e43')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
@@ -264,6 +276,18 @@
                                      'on Octavia API version 2.25 or newer.')
         self._test_listener_create(const.PROMETHEUS, 8090)
 
+    @decorators.idempotent_id('bfa264ec-c7dc-487a-9437-cb19d7aec7a3')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
+        'PROMETHEUS listener tests are disabled in the tempest configuration.')
+    def test_prometheus_listener_create_no_allowed_cidrs(self):
+        if not self.mem_listener_client.is_version_supported(
+                self.api_version, '2.25'):
+            raise self.skipException('PROMETHEUS listeners are only available '
+                                     'on Octavia API version 2.25 or newer.')
+        self._test_listener_create(const.PROMETHEUS, 8190,
+                                   use_allowed_cidrs=False)
+
     @decorators.idempotent_id('df9861c5-4a2a-4122-8d8f-5556156e343e')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
@@ -276,15 +300,37 @@
                 ' require the either the barbican service,or running in noop.')
         self._test_listener_create(const.TERMINATED_HTTPS, 8095)
 
+    @decorators.idempotent_id('3f91e0f6-e223-48ad-8c6a-b5a608cc8bb3')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
+        '[loadbalancer-feature-enabled] "terminated_tls_enabled" is '
+        'False in the tempest configuration. TLS tests will be skipped.')
+    def test_terminated_https_listener_create_no_allowed_cidrs(self):
+        if not self.should_apply_terminated_https():
+            raise self.skipException(
+                f'Listener API tests with {const.TERMINATED_HTTPS} protocol'
+                ' require the either the barbican service,or running in noop.')
+        self._test_listener_create(const.TERMINATED_HTTPS, 8195,
+                                   use_allowed_cidrs=False)
+
     @decorators.idempotent_id('7b53f336-47bc-45ae-bbd7-4342ef0673fc')
     def test_udp_listener_create(self):
         self._test_listener_create(const.UDP, 8003)
 
+    @decorators.idempotent_id('214a837a-7173-46d9-a83b-a6e80f9295da')
+    def test_udp_listener_create_no_allowed_cidrs(self):
+        self._test_listener_create(const.UDP, 8103, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('d6d36c32-27ff-4977-9d21-fd71a14e3b20')
     def test_sctp_listener_create(self):
         self._test_listener_create(const.SCTP, 8004)
 
-    def _test_listener_create(self, protocol, protocol_port):
+    @decorators.idempotent_id('bc38ac9b-7241-4047-b5aa-815f11359cf2')
+    def test_sctp_listener_create_no_allowed_cidrs(self):
+        self._test_listener_create(const.SCTP, 8104, use_allowed_cidrs=False)
+
+    def _test_listener_create(self, protocol, protocol_port,
+                              use_allowed_cidrs=True):
         """Tests listener create and basic show APIs.
 
         * Tests that users without the loadbalancer member role cannot
@@ -345,7 +391,7 @@
             })
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             # Test that CIDR IP version matches VIP IP version
             bad_cidrs = ['192.0.1.0/24', '2001:db8:a0b:12f0::/64']
             listener_kwargs.update({const.ALLOWED_CIDRS: bad_cidrs})
@@ -448,7 +494,7 @@
                                   listener[const.TAGS])
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             self.assertEqual(self.allowed_cidrs, listener[const.ALLOWED_CIDRS])
 
     @decorators.idempotent_id('cceac303-4db5-4d5a-9f6e-ff33780a5f29')
@@ -679,10 +725,18 @@
     def test_http_listener_list(self):
         self._test_listener_list(const.HTTP, 8020)
 
+    @decorators.idempotent_id('3a753098-2b7c-43f9-b3f2-2be5576ec594')
+    def test_http_listener_list_no_allowed_cidrs(self):
+        self._test_listener_list(const.HTTP, 8120, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('61b7c643-f5fa-4471-8f9e-2e0ccdaf5ac7')
     def test_https_listener_list(self):
         self._test_listener_list(const.HTTPS, 8030)
 
+    @decorators.idempotent_id('e6c05d39-b76a-4245-83c2-0fc889e1e955')
+    def test_https_listener_list_no_allowed_cidrs(self):
+        self._test_listener_list(const.HTTPS, 8130, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('5473e071-8277-4ac5-9277-01ecaf46e274')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
@@ -694,18 +748,42 @@
                                      'on Octavia API version 2.25 or newer.')
         self._test_listener_list(const.PROMETHEUS, 8091)
 
+    @decorators.idempotent_id('71dd1ab0-b203-468e-9333-690847b848ee')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
+        'PROMETHEUS listener tests are disabled in the tempest configuration.')
+    def test_prometheus_listener_list_no_allowed_cidrs(self):
+        if not self.mem_listener_client.is_version_supported(
+                self.api_version, '2.25'):
+            raise self.skipException('PROMETHEUS listeners are only available '
+                                     'on Octavia API version 2.25 or newer.')
+        self._test_listener_list(const.PROMETHEUS, 8191,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('1cd476e2-7788-415e-bcaf-c377acfc9794')
     def test_tcp_listener_list(self):
         self._test_listener_list(const.TCP, 8030)
 
+    @decorators.idempotent_id('bdfe190e-6cee-46ae-a7cf-4acf617339df')
+    def test_tcp_listener_list_no_allowed_cidrs(self):
+        self._test_listener_list(const.TCP, 8130, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('c08fb77e-b317-4d6f-b430-91f5b27ebac6')
     def test_udp_listener_list(self):
         self._test_listener_list(const.UDP, 8040)
 
+    @decorators.idempotent_id('d2fbaf87-8441-4d66-a1c7-f9e2b246a419')
+    def test_udp_listener_list_no_allowed_cidrs(self):
+        self._test_listener_list(const.UDP, 8140, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('0abc3998-aacd-4edd-88f5-c5c35557646f')
     def test_sctp_listener_list(self):
         self._test_listener_list(const.SCTP, 8041)
 
+    @decorators.idempotent_id('b8a52d1a-97c9-4356-abe6-2ac9e90eed0c')
+    def test_sctp_listener_list_no_allowed_cidrs(self):
+        self._test_listener_list(const.SCTP, 8141, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('aed69f58-fe69-401d-bf07-37b0d6d8437f')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
@@ -718,7 +796,21 @@
                 ' require the either the barbican service,or running in noop.')
         self._test_listener_list(const.TERMINATED_HTTPS, 8042)
 
-    def _test_listener_list(self, protocol, protocol_port_base):
+    @decorators.idempotent_id('0f0b5021-245e-42bd-84d5-c089c2028cf5')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
+        '[loadbalancer-feature-enabled] "terminated_tls_enabled" is '
+        'False in the tempest configuration. TLS tests will be skipped.')
+    def test_terminated_https_listener_list_no_allowed_cidrs(self):
+        if not self.should_apply_terminated_https():
+            raise self.skipException(
+                f'Listener API tests with {const.TERMINATED_HTTPS} protocol'
+                ' require the either the barbican service,or running in noop.')
+        self._test_listener_list(const.TERMINATED_HTTPS, 8142,
+                                 use_allowed_cidrs=False)
+
+    def _test_listener_list(self, protocol, protocol_port_base,
+                            use_allowed_cidrs=True):
         """Tests listener list API and field filtering.
 
         * Create a clean loadbalancer.
@@ -1010,7 +1102,7 @@
             show_listener_response_fields.append('timeout_member_data')
             show_listener_response_fields.append('timeout_tcp_inspect')
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             show_listener_response_fields.append('allowed_cidrs')
         if self.mem_listener_client.is_version_supported(
                 self.api_version, '2.27'):
@@ -1098,10 +1190,18 @@
     def test_http_listener_show(self):
         self._test_listener_show(const.HTTP, 8050)
 
+    @decorators.idempotent_id('f852a76d-f41c-48e4-9c73-6f99d49af581')
+    def test_http_listener_show_no_allowed_cidrs(self):
+        self._test_listener_show(const.HTTP, 8150, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('aa838646-435f-4a20-8442-519a7a138e7e')
     def test_https_listener_show(self):
         self._test_listener_show(const.HTTPS, 8051)
 
+    @decorators.idempotent_id('00ff83ca-e286-4080-b9ec-850979e676bb')
+    def test_https_listener_show_no_allowed_cidrs(self):
+        self._test_listener_show(const.HTTPS, 8151, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('b851b754-4333-4115-9063-a9fce44c2e46')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
@@ -1113,18 +1213,42 @@
                                      'on Octavia API version 2.25 or newer.')
         self._test_listener_show(const.PROMETHEUS, 8092)
 
+    @decorators.idempotent_id('6fd0c3ae-d091-4c45-aa72-447581ec7939')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
+        'PROMETHEUS listener tests are disabled in the tempest configuration.')
+    def test_prometheus_listener_show_no_allowed_cidrs(self):
+        if not self.mem_listener_client.is_version_supported(
+                self.api_version, '2.25'):
+            raise self.skipException('PROMETHEUS listeners are only available '
+                                     'on Octavia API version 2.25 or newer.')
+        self._test_listener_show(const.PROMETHEUS, 8192,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('1fcbbee2-b697-4890-b6bf-d308ac1c94cd')
     def test_tcp_listener_show(self):
         self._test_listener_show(const.TCP, 8052)
 
+    @decorators.idempotent_id('916d36b8-9211-4a4f-aa84-3ed38477afd3')
+    def test_tcp_listener_show_no_allowed_cidrs(self):
+        self._test_listener_show(const.TCP, 8152, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('1dea3a6b-c95b-4e91-b591-1aa9cbcd0d1d')
     def test_udp_listener_show(self):
         self._test_listener_show(const.UDP, 8053)
 
+    @decorators.idempotent_id('38201807-28d0-4e29-9796-58db3280484f')
+    def test_udp_listener_show_no_allowed_cidrs(self):
+        self._test_listener_show(const.UDP, 8153, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('10992529-1d0a-47a3-855c-3dbcd868db4e')
     def test_sctp_listener_show(self):
         self._test_listener_show(const.SCTP, 8054)
 
+    @decorators.idempotent_id('6755f564-c8b1-40a1-8514-4893feb6e54d')
+    def test_sctp_listener_show_no_allowed_cidrs(self):
+        self._test_listener_show(const.SCTP, 8154, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('2c2e7146-0efc-44b6-8401-f1c69c2422fe')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
@@ -1137,7 +1261,21 @@
                 ' require the either the barbican service,or running in noop.')
         self._test_listener_show(const.TERMINATED_HTTPS, 8055)
 
-    def _test_listener_show(self, protocol, protocol_port):
+    @decorators.idempotent_id('9d7bd568-cc8b-49fe-bfed-f612944bd489')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
+        '[loadbalancer-feature-enabled] "terminated_tls_enabled" is '
+        'False in the tempest configuration. TLS tests will be skipped.')
+    def test_terminated_https_listener_show_no_allowed_cidrs(self):
+        if not self.should_apply_terminated_https():
+            raise self.skipException(
+                f'Listener API tests with {const.TERMINATED_HTTPS} protocol'
+                ' require the either the barbican service,or running in noop.')
+        self._test_listener_show(const.TERMINATED_HTTPS, 8155,
+                                 use_allowed_cidrs=False)
+
+    def _test_listener_show(self, protocol, protocol_port,
+                            use_allowed_cidrs=True):
         """Tests listener show API.
 
         * Create a fully populated listener.
@@ -1199,7 +1337,7 @@
             })
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             listener_kwargs.update({const.ALLOWED_CIDRS: self.allowed_cidrs})
 
         listener = self.mem_listener_client.create_listener(**listener_kwargs)
@@ -1274,7 +1412,7 @@
             self.assertEqual(const.ONLINE, listener[const.OPERATING_STATUS])
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             self.assertEqual(self.allowed_cidrs, listener[const.ALLOWED_CIDRS])
 
         if hsts_supported:
@@ -1299,10 +1437,18 @@
     def test_http_listener_update(self):
         self._test_listener_update(const.HTTP, 8060)
 
+    @decorators.idempotent_id('8ee610b6-af92-4a59-8332-370b4d529250')
+    def test_http_listener_update_no_allowed_cidrs(self):
+        self._test_listener_update(const.HTTP, 8160, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('9679b061-2b2c-469f-abd9-26ed140ef001')
     def test_https_listener_update(self):
         self._test_listener_update(const.HTTPS, 8061)
 
+    @decorators.idempotent_id('cae9f1e2-c395-427a-a150-26ef864d6e83')
+    def test_https_listener_update_no_allowed_cidrs(self):
+        self._test_listener_update(const.HTTPS, 8161, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('cbba6bf8-9184-4da5-95e9-5efe1f89ddf0')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
@@ -1314,18 +1460,42 @@
                                      'on Octavia API version 2.25 or newer.')
         self._test_listener_update(const.PROMETHEUS, 8093)
 
+    @decorators.idempotent_id('cbc8ffa9-750f-4050-938a-555594f76916')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.prometheus_listener_enabled,
+        'PROMETHEUS listener tests are disabled in the tempest configuration.')
+    def test_prometheus_listener_update_no_allowed_cidrs(self):
+        if not self.mem_listener_client.is_version_supported(
+                self.api_version, '2.25'):
+            raise self.skipException('PROMETHEUS listeners are only available '
+                                     'on Octavia API version 2.25 or newer.')
+        self._test_listener_update(const.PROMETHEUS, 8193,
+                                   use_allowed_cidrs=False)
+
     @decorators.idempotent_id('8d933121-db03-4ccc-8b77-4e879064a9ba')
     def test_tcp_listener_update(self):
         self._test_listener_update(const.TCP, 8062)
 
+    @decorators.idempotent_id('64b20147-59f0-4ce5-9390-d03767ae12c4')
+    def test_tcp_listener_update_no_allowed_cidrs(self):
+        self._test_listener_update(const.TCP, 8162, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('fd02dbfd-39ce-41c2-b181-54fc7ad91707')
     def test_udp_listener_update(self):
         self._test_listener_update(const.UDP, 8063)
 
+    @decorators.idempotent_id('1cf09eeb-c983-4dd6-b5d3-d36fb61830b2')
+    def test_udp_listener_update_no_allowed_cidrs(self):
+        self._test_listener_update(const.UDP, 8163, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('c590b485-4e08-4e49-b384-2282b3f6f1b9')
     def test_sctp_listener_update(self):
         self._test_listener_update(const.SCTP, 8064)
 
+    @decorators.idempotent_id('818d840a-c1e9-426b-92b9-c5131df2ba4f')
+    def test_sctp_listener_update_no_allowed_cidrs(self):
+        self._test_listener_update(const.SCTP, 8164, use_allowed_cidrs=False)
+
     @decorators.idempotent_id('2ae08e10-fbf8-46d8-a073-15f90454d718')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
@@ -1338,7 +1508,21 @@
                 ' require the either the barbican service,or running in noop.')
         self._test_listener_update(const.TERMINATED_HTTPS, 8065)
 
-    def _test_listener_update(self, protocol, protocol_port):
+    @decorators.idempotent_id('32e88736-6ba1-4d14-83ef-ebdb3e3950e4')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
+        '[loadbalancer-feature-enabled] "terminated_tls_enabled" is '
+        'False in the tempest configuration. TLS tests will be skipped.')
+    def test_terminated_https_listener_update_no_allowed_cidrs(self):
+        if not self.should_apply_terminated_https():
+            raise self.skipException(
+                f'Listener API tests with {const.TERMINATED_HTTPS} protocol'
+                ' require the either the barbican service,or running in noop.')
+        self._test_listener_update(const.TERMINATED_HTTPS, 8165,
+                                   use_allowed_cidrs=False)
+
+    def _test_listener_update(self, protocol, protocol_port,
+                              use_allowed_cidrs=True):
         """Tests listener update and show APIs.
 
         * Create a fully populated listener.
@@ -1398,7 +1582,7 @@
             })
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             listener_kwargs.update({const.ALLOWED_CIDRS: self.allowed_cidrs})
 
         listener = self.mem_listener_client.create_listener(**listener_kwargs)
@@ -1459,7 +1643,7 @@
                                   listener[const.TAGS])
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             self.assertEqual(self.allowed_cidrs, listener[const.ALLOWED_CIDRS])
 
         # Test that a user without the loadbalancer role cannot
@@ -1514,7 +1698,7 @@
             })
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             # Test that CIDR IP version matches VIP IP version
             bad_cidrs = ['192.0.2.0/24', '2001:db8::/6']
             listener_update_kwargs.update({const.ALLOWED_CIDRS: bad_cidrs})
@@ -1592,7 +1776,7 @@
                                   listener[const.TAGS])
 
         if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+                self.api_version, '2.12') and use_allowed_cidrs:
             expected_cidrs = ['192.0.2.0/24']
             if CONF.load_balancer.test_with_ipv6:
                 expected_cidrs = ['2001:db8::/64']
@@ -1716,22 +1900,47 @@
     def test_http_listener_show_stats(self):
         self._test_listener_show_stats(const.HTTP, 8080)
 
+    @decorators.idempotent_id('2a97a5f3-f05c-447c-80a7-326efcf31ab2')
+    def test_http_listener_show_stats_no_allowed_cidrs(self):
+        self._test_listener_show_stats(const.HTTP, 8180,
+                                       use_allowed_cidrs=False)
+
     @decorators.idempotent_id('f8a43c27-f0a0-496d-a287-1958f337ac04')
     def test_https_listener_show_stats(self):
         self._test_listener_show_stats(const.HTTPS, 8081)
 
+    @decorators.idempotent_id('9766962d-6819-4cb7-944a-899fef3fa241')
+    def test_https_listener_show_stats_no_allowed_cidrs(self):
+        self._test_listener_show_stats(const.HTTPS, 8181,
+                                       use_allowed_cidrs=False)
+
     @decorators.idempotent_id('8a999856-f448-498c-b891-21af449b5208')
     def test_tcp_listener_show_stats(self):
         self._test_listener_show_stats(const.TCP, 8082)
 
+    @decorators.idempotent_id('6afaea72-f4ed-4f15-a1c3-57ed16f12068')
+    def test_tcp_listener_show_stats_no_allowed_cidrs(self):
+        self._test_listener_show_stats(const.TCP, 8182,
+                                       use_allowed_cidrs=False)
+
     @decorators.idempotent_id('a4c1f199-923b-41e4-a134-c91e590e20c4')
     def test_udp_listener_show_stats(self):
         self._test_listener_show_stats(const.UDP, 8083)
 
+    @decorators.idempotent_id('45a120c4-9bd1-4032-ae5e-9b6458598b3d')
+    def test_udp_listener_show_stats_no_allowed_cidrs(self):
+        self._test_listener_show_stats(const.UDP, 8183,
+                                       use_allowed_cidrs=False)
+
     @decorators.idempotent_id('7f6d3906-529c-4b99-8376-b836059df220')
     def test_sctp_listener_show_stats(self):
         self._test_listener_show_stats(const.SCTP, 8084)
 
+    @decorators.idempotent_id('460f2308-9411-4ab2-9b9e-23fe87c9dec3')
+    def test_sctp_listener_show_stats_no_allowed_cidrs(self):
+        self._test_listener_show_stats(const.SCTP, 8184,
+                                       use_allowed_cidrs=False)
+
     @decorators.idempotent_id('c39c996f-9633-4d81-a5f1-e94643f0c650')
     @testtools.skipUnless(
         CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
@@ -1744,7 +1953,21 @@
                 ' require the either the barbican service,or running in noop.')
         self._test_listener_show_stats(const.TERMINATED_HTTPS, 8085)
 
-    def _test_listener_show_stats(self, protocol, protocol_port):
+    @decorators.idempotent_id('a402f84c-a29e-4e24-8ef6-f7eb8b0ffc46')
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.terminated_tls_enabled,
+        '[loadbalancer-feature-enabled] "terminated_tls_enabled" is '
+        'False in the tempest configuration. TLS tests will be skipped.')
+    def test_terminated_https_listener_show_stats_no_allowed_cidrs(self):
+        if not self.should_apply_terminated_https():
+            raise self.skipException(
+                f'Listener API tests with {const.TERMINATED_HTTPS} protocol'
+                ' require the either the barbican service,or running in noop.')
+        self._test_listener_show_stats(const.TERMINATED_HTTPS, 8085,
+                                       use_allowed_cidrs=False)
+
+    def _test_listener_show_stats(self, protocol, protocol_port,
+                                  use_allowed_cidrs=True):
         """Tests listener show statistics API.
 
         * Create a listener.
@@ -1776,6 +1999,10 @@
                                            self.SNI2_secret_ref],
             })
 
+        if self.mem_listener_client.is_version_supported(
+                self.api_version, '2.12') and use_allowed_cidrs:
+            listener_kwargs.update({const.ALLOWED_CIDRS: self.allowed_cidrs})
+
         listener = self.mem_listener_client.create_listener(**listener_kwargs)
         self.addCleanup(
             self.mem_listener_client.cleanup_listener,
diff --git a/octavia_tempest_plugin/tests/scenario/v2/test_listener.py b/octavia_tempest_plugin/tests/scenario/v2/test_listener.py
index be997aa..74514f2 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_listener.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_listener.py
@@ -118,54 +118,117 @@
                                           const.LB_ALGORITHM_LEAST_CONNECTIONS)
         self._test_listener_CRUD(const.HTTP, pool1, pool2)
 
+    @decorators.idempotent_id('d6d729ba-b03f-496c-8e0f-53704cd4994d')
+    def test_http_least_connections_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.HTTP,
+                                          const.LB_ALGORITHM_LEAST_CONNECTIONS)
+        self._test_listener_CRUD(const.HTTP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('0681b2ac-8301-4e6c-bf29-b35244864af3')
     def test_tcp_least_connections_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.TCP,
                                           const.LB_ALGORITHM_LEAST_CONNECTIONS)
         self._test_listener_CRUD(const.TCP, pool1, pool2)
 
+    @decorators.idempotent_id('10c5ecc8-533d-403c-9eb1-e3ca83586781')
+    def test_tcp_least_connections_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.TCP,
+                                          const.LB_ALGORITHM_LEAST_CONNECTIONS)
+        self._test_listener_CRUD(const.TCP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('27a2ba7d-6147-46e4-886a-47c1ba63bf89')
     def test_udp_least_connections_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.UDP,
                                           const.LB_ALGORITHM_LEAST_CONNECTIONS)
         self._test_listener_CRUD(const.UDP, pool1, pool2)
 
+    @decorators.idempotent_id('76776488-b38d-418e-9804-e0be4a443b51')
+    def test_udp_least_connections_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.UDP,
+                                          const.LB_ALGORITHM_LEAST_CONNECTIONS)
+        self._test_listener_CRUD(const.UDP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('4a874014-b7d1-49a4-ac9a-2400b3434700')
     def test_http_round_robin_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.HTTP,
                                           const.LB_ALGORITHM_ROUND_ROBIN)
         self._test_listener_CRUD(const.HTTP, pool1, pool2)
 
+    @decorators.idempotent_id('a2d8e2ca-5104-41b0-b011-819782e01054')
+    def test_http_round_robin_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.HTTP,
+                                          const.LB_ALGORITHM_ROUND_ROBIN)
+        self._test_listener_CRUD(const.HTTP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('2b888812-d916-44f0-b620-8d83dbb45975')
     def test_tcp_round_robin_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.TCP,
                                           const.LB_ALGORITHM_ROUND_ROBIN)
         self._test_listener_CRUD(const.TCP, pool1, pool2)
 
+    @decorators.idempotent_id('1b2bfce6-29f9-4af6-87f2-329654c03c3d')
+    def test_tcp_round_robin_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.TCP,
+                                          const.LB_ALGORITHM_ROUND_ROBIN)
+        self._test_listener_CRUD(const.TCP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('dd913f74-c6a6-4998-9bed-095babb9cb47')
     def test_udp_round_robin_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.UDP,
                                           const.LB_ALGORITHM_ROUND_ROBIN)
         self._test_listener_CRUD(const.UDP, pool1, pool2)
 
+    @decorators.idempotent_id('4a938409-eb79-4a9b-b003-44115153163d')
+    def test_udp_round_robin_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.UDP,
+                                          const.LB_ALGORITHM_ROUND_ROBIN)
+        self._test_listener_CRUD(const.UDP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('b2ae8604-7a4f-477c-9658-fac27734671a')
     def test_http_source_ip_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.HTTP,
                                           const.LB_ALGORITHM_SOURCE_IP)
         self._test_listener_CRUD(const.HTTP, pool1, pool2)
 
+    @decorators.idempotent_id('baa747b1-0b3c-4f56-a1d1-b5550ec69c6e')
+    def test_http_source_ip_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.HTTP,
+                                          const.LB_ALGORITHM_SOURCE_IP)
+        self._test_listener_CRUD(const.HTTP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('0ad3fdee-e8c2-4c44-9690-b8a838fbc7a5')
     def test_tcp_source_ip_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.TCP,
                                           const.LB_ALGORITHM_SOURCE_IP)
         self._test_listener_CRUD(const.TCP, pool1, pool2)
 
+    @decorators.idempotent_id('3778e729-8c5b-4634-876a-8bacba0976c2')
+    def test_tcp_source_ip_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.TCP,
+                                          const.LB_ALGORITHM_SOURCE_IP)
+        self._test_listener_CRUD(const.TCP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('7830aba8-12ca-40d9-9d9b-a63f7a43b287')
     def test_udp_source_ip_listener_CRUD(self):
         pool1, pool2 = self._create_pools(const.UDP,
                                           const.LB_ALGORITHM_SOURCE_IP)
         self._test_listener_CRUD(const.UDP, pool1, pool2)
 
+    @decorators.idempotent_id('8d98b27b-f775-4f1b-8b74-88ec2e60e39f')
+    def test_udp_source_ip_listener_CRUD_no_allowed_cidrs(self):
+        pool1, pool2 = self._create_pools(const.UDP,
+                                          const.LB_ALGORITHM_SOURCE_IP)
+        self._test_listener_CRUD(const.UDP, pool1, pool2,
+                                 use_allowed_cidrs=False)
+
     @decorators.idempotent_id('807a421e-5e99-4556-b0eb-512d39b25eac')
     def test_http_source_ip_port_listener_CRUD(self):
         try:
@@ -180,6 +243,21 @@
                 message = e.resp_body.get('faultstring', message)
             raise testtools.TestCase.skipException(message)
 
+    @decorators.idempotent_id('1d522a51-4fa0-4b8e-9f72-292e0f145bf1')
+    def test_http_source_ip_port_listener_CRUD_no_allowed_cidrs(self):
+        try:
+            pool1, pool2 = self._create_pools(
+                const.HTTP, const.LB_ALGORITHM_SOURCE_IP_PORT)
+            self._test_listener_CRUD(const.HTTP, pool1, pool2,
+                                     use_allowed_cidrs=False)
+        except exceptions.NotImplemented as e:
+            message = ("The configured provider driver '{driver}' "
+                       "does not support a feature required for this "
+                       "test.".format(driver=CONF.load_balancer.provider))
+            if hasattr(e, 'resp_body'):
+                message = e.resp_body.get('faultstring', message)
+            raise testtools.TestCase.skipException(message)
+
     @decorators.idempotent_id('6211f8ad-622d-404d-b199-8c2eb55ab340')
     def test_tcp_source_ip_port_listener_CRUD(self):
         try:
@@ -194,6 +272,21 @@
                 message = e.resp_body.get('faultstring', message)
             raise testtools.TestCase.skipException(message)
 
+    @decorators.idempotent_id('a66d32f9-2186-437e-a145-139f5a1b0786')
+    def test_tcp_source_ip_port_listener_CRUD_no_allowed_cidrs(self):
+        try:
+            pool1, pool2 = self._create_pools(
+                const.TCP, const.LB_ALGORITHM_SOURCE_IP_PORT)
+            self._test_listener_CRUD(const.TCP, pool1, pool2,
+                                     use_allowed_cidrs=False)
+        except exceptions.NotImplemented as e:
+            message = ("The configured provider driver '{driver}' "
+                       "does not support a feature required for this "
+                       "test.".format(driver=CONF.load_balancer.provider))
+            if hasattr(e, 'resp_body'):
+                message = e.resp_body.get('faultstring', message)
+            raise testtools.TestCase.skipException(message)
+
     @decorators.idempotent_id('3f9a2de9-5012-437d-a907-a25e1f68ccfb')
     def test_udp_source_ip_port_listener_CRUD(self):
         try:
@@ -208,7 +301,23 @@
                 message = e.resp_body.get('faultstring', message)
             raise testtools.TestCase.skipException(message)
 
-    def _test_listener_CRUD(self, protocol, pool1_id, pool2_id):
+    @decorators.idempotent_id('dff6d829-9122-47cb-9ce5-f2def7fcf902')
+    def test_udp_source_ip_port_listener_CRUD_no_allowed_cidrs(self):
+        try:
+            pool1, pool2 = self._create_pools(
+                const.UDP, const.LB_ALGORITHM_SOURCE_IP_PORT)
+            self._test_listener_CRUD(const.UDP, pool1, pool2,
+                                     use_allowed_cidrs=False)
+        except exceptions.NotImplemented as e:
+            message = ("The configured provider driver '{driver}' "
+                       "does not support a feature required for this "
+                       "test.".format(driver=CONF.load_balancer.provider))
+            if hasattr(e, 'resp_body'):
+                message = e.resp_body.get('faultstring', message)
+            raise testtools.TestCase.skipException(message)
+
+    def _test_listener_CRUD(self, protocol, pool1_id, pool2_id,
+                            use_allowed_cidrs=True):
         """Tests listener create, read, update, delete
 
         * Create a fully populated listener.
@@ -249,8 +358,9 @@
                 const.TIMEOUT_MEMBER_DATA: 1000,
                 const.TIMEOUT_TCP_INSPECT: 50,
             })
-        if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+        if (use_allowed_cidrs and
+                self.mem_listener_client.is_version_supported(
+                    self.api_version, '2.12')):
             listener_kwargs.update({const.ALLOWED_CIDRS: self.allowed_cidrs})
 
         listener = self.mem_listener_client.create_listener(**listener_kwargs)
@@ -295,8 +405,9 @@
             self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_CONNECT])
             self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_DATA])
             self.assertEqual(50, listener[const.TIMEOUT_TCP_INSPECT])
-        if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+        if (use_allowed_cidrs and
+                self.mem_listener_client.is_version_supported(
+                    self.api_version, '2.12')):
             self.assertEqual(self.allowed_cidrs, listener[const.ALLOWED_CIDRS])
 
         # Listener update
@@ -328,9 +439,9 @@
                 const.TIMEOUT_MEMBER_DATA: 2000,
                 const.TIMEOUT_TCP_INSPECT: 100,
             })
-
-        if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+        if (use_allowed_cidrs and
+                self.mem_listener_client.is_version_supported(
+                    self.api_version, '2.12')):
             new_cidrs = ['192.0.2.0/24']
             if CONF.load_balancer.test_with_ipv6:
                 new_cidrs = ['2001:db8::/64']
@@ -382,8 +493,9 @@
             self.assertEqual(2000, listener[const.TIMEOUT_MEMBER_CONNECT])
             self.assertEqual(2000, listener[const.TIMEOUT_MEMBER_DATA])
             self.assertEqual(100, listener[const.TIMEOUT_TCP_INSPECT])
-        if self.mem_listener_client.is_version_supported(
-                self.api_version, '2.12'):
+        if (use_allowed_cidrs and
+                self.mem_listener_client.is_version_supported(
+                    self.api_version, '2.12')):
             expected_cidrs = ['192.0.2.0/24']
             if CONF.load_balancer.test_with_ipv6:
                 expected_cidrs = ['2001:db8::/64']
diff --git a/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py b/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
index db92352..9cf77ac 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
@@ -27,6 +27,7 @@
 from tempest.lib import exceptions
 
 from octavia_tempest_plugin.common import constants as const
+from octavia_tempest_plugin.common.decorators import retry_on_port_in_use
 from octavia_tempest_plugin.tests import test_base
 from octavia_tempest_plugin.tests import waiters
 
@@ -912,17 +913,18 @@
     @testtools.skipIf(CONF.load_balancer.test_with_noop,
                       'Traffic tests will not work in noop mode.')
     @decorators.idempotent_id('a446585b-5651-40ce-a4db-cb2ab4d37c03')
-    def test_source_ip_port_http_traffic(self):
+    @retry_on_port_in_use(start_port=60091)
+    def test_source_ip_port_http_traffic(self, port):
         # This is a special case as the reference driver does not support
         # this test. Since it runs with not_implemented_is_error, we must
         # handle this test case special.
         try:
             pool_id = self._listener_pool_create(
-                const.HTTP, 60091,
+                const.HTTP, port,
                 pool_algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)[1]
             self._test_basic_traffic(
-                const.HTTP, 60091, pool_id,
-                traffic_member_count=1, persistent=False, source_port=60091)
+                const.HTTP, port, pool_id,
+                traffic_member_count=1, persistent=False, source_port=port)
         except exceptions.NotImplemented as e:
             message = ("The configured provider driver '{driver}' "
                        "does not support a feature required for this "
@@ -934,19 +936,20 @@
     @testtools.skipIf(CONF.load_balancer.test_with_noop,
                       'Traffic tests will not work in noop mode.')
     @decorators.idempotent_id('60108f30-d870-487c-ab96-8d8a9b587b94')
-    def test_source_ip_port_tcp_traffic(self):
+    @retry_on_port_in_use(start_port=60092)
+    def test_source_ip_port_tcp_traffic(self, port):
         # This is a special case as the reference driver does not support
         # this test. Since it runs with not_implemented_is_error, we must
         # handle this test case special.
         try:
             listener_id, pool_id = self._listener_pool_create(
-                const.TCP, 60092,
+                const.TCP, port,
                 pool_algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
             # Without a delay this can trigger a "Cannot assign requested
             # address" warning setting the source port, leading to failure
             self._test_basic_traffic(
-                const.TCP, 60092, pool_id, traffic_member_count=1,
-                persistent=False, source_port=60092, delay=0.2)
+                const.TCP, port, pool_id, traffic_member_count=1,
+                persistent=False, source_port=port, delay=0.2)
         except exceptions.NotImplemented as e:
             message = ("The configured provider driver '{driver}' "
                        "does not support a feature required for this "
diff --git a/octavia_tempest_plugin/tests/validators.py b/octavia_tempest_plugin/tests/validators.py
index 5ff7bd5..57ba2e2 100644
--- a/octavia_tempest_plugin/tests/validators.py
+++ b/octavia_tempest_plugin/tests/validators.py
@@ -113,6 +113,8 @@
                     session.close()
                 raise
             except Exception as e:
+                if "[Errno 98] Address already in use" in str(e):
+                    raise e
                 LOG.info('Validate URL got exception: %s. '
                          'Retrying.', e)
                 time.sleep(request_interval)
@@ -410,8 +412,10 @@
                               response_counts)
                     time.sleep(1)
                     return
-            except Exception:
+            except Exception as e:
                 LOG.warning('Server is not passing initial traffic. Waiting.')
+                if "[Errno 98] Address already in use" in str(e):
+                    raise e
             time.sleep(request_interval)
 
         LOG.debug('Loadbalancer wait for load balancer response totals: %s',
diff --git a/tox.ini b/tox.ini
index d8c77d6..a4649bf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -10,7 +10,7 @@
 setenv =
    VIRTUAL_ENV={envdir}
    PYTHONWARNINGS=default::DeprecationWarning
-deps = -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
        -r{toxinidir}/test-requirements.txt
 commands =
   stestr run {posargs}
@@ -43,7 +43,8 @@
 
 [testenv:docs]
 deps =
-    -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+    -r{toxinidir}/requirements.txt
     -r{toxinidir}/test-requirements.txt
     -r{toxinidir}/doc/requirements.txt
 allowlist_externals = rm
@@ -63,7 +64,7 @@
 
 [testenv:releasenotes]
 deps =
-    -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
+    -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/doc/requirements.txt
 commands =
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index e62c5fd..ec5c623 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -1,14 +1,4 @@
 - nodeset:
-    name: octavia-single-node-ubuntu-bionic
-    nodes:
-      - name: controller
-        label: nested-virt-ubuntu-bionic
-    groups:
-      - name: tempest
-        nodes:
-          - controller
-
-- nodeset:
     name: octavia-single-node-ubuntu-focal
     nodes:
       - name: controller
@@ -39,26 +29,6 @@
           - controller
 
 - nodeset:
-    name: octavia-single-node-centos-8
-    nodes:
-      - name: controller
-        label: nested-virt-centos-8
-    groups:
-      - name: tempest
-        nodes:
-          - controller
-
-- nodeset:
-    name: octavia-single-node-centos-8-stream
-    nodes:
-      - name: controller
-        label: nested-virt-centos-8-stream
-    groups:
-      - name: tempest
-        nodes:
-          - controller
-
-- nodeset:
     name: octavia-single-node-centos-9-stream
     nodes:
       - name: controller
@@ -140,13 +110,6 @@
               debug: True
       devstack_services:
         c-bak: false
-        ceilometer-acentral: false
-        ceilometer-acompute: false
-        ceilometer-alarm-evaluator: false
-        ceilometer-alarm-notifier: false
-        ceilometer-anotification: false
-        ceilometer-api: false
-        ceilometer-collector: false
         c-sch: false
         c-api: false
         c-vol: false
@@ -197,13 +160,6 @@
               debug: True
       devstack_services:
         c-bak: false
-        ceilometer-acentral: false
-        ceilometer-acompute: false
-        ceilometer-alarm-evaluator: false
-        ceilometer-alarm-notifier: false
-        ceilometer-anotification: false
-        ceilometer-api: false
-        ceilometer-collector: false
         c-sch: false
         c-api: false
         c-vol: false
@@ -583,18 +539,6 @@
               RBAC_test_type: advanced
 
 - job:
-    name: octavia-v2-dsvm-noop-api-stable-2023-2
-    parent: octavia-v2-dsvm-noop-api
-    nodeset: octavia-single-node-ubuntu-jammy
-    override-checkout: stable/2023.2
-    vars:
-      devstack_local_conf:
-        test-config:
-          "$TEMPEST_CONFIG":
-            load_balancer:
-              RBAC_test_type: advanced
-
-- job:
     name: octavia-v2-dsvm-scenario-base
     parent: octavia-dsvm-live-base
     vars:
@@ -625,14 +569,14 @@
     name: octavia-v2-dsvm-scenario
     parent: octavia-v2-dsvm-scenario-base
     branches:
-      regex: ^(unmaintained/|stable/(2023.2|2024.1|2024.2))
+      regex: ^(unmaintained/|stable/(2024.1|2024.2))
       negate: true
     nodeset: octavia-single-node-ubuntu-noble
 
 - job:
     name: octavia-v2-dsvm-scenario
     parent: octavia-v2-dsvm-scenario-base
-    branches: ^(stable/(2023.2|2024.1|2024.2))
+    branches: ^(stable/(2024.1|2024.2))
     nodeset: octavia-single-node-ubuntu-jammy
 
 - job:
@@ -764,30 +708,6 @@
     vars:
       tempest_test_regex: ^octavia_tempest_plugin.tests.scenario.v2.(?!.*traffic_ops)
 
-- job:
-    name: octavia-v2-dsvm-scenario-stable-2023-2
-    parent: octavia-v2-dsvm-scenario
-    nodeset: octavia-single-node-ubuntu-jammy
-    override-checkout: stable/2023.2
-    vars:
-      devstack_local_conf:
-        test-config:
-          "$TEMPEST_CONFIG":
-            load_balancer:
-              RBAC_test_type: advanced
-
-- job:
-    name: octavia-v2-dsvm-scenario-traffic-ops-stable-2023-2
-    parent: octavia-v2-dsvm-scenario-stable-2023-2
-    vars:
-      tempest_test_regex: ^octavia_tempest_plugin.tests.scenario.v2.*traffic_ops
-
-- job:
-    name: octavia-v2-dsvm-scenario-non-traffic-ops-stable-2023-2
-    parent: octavia-v2-dsvm-scenario-stable-2023-2
-    vars:
-      tempest_test_regex: ^octavia_tempest_plugin.tests.scenario.v2.(?!.*traffic_ops)
-
 # Legacy jobs for the transition to the act-stdby two node jobs
 - job:
     name: octavia-v2-dsvm-scenario-two-node
@@ -854,26 +774,6 @@
                 loadbalancer_topology: ACTIVE_STANDBY
 
 - job:
-    name: octavia-v2-dsvm-scenario-centos-8
-    parent: octavia-v2-dsvm-scenario
-    nodeset: octavia-single-node-centos-8
-    vars:
-      devstack_localrc:
-        OCTAVIA_AMP_BASE_OS: centos
-        OCTAVIA_AMP_DISTRIBUTION_RELEASE_ID: 8
-        OCTAVIA_AMP_IMAGE_SIZE: 3
-
-- job:
-    name: octavia-v2-dsvm-scenario-centos-8-stream
-    parent: octavia-v2-dsvm-scenario
-    nodeset: octavia-single-node-centos-8-stream
-    vars:
-      devstack_localrc:
-        OCTAVIA_AMP_BASE_OS: centos
-        OCTAVIA_AMP_DISTRIBUTION_RELEASE_ID: 8-stream
-        OCTAVIA_AMP_IMAGE_SIZE: 3
-
-- job:
     name: octavia-v2-dsvm-scenario-centos-9-stream
     parent: octavia-v2-dsvm-scenario
     nodeset: octavia-single-node-centos-9-stream
@@ -975,14 +875,14 @@
     name: octavia-v2-dsvm-tls-barbican
     parent: octavia-v2-dsvm-tls-barbican-base
     branches:
-      regex: ^(unmaintained/|stable/(2023.2|2024.1|2024.2))
+      regex: ^(unmaintained/|stable/(2024.1|2024.2))
       negate: true
     nodeset: octavia-single-node-ubuntu-noble
 
 - job:
     name: octavia-v2-dsvm-tls-barbican
     parent: octavia-v2-dsvm-tls-barbican-base
-    branches: ^(stable/(2023.2|2024.1|2024.2))
+    branches: ^(stable/(2024.1|2024.2))
     nodeset: octavia-single-node-ubuntu-jammy
 
 - job:
@@ -1022,18 +922,6 @@
               RBAC_test_type: advanced
 
 - job:
-    name: octavia-v2-dsvm-tls-barbican-stable-2023-2
-    parent: octavia-v2-dsvm-tls-barbican
-    nodeset: octavia-single-node-ubuntu-jammy
-    override-checkout: stable/2023.2
-    vars:
-      devstack_local_conf:
-        test-config:
-          "$TEMPEST_CONFIG":
-            load_balancer:
-              RBAC_test_type: advanced
-
-- job:
     name: octavia-v2-dsvm-spare-pool
     parent: octavia-v2-dsvm-scenario
     vars:
@@ -1079,13 +967,6 @@
               volume_size: 2
       devstack_services:
         c-bak: true
-        ceilometer-acentral: false
-        ceilometer-acompute: false
-        ceilometer-alarm-evaluator: false
-        ceilometer-alarm-notifier: false
-        ceilometer-anotification: false
-        ceilometer-api: false
-        ceilometer-collector: false
         c-sch: true
         c-api: true
         c-vol: true
@@ -1170,14 +1051,14 @@
     name: octavia-v2-act-stdby-dsvm-scenario
     parent: octavia-v2-act-stdby-dsvm-scenario-base
     branches:
-      regex: ^(unmaintained/|stable/(2023.2|2024.1|2024.2))
+      regex: ^(unmaintained/|stable/(2024.1|2024.2))
       negate: true
     nodeset: octavia-single-node-ubuntu-noble
 
 - job:
     name: octavia-v2-act-stdby-dsvm-scenario
     parent: octavia-v2-act-stdby-dsvm-scenario-base
-    branches: ^(stable/(2023.2|2024.1|2024.2))
+    branches: ^(stable/(2024.1|2024.2))
     nodeset: octavia-single-node-ubuntu-jammy
 
 - job:
@@ -1216,18 +1097,6 @@
             load_balancer:
               RBAC_test_type: advanced
 
-- job:
-    name: octavia-v2-act-stdby-dsvm-scenario-stable-2023-2
-    parent: octavia-v2-act-stdby-dsvm-scenario
-    nodeset: octavia-single-node-ubuntu-jammy
-    override-checkout: stable/2023.2
-    vars:
-      devstack_local_conf:
-        test-config:
-          "$TEMPEST_CONFIG":
-            load_balancer:
-              RBAC_test_type: advanced
-
 # Temporary job, remove once it is no longer used in octavia gates
 - job:
     name: octavia-v2-dsvm-noop-api-keystone-default-roles
@@ -1255,7 +1124,7 @@
     parent: ovn-octavia-provider-tempest-release
     description: Runs the neutron OVN provider driver for Octavia api test.
     voting: false
-    timeout: 5400
+    timeout: 7800
     attempts: 1
     tags: ovn-octavia-provider
     irrelevant-files:
@@ -1284,7 +1153,7 @@
     parent: ovn-octavia-provider-tempest-release
     description: Runs the neutron OVN provider driver for Octavia scenario test.
     voting: false
-    timeout: 5400
+    timeout: 7800
     attempts: 1
     tags: ovn-octavia-provider
     irrelevant-files:
@@ -1301,6 +1170,7 @@
       - ^octavia/volume/.*$
       - ^octavia/tests/.*$
     vars:
+      tempest_test_regex: ^octavia_tempest_plugin.tests.scenario.v2
       devstack_local_conf:
         test-config:
           "$TEMPEST_CONFIG":
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index 1801876..f6dff7a 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -13,7 +13,6 @@
         - octavia-v2-dsvm-noop-api-stable-2025-1
         - octavia-v2-dsvm-noop-api-stable-2024-2
         - octavia-v2-dsvm-noop-api-stable-2024-1
-        - octavia-v2-dsvm-noop-api-stable-2023-2
         - octavia-v2-dsvm-noop-api-advanced-rbac
         - octavia-v2-dsvm-scenario-traffic-ops
         - octavia-v2-dsvm-scenario-non-traffic-ops
@@ -25,13 +24,10 @@
         - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2024-2
         - octavia-v2-dsvm-scenario-traffic-ops-stable-2024-1
         - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2024-1
-        - octavia-v2-dsvm-scenario-traffic-ops-stable-2023-2
-        - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2023-2
         - octavia-v2-dsvm-tls-barbican
         - octavia-v2-dsvm-tls-barbican-stable-2025-1
         - octavia-v2-dsvm-tls-barbican-stable-2024-2
         - octavia-v2-dsvm-tls-barbican-stable-2024-1
-        - octavia-v2-dsvm-tls-barbican-stable-2023-2
         - octavia-v2-dsvm-scenario-ipv6-only:
             voting: false
         - octavia-v2-dsvm-scenario-centos-9-stream-traffic-ops:
@@ -54,8 +50,6 @@
             voting: false
         - octavia-v2-act-stdby-dsvm-scenario-stable-2024-1:
             voting: false
-        - octavia-v2-act-stdby-dsvm-scenario-stable-2023-2:
-            voting: false
         - octavia-v2-dsvm-cinder-amphora:
             voting: false
         # Third party provider jobs
@@ -72,7 +66,6 @@
         - octavia-v2-dsvm-noop-api-stable-2025-1
         - octavia-v2-dsvm-noop-api-stable-2024-2
         - octavia-v2-dsvm-noop-api-stable-2024-1
-        - octavia-v2-dsvm-noop-api-stable-2023-2
         - octavia-v2-dsvm-noop-api-advanced-rbac
         - octavia-v2-dsvm-scenario-traffic-ops
         - octavia-v2-dsvm-scenario-non-traffic-ops
@@ -84,11 +77,8 @@
         - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2024-2
         - octavia-v2-dsvm-scenario-traffic-ops-stable-2024-1
         - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2024-1
-        - octavia-v2-dsvm-scenario-traffic-ops-stable-2023-2
-        - octavia-v2-dsvm-scenario-non-traffic-ops-stable-2023-2
         - octavia-v2-dsvm-tls-barbican
         - octavia-v2-dsvm-tls-barbican-stable-2025-2
         - octavia-v2-dsvm-tls-barbican-stable-2025-1
         - octavia-v2-dsvm-tls-barbican-stable-2024-2
         - octavia-v2-dsvm-tls-barbican-stable-2024-1
-        - octavia-v2-dsvm-tls-barbican-stable-2023-2