Add glance test for uploading the image
Adds test that checks that glance image upload via url works correctly
Related-PROD: PRODX-7910
Change-Id: I4b2478a18db8a51fda473e4b8f32d362168ecea5
(cherry picked from commit 6cdce54469c037d86c280daabf09a69c0bd812c2)
(cherry picked from commit d53959e09323344702782806ee189a822c79d46c)
diff --git a/tempest/api/image/v2/admin/test_images.py b/tempest/api/image/v2/admin/test_images.py
index 733c778..257ddf5 100644
--- a/tempest/api/image/v2/admin/test_images.py
+++ b/tempest/api/image/v2/admin/test_images.py
@@ -12,6 +12,7 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
+import time
import io
@@ -20,6 +21,9 @@
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+
+CONF = config.CONF
CONF = config.CONF
@@ -120,3 +124,45 @@
self.assertEqual(0, len(failed_stores),
"Failed to copy the following stores: %s" %
str(failed_stores))
+
+
+class ImageWebUploadAdminTest(base.BaseV2ImageAdminTest):
+ @classmethod
+ def skip_checks(cls):
+ super(ImageWebUploadAdminTest, cls).skip_checks()
+ enabled_methods = CONF.image_feature_enabled.enabled_import_methods
+ if "web-download" not in enabled_methods:
+ raise cls.skipException(
+ "Glance image upload via url feature disabled")
+
+ @decorators.idempotent_id('5b2ce43c-924c-4bae-bac0-f5d6ed69d72e')
+ def test_image_upload_via_url(self):
+ # Create image
+ image_name = data_utils.rand_name("image")
+ container_format = CONF.image.container_formats[0]
+ disk_format = CONF.image.disk_formats[0]
+ image = self.create_image(name=image_name,
+ container_format=container_format,
+ disk_format=disk_format,
+ visibility='private')
+ self.assertEqual('queued', image['status'])
+
+ # Upload image via url
+ image_uri = CONF.image.http_image
+ method = {"name": "web-download", "uri": image_uri}
+ self.admin_client.import_image(image_id=image["id"], method=method)
+
+ timeout = CONF.image.build_timeout
+ interval = CONF.image.build_interval
+
+ start_time = int(time.time())
+ while True:
+ body = self.admin_client.show_image(image['id'])
+ if body["status"] == "active":
+ break
+ if int(time.time()) - start_time >= timeout:
+ message = ('Image %(id)s failed to become active within '
+ 'the required time (%(timeout)s s).' %
+ {'id': image['id'], 'timeout': timeout})
+ raise lib_exc.TimeoutException(message)
+ time.sleep(interval)
diff --git a/tempest/config.py b/tempest/config.py
index 0f2e86c..fa075e4 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -750,6 +750,9 @@
cfg.BoolOpt('os_glance_reserved',
default=False,
help="Should we check that os_glance namespace is reserved"),
+ cfg.ListOpt('enabled_import_methods',
+ default=[],
+ help="List of enabled image import methods"),
]
network_group = cfg.OptGroup(name='network',
diff --git a/tempest/lib/services/image/v2/images_client.py b/tempest/lib/services/image/v2/images_client.py
index abf427c..2c387ca 100644
--- a/tempest/lib/services/image/v2/images_client.py
+++ b/tempest/lib/services/image/v2/images_client.py
@@ -55,6 +55,19 @@
body = json.loads(body)
return rest_client.ResponseBody(resp, body)
+ def import_image(self, image_id, **kwargs):
+ """Import image.
+
+ For a full list of available parameters, please refer to the official
+ API reference:
+ https://docs.openstack.org/api-ref/image/v2/#import-an-image
+ """
+ data = json.dumps(kwargs)
+ url = 'images/%s/import' % image_id
+ resp, body = self.post(url, data)
+ self.expected_success(202, resp.status)
+ return rest_client.ResponseBody(resp, body)
+
def deactivate_image(self, image_id):
"""Deactivate image.