Merge "Fix availability zone API tests"
diff --git a/octavia_tempest_plugin/config.py b/octavia_tempest_plugin/config.py
index 8573d89..fc04c33 100644
--- a/octavia_tempest_plugin/config.py
+++ b/octavia_tempest_plugin/config.py
@@ -195,6 +195,12 @@
     cfg.StrOpt('availability_zone',
                default=None,
                help='Availability zone to use for creating servers.'),
+    cfg.StrOpt('availability_zone2',
+               default=None,
+               help='A second availability zone to use for creating servers.'),
+    cfg.StrOpt('availability_zone3',
+               default=None,
+               help='A third availability zone to use for creating servers.'),
     cfg.BoolOpt('test_reuse_connection', default=True,
                 help='Reuse TCP connections while testing LB with '
                      'HTTP members (keep-alive).'),
diff --git a/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py b/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
index 023d5f5..816e00e 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
@@ -32,6 +32,15 @@
     """Test the availability zone object API."""
 
     @classmethod
+    def skip_checks(cls):
+        super(AvailabilityZoneAPITest, cls).skip_checks()
+        if (CONF.load_balancer.availability_zone is None and
+                not CONF.load_balancer.test_with_noop):
+            raise cls.skipException(
+                'Availability Zone API tests require an availability zone '
+                'configured in the [load_balancer] availability_zone setting.')
+
+    @classmethod
     def resource_setup(cls):
         """Setup resources needed by the tests."""
         super(AvailabilityZoneAPITest, cls).resource_setup()
@@ -46,7 +55,7 @@
         availability_zone_profile_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile-setup")
         availability_zone_data = {
-            const.COMPUTE_ZONE: 'my_compute_zone',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data_json = jsonutils.dumps(availability_zone_data)
diff --git a/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py b/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
index 86ae066..c062dbe 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
@@ -32,6 +32,16 @@
 class AvailabilityZoneProfileAPITest(test_base.LoadBalancerBaseTest):
     """Test the availability zone profile object API."""
 
+    @classmethod
+    def skip_checks(cls):
+        super(AvailabilityZoneProfileAPITest, cls).skip_checks()
+        if (CONF.load_balancer.availability_zone is None and
+                not CONF.load_balancer.test_with_noop):
+            raise cls.skipException(
+                'Availability zone profile API tests require an availability '
+                'zone configured in the [load_balancer] availability_zone '
+                'setting in the tempest configuration file.')
+
     @decorators.idempotent_id('e512b580-ef32-44c3-bbd2-efdc27ba2ea6')
     def test_availability_zone_profile_create(self):
         """Tests availability zone profile create and basic show APIs.
@@ -53,7 +63,7 @@
         availability_zone_profile_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile1-create")
         availability_zone_data = {
-            const.COMPUTE_ZONE: 'my_compute_zone',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data_json = jsonutils.dumps(availability_zone_data)
@@ -116,12 +126,20 @@
             raise self.skipException(
                 'Availability zone profiles are only available on '
                 'Octavia API version 2.14 or newer.')
+        if ((CONF.load_balancer.availability_zone2 is None or
+             CONF.load_balancer.availability_zone3 is None) and
+                not CONF.load_balancer.test_with_noop):
+            raise self.skipException(
+                'Availability zone profile list API test requires the '
+                '[load_balancer] availability_zone, availability_zone2, and '
+                'availability_zone3 settings be defined in the tempest '
+                'configuration file.')
 
         # Create availability zone profile 1
         availability_zone_profile1_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile-list-1")
         availability_zone_data1 = {
-            const.COMPUTE_ZONE: 'my_compute_zone1',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data1_json = jsonutils.dumps(availability_zone_data1)
@@ -144,7 +162,7 @@
         availability_zone_profile2_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile-list-2")
         availability_zone_data2 = {
-            const.COMPUTE_ZONE: 'my_compute_zone2',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone2,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data2_json = jsonutils.dumps(availability_zone_data2)
@@ -167,7 +185,7 @@
         availability_zone_profile3_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile-list-3")
         availability_zone_data3 = {
-            const.COMPUTE_ZONE: 'my_compute_zone3',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone3,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data3_json = jsonutils.dumps(availability_zone_data3)
@@ -329,7 +347,7 @@
         availability_zone_profile_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile1-show")
         availability_zone_data = {
-            const.COMPUTE_ZONE: 'my_compute_zone',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data_json = jsonutils.dumps(availability_zone_data)
@@ -390,11 +408,17 @@
             raise self.skipException(
                 'Availability zone profiles are only available on '
                 'Octavia API version 2.14 or newer.')
+        if (CONF.load_balancer.availability_zone2 is None and
+                not CONF.load_balancer.test_with_noop):
+            raise self.skipException(
+                'Availability zone profile update API tests requires '
+                '[load_balancer] availability_zone2 to be defined in the '
+                'tempest configuration file.')
 
         availability_zone_profile_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile1-update")
         availability_zone_data = {
-            const.COMPUTE_ZONE: 'my_compute_zone1',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data_json = jsonutils.dumps(availability_zone_data)
@@ -427,7 +451,7 @@
         availability_zone_profile_name2 = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile1-update2")
         availability_zone_data2 = {
-            const.COMPUTE_ZONE: 'my_compute_zone2',
+            const.COMPUTE_ZONE:  CONF.load_balancer.availability_zone2,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data2_json = jsonutils.dumps(availability_zone_data2)
@@ -495,7 +519,7 @@
         availability_zone_profile_name = data_utils.rand_name(
             "lb_admin_availabilityzoneprofile1-delete")
         availability_zone_data = {
-            const.COMPUTE_ZONE: 'my_compute_zone',
+            const.COMPUTE_ZONE: CONF.load_balancer.availability_zone,
             const.MANAGEMENT_NETWORK: uuidutils.generate_uuid(),
         }
         availability_zone_data_json = jsonutils.dumps(availability_zone_data)
diff --git a/releasenotes/notes/skip-az-api-tests-if-azs-not-configured-c5d06cdcf29beeb5.yaml b/releasenotes/notes/skip-az-api-tests-if-azs-not-configured-c5d06cdcf29beeb5.yaml
new file mode 100644
index 0000000..84b1480
--- /dev/null
+++ b/releasenotes/notes/skip-az-api-tests-if-azs-not-configured-c5d06cdcf29beeb5.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    Fixed availability zone API tests to skip if the required availability
+    zones are not defined in the tempest configuration file and the test run
+    is not using no-op drivers.
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index acc9f24..d94dff1 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -397,6 +397,11 @@
           "$TEMPEST_CONFIG":
             load_balancer:
               test_with_noop: True
+              # AZ API tests with no-op need AZs configured but they do not
+              # need to actually exist in Nova due to the no-op driver.
+              availability_zone: bogus-az-1
+              availability_zone2: bogus-az-2
+              availability_zone3: bogus-az-3
         post-config:
           $OCTAVIA_CONF:
             controller_worker: