Abort wait for 404 if the status changes to ERROR

This patch enhances the NotFound/404 waiter to not continue to wait
for a 404 if the zone goes into status ERROR.

Change-Id: I27d5d654b2b2b2b4cd8b8e85fdb1d7b1e4162516
diff --git a/designate_tempest_plugin/common/exceptions.py b/designate_tempest_plugin/common/exceptions.py
new file mode 100644
index 0000000..d3f343d
--- /dev/null
+++ b/designate_tempest_plugin/common/exceptions.py
@@ -0,0 +1,29 @@
+# Copyright 2021 Red Hat.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+class InvalidStatusError(Exception):
+    """
+    Exception raise when an entity changes to an unexpected status.
+    """
+
+    def __init__(self, entity, entity_id, status, expected_status=None):
+        if expected_status:
+            message = ("{0} with ID {1} returned status {2} when {3} was "
+                       "expected.".format(entity, entity_id,
+                                          status, expected_status))
+        else:
+            message = ("{0} with ID {1} returned unexpected status {2}".format(
+                entity, entity_id, status))
+        super(InvalidStatusError, self).__init__(message)
diff --git a/designate_tempest_plugin/common/waiters.py b/designate_tempest_plugin/common/waiters.py
index 2b7a3b6..5a35255 100644
--- a/designate_tempest_plugin/common/waiters.py
+++ b/designate_tempest_plugin/common/waiters.py
@@ -18,6 +18,9 @@
 from tempest.lib.common.utils import test_utils
 from tempest.lib import exceptions as lib_exc
 
+from designate_tempest_plugin.common import constants as const
+from designate_tempest_plugin.common import exceptions
+
 LOG = logging.getLogger(__name__)
 
 
@@ -35,6 +38,10 @@
             LOG.info('Zone %s is 404ing', zone_id)
             return
 
+        if zone['status'] == const.ERROR:
+            raise exceptions.InvalidStatusError('Zone', zone_id,
+                                                zone['status'])
+
         if int(time.time()) - start >= client.build_timeout:
             message = ('Zone %(zone_id)s failed to 404 within the required '
                        'time (%(timeout)s s). Current status: '