Fix web-download bad URL test for sync URI validation

Glance can now return HTTP 400 when the web-download URI fails checks
up front. The test used to expect 202 and a later failed import.
Accept 400 when the error mentions the bad host or filtering, and
keep the old wait-for-failed-import path when Glance still returns 202.

Related-Bug: #2138602
Change-Id: I1ec58edd6029fbc8e667e008f5017c71d70cc09f
Signed-off-by: Abhishek Kekane <akekane@redhat.com>
diff --git a/tempest/api/image/v2/test_images_negative.py b/tempest/api/image/v2/test_images_negative.py
index f0b891f..d015ca3 100644
--- a/tempest/api/image/v2/test_images_negative.py
+++ b/tempest/api/image/v2/test_images_negative.py
@@ -218,12 +218,27 @@
         self.assertEqual(image['id'], body['id'])
         self.assertEqual('queued', body['status'])
         stores = self.get_available_stores()
-        # import image from web to backend
         image_uri = 'http://does-not.exist/no/possible/way'
-        self.client.image_import(image['id'], method='web-download',
-                                 import_params={'uri': image_uri},
-                                 stores=[stores[0]['id']])
+        try:
+            self.client.image_import(
+                image['id'], method='web-download',
+                import_params={'uri': image_uri},
+                stores=[stores[0]['id']])
+        except lib_exc.BadRequest as e:
+            # Glance may reject the URI during synchronous validation
+            # (HTTP 400), e.g. import filtering / SSRF protections, instead of
+            # accepting the import and failing asynchronously.
+            err = str(e)
+            self.assertTrue(
+                'does-not.exist' in err or
+                'does not pass filtering' in err.lower(),
+                'Unexpected 400 body for bad web-download URI: %s' % e)
+            return
 
+        # Only reached when Glance accepts the import (202) and defers failure
+        # to the async web-download task (e.g. older servers without sync URI
+        # filtering). Stricter Glance returns 400 above and never hits this
+        # loop.
         start_time = int(time.time())
         while int(time.time()) - start_time < self.client.build_timeout:
             body = self.client.show_image(image['id'])