Merge "Add the provider flavor capabilities service client."
diff --git a/.gitreview b/.gitreview
index a22fc23..9832cf7 100644
--- a/.gitreview
+++ b/.gitreview
@@ -1,4 +1,4 @@
 [gerrit]
-host=review.openstack.org
+host=review.opendev.org
 port=29418
 project=openstack/octavia-tempest-plugin.git
diff --git a/octavia_tempest_plugin/config.py b/octavia_tempest_plugin/config.py
index 701eb8e..425ad60 100644
--- a/octavia_tempest_plugin/config.py
+++ b/octavia_tempest_plugin/config.py
@@ -167,18 +167,22 @@
 LBFeatureEnabledGroup = [
     cfg.BoolOpt('health_monitor_enabled',
                 default=True,
-                help="Whether Health Monitor is available with provider"
-                     " driver or not."),
+                help="Whether Health Monitor is available with provider "
+                     "driver or not."),
     cfg.BoolOpt('terminated_tls_enabled',
                 default=True,
                 help="Whether TLS termination is available with provider "
                      "driver or not."),
     cfg.BoolOpt('l7_protocol_enabled',
                 default=True,
-                help="Whether L7 Protocols are available with the provider"
-                     " driver or not."),
+                help="Whether L7 Protocols are available with the provider "
+                     "driver or not."),
+    cfg.BoolOpt('pool_algorithms_enabled',
+                default=True,
+                help="Whether pool algorithms are available with provider"
+                     "driver or not."),
     cfg.StrOpt('l4_protocol',
                default="TCP",
-               help="The type of L4 Protocol which is supported with the"
-                    " provider driver."),
+               help="The type of L4 Protocol which is supported with the "
+                    "provider driver."),
 ]
diff --git a/octavia_tempest_plugin/tests/scenario/v2/test_pool.py b/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
index 1cdd727..d1090c7 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_pool.py
@@ -51,9 +51,9 @@
                                 CONF.load_balancer.lb_build_interval,
                                 CONF.load_balancer.lb_build_timeout)
         cls.protocol = const.HTTP
-        lb_feature_enabled = CONF.loadbalancer_feature_enabled
-        if not lb_feature_enabled.l7_protocol_enabled:
-            cls.protocol = lb_feature_enabled.l4_protocol
+        cls.lb_feature_enabled = CONF.loadbalancer_feature_enabled
+        if not cls.lb_feature_enabled.l7_protocol_enabled:
+            cls.protocol = cls.lb_feature_enabled.l4_protocol
 
         listener_name = data_utils.rand_name("lb_member_listener1_pool")
         listener_kwargs = {
@@ -161,8 +161,12 @@
             const.NAME: new_name,
             const.DESCRIPTION: new_description,
             const.ADMIN_STATE_UP: True,
-            const.LB_ALGORITHM: const.LB_ALGORITHM_LEAST_CONNECTIONS,
         }
+
+        if self.lb_feature_enabled.pool_algorithms_enabled:
+            pool_update_kwargs[const.LB_ALGORITHM] = \
+                const.LB_ALGORITHM_LEAST_CONNECTIONS
+
         if self.protocol == const.HTTP:
             pool_update_kwargs[const.SESSION_PERSISTENCE] = {
                 const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE}
@@ -184,8 +188,9 @@
         self.assertEqual(new_name, pool[const.NAME])
         self.assertEqual(new_description, pool[const.DESCRIPTION])
         self.assertTrue(pool[const.ADMIN_STATE_UP])
-        self.assertEqual(const.LB_ALGORITHM_LEAST_CONNECTIONS,
-                         pool[const.LB_ALGORITHM])
+        if self.lb_feature_enabled.pool_algorithms_enabled:
+            self.assertEqual(const.LB_ALGORITHM_LEAST_CONNECTIONS,
+                             pool[const.LB_ALGORITHM])
         self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE))
         if self.protocol == const.HTTP:
             self.assertEqual(const.SESSION_PERSISTENCE_HTTP_COOKIE,
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 edc2cbc..eba7e38 100644
--- a/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
+++ b/octavia_tempest_plugin/tests/scenario/v2/test_traffic_ops.py
@@ -73,10 +73,15 @@
                                 CONF.load_balancer.lb_build_interval,
                                 CONF.load_balancer.lb_build_timeout)
 
+        protocol = const.HTTP
+        lb_feature_enabled = CONF.loadbalancer_feature_enabled
+        if not lb_feature_enabled.l7_protocol_enabled:
+            protocol = lb_feature_enabled.l4_protocol
+
         listener_name = data_utils.rand_name("lb_member_listener1_operations")
         listener_kwargs = {
             const.NAME: listener_name,
-            const.PROTOCOL: const.HTTP,
+            const.PROTOCOL: protocol,
             const.PROTOCOL_PORT: '80',
             const.LOADBALANCER_ID: cls.lb_id,
         }
@@ -96,7 +101,7 @@
         pool_name = data_utils.rand_name("lb_member_pool1_operations")
         pool_kwargs = {
             const.NAME: pool_name,
-            const.PROTOCOL: const.HTTP,
+            const.PROTOCOL: protocol,
             const.LB_ALGORITHM: const.LB_ALGORITHM_ROUND_ROBIN,
             const.LISTENER_ID: cls.listener_id,
         }
@@ -173,6 +178,9 @@
         # Send some traffic
         self.check_members_balanced(self.lb_vip_address)
 
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.health_monitor_enabled,
+        'Health monitor testing is disabled')
     @decorators.idempotent_id('a16f8eb4-a77c-4b0e-8b1b-91c237039713')
     def test_healthmonitor_traffic(self):
         """Tests traffic is correctly routed based on healthmonitor status
@@ -385,6 +393,9 @@
         # Send some traffic and verify it is balanced again
         self.check_members_balanced(self.lb_vip_address)
 
+    @testtools.skipUnless(
+        CONF.loadbalancer_feature_enabled.l7_protocol_enabled,
+        'L7 protocol testing is disabled')
     @decorators.idempotent_id('3558186d-6dcd-4d9d-b7f7-adc190b66149')
     def test_l7policies_and_l7rules(self):
         """Tests sending traffic through a loadbalancer with l7rules
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 8c8ac73..65903b4 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -81,7 +81,7 @@
         s-proxy: false
         tempest: true
       devstack_plugins:
-        octavia: https://git.openstack.org/openstack/octavia.git
+        octavia: https://opendev.org/openstack/octavia.git
 
 - job:
     name: octavia-dsvm-live-base
@@ -102,7 +102,7 @@
       devstack_services:
         neutron-qos: true
       devstack_plugins:
-        neutron: https://git.openstack.org/openstack/neutron.git
+        neutron: https://opendev.org/openstack/neutron.git
       zuul_copy_output:
         '/var/log/dib-build' : logs
 
@@ -145,8 +145,8 @@
           OCTAVIA_NODES: "main:{{ hostvars['controller']['nodepool']['private_ipv4'] }},second:{{ hostvars['controller2']['nodepool']['private_ipv4'] }}"
           OCTAVIA_USE_PREGENERATED_CERTS: true
         devstack_plugins:
-          neutron: https://git.openstack.org/openstack/neutron.git
-          octavia: https://git.openstack.org/openstack/octavia.git
+          neutron: https://opendev.org/openstack/neutron.git
+          octavia: https://opendev.org/openstack/octavia.git
       controller2:
         devstack_localrc:
           # From devstack "vars:"
@@ -180,7 +180,7 @@
           OCTAVIA_USE_PREGENERATED_CERTS: true
           OCTAVIA_MGMT_PORT_IP: 192.168.0.4
         devstack_plugins:
-          octavia: https://git.openstack.org/openstack/octavia.git
+          octavia: https://opendev.org/openstack/octavia.git
     group-vars:
       controller:
         devstack_local_conf:
@@ -287,6 +287,11 @@
         USE_PYTHON3: False
 
 - job:
+    name: octavia-v2-dsvm-noop-api-stable-stein
+    parent: octavia-v2-dsvm-noop-api
+    override-checkout: stable/stein
+
+- job:
     name: octavia-v2-dsvm-noop-py2-api-stable-rocky
     parent: octavia-v2-dsvm-noop-py2-api
     override-checkout: stable/rocky
@@ -317,6 +322,11 @@
         USE_PYTHON3: False
 
 - job:
+    name: octavia-v2-dsvm-scenario-stable-stein
+    parent: octavia-v2-dsvm-scenario
+    override-checkout: stable/stein
+
+- job:
     name: octavia-v2-dsvm-py2-scenario-stable-rocky
     parent: octavia-v2-dsvm-py2-scenario
     override-checkout: stable/rocky
@@ -376,7 +386,7 @@
       devstack_services:
         barbican: true
       devstack_plugins:
-        barbican: https://git.openstack.org/openstack/barbican.git
+        barbican: https://opendev.org/openstack/barbican.git
       devstack_localrc:
         TEMPEST_PLUGINS: '"/opt/stack/octavia-tempest-plugin /opt/stack/barbican-tempest-plugin"'
 
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index 07ec7ff..387f123 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -9,10 +9,12 @@
       jobs:
         - octavia-v2-dsvm-noop-api
         - octavia-v2-dsvm-noop-py2-api
+        - octavia-v2-dsvm-noop-api-stable-stein
         - octavia-v2-dsvm-noop-py2-api-stable-rocky
         - octavia-v2-dsvm-noop-py2-api-stable-queens
         - octavia-v2-dsvm-scenario
         - octavia-v2-dsvm-py2-scenario
+        - octavia-v2-dsvm-scenario-stable-stein
         - octavia-v2-dsvm-py2-scenario-stable-rocky
         - octavia-v2-dsvm-py2-scenario-stable-queens
         - octavia-v2-dsvm-scenario-centos-7:
@@ -30,9 +32,11 @@
       jobs:
         - octavia-v2-dsvm-noop-api
         - octavia-v2-dsvm-noop-py2-api
+        - octavia-v2-dsvm-noop-api-stable-stein
         - octavia-v2-dsvm-noop-py2-api-stable-rocky
         - octavia-v2-dsvm-noop-py2-api-stable-queens
         - octavia-v2-dsvm-scenario
         - octavia-v2-dsvm-py2-scenario
+        - octavia-v2-dsvm-scenario-stable-stein
         - octavia-v2-dsvm-py2-scenario-stable-rocky
         - octavia-v2-dsvm-py2-scenario-stable-queens