blob: 8d503dcb3c8ab55f3efc236e4bd867d2edc5e6bb [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes13b479b2012-06-11 14:52:27 -04002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Matthew Treinishb0c65f22015-04-23 09:09:41 -040016import six
Adam Gandelman7c741dc2014-07-14 18:21:35 -070017
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070019from tempest.common import image as common_image
Ken'ichi Ohmichi8b9c7802015-07-08 05:57:37 +000020from tempest.common import waiters
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000021from tempest import config
Ken'ichi Ohmichi757833a2017-03-10 10:30:30 -080022from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -080023from tempest.lib import decorators
guo yunxianffc4fc02016-11-15 09:56:08 +080024from tempest.lib import exceptions
Daryl Wallecked8bef32011-12-05 23:02:08 -060025
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000026CONF = config.CONF
27
Daryl Wallecked8bef32011-12-05 23:02:08 -060028
ivan-zhuf2b00502013-10-18 10:06:52 +080029class ImagesMetadataTestJSON(base.BaseV2ComputeTest):
Daryl Wallecked8bef32011-12-05 23:02:08 -060030
31 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053032 def skip_checks(cls):
33 super(ImagesMetadataTestJSON, cls).skip_checks()
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000034 if not CONF.service_available.glance:
Matthew Treinish853ae442013-07-19 16:36:07 -040035 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
36 raise cls.skipException(skip_msg)
37
Rohan Kanade60b73092015-02-04 17:58:19 +053038 @classmethod
39 def setup_clients(cls):
40 super(ImagesMetadataTestJSON, cls).setup_clients()
Matt Riedemann2aa19d42016-06-06 17:45:41 -040041 # Check if glance v1 is available to determine which client to use. We
42 # prefer glance v1 for the compute API tests since the compute image
43 # API proxy was written for glance v1.
44 if CONF.image_feature_enabled.api_v1:
Jordan Pittier8160d312017-04-18 11:52:23 +020045 cls.glance_client = cls.os_primary.image_client
Matt Riedemann2aa19d42016-06-06 17:45:41 -040046 elif CONF.image_feature_enabled.api_v2:
Jordan Pittier8160d312017-04-18 11:52:23 +020047 cls.glance_client = cls.os_primary.image_client_v2
Matt Riedemann2aa19d42016-06-06 17:45:41 -040048 else:
49 raise exceptions.InvalidConfiguration(
50 'Either api_v1 or api_v2 must be True in '
51 '[image-feature-enabled].')
Ghanshyamae76c122015-12-22 13:41:35 +090052 cls.client = cls.compute_images_client
Rohan Kanade60b73092015-02-04 17:58:19 +053053
54 @classmethod
55 def resource_setup(cls):
56 super(ImagesMetadataTestJSON, cls).resource_setup()
Zhi Kun Liu22fb4702014-02-27 16:15:24 +080057 cls.image_id = None
Daryl Wallecked8bef32011-12-05 23:02:08 -060058
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070059 params = {
60 'name': data_utils.rand_name('image'),
61 'container_format': 'bare',
62 'disk_format': 'raw'
63 }
Matt Riedemann2aa19d42016-06-06 17:45:41 -040064 if CONF.image_feature_enabled.api_v1:
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070065 params.update({'is_public': False})
66 params = {'headers': common_image.image_meta_to_headers(**params)}
Matt Riedemann2aa19d42016-06-06 17:45:41 -040067 else:
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070068 params.update({'visibility': 'private'})
69
70 body = cls.glance_client.create_image(**params)
Matt Riedemann2aa19d42016-06-06 17:45:41 -040071 body = body['image'] if 'image' in body else body
Adam Gandelman7c741dc2014-07-14 18:21:35 -070072 cls.image_id = body['id']
73 cls.images.append(cls.image_id)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053074 image_file = six.BytesIO((b'*' * 1024))
Matt Riedemann2aa19d42016-06-06 17:45:41 -040075 if CONF.image_feature_enabled.api_v1:
76 cls.glance_client.update_image(cls.image_id, data=image_file)
77 else:
78 cls.glance_client.store_image_file(cls.image_id, data=image_file)
Ken'ichi Ohmichi8b9c7802015-07-08 05:57:37 +000079 waiters.wait_for_image_status(cls.client, cls.image_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060080
Daryl Wallecked8bef32011-12-05 23:02:08 -060081 def setUp(self):
nayna-pateleda1d122013-03-20 14:44:31 +000082 super(ImagesMetadataTestJSON, self).setUp()
Flavio Percococ4801a32015-01-16 17:32:19 +010083 meta = {'os_version': 'value1', 'os_distro': 'value2'}
David Kranza5299eb2015-01-15 17:24:05 -050084 self.client.set_image_metadata(self.image_id, meta)
Daryl Wallecked8bef32011-12-05 23:02:08 -060085
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -080086 @decorators.idempotent_id('37ec6edd-cf30-4c53-bd45-ae74db6b0531')
Daryl Wallecked8bef32011-12-05 23:02:08 -060087 def test_list_image_metadata(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050088 # All metadata key/value pairs for an image should be returned
David Kranza5299eb2015-01-15 17:24:05 -050089 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +090090 expected = {'metadata': {
91 'os_version': 'value1', 'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -050092 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060093
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -080094 @decorators.idempotent_id('ece7befc-d3ce-42a4-b4be-c3067a418c29')
Daryl Wallecked8bef32011-12-05 23:02:08 -060095 def test_set_image_metadata(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050096 # The metadata for the image should match the new values
Flavio Percococ4801a32015-01-16 17:32:19 +010097 req_metadata = {'os_version': 'value2', 'architecture': 'value3'}
David Kranza5299eb2015-01-15 17:24:05 -050098 self.client.set_image_metadata(self.image_id,
99 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600100
ghanshyam1756e0b2015-08-18 19:19:05 +0900101 resp_metadata = (self.client.list_image_metadata(self.image_id)
102 ['metadata'])
Brian Waldon738cd632011-12-12 18:45:09 -0500103 self.assertEqual(req_metadata, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600104
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800105 @decorators.idempotent_id('7b491c11-a9d5-40fe-a696-7f7e03d3fea2')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600106 def test_update_image_metadata(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500107 # The metadata for the image should match the updated values
Flavio Percococ4801a32015-01-16 17:32:19 +0100108 req_metadata = {'os_version': 'alt1', 'architecture': 'value3'}
David Kranza5299eb2015-01-15 17:24:05 -0500109 self.client.update_image_metadata(self.image_id,
110 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600111
David Kranza5299eb2015-01-15 17:24:05 -0500112 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900113 expected = {'metadata': {
114 'os_version': 'alt1',
115 'os_distro': 'value2',
116 'architecture': 'value3'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500117 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600118
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800119 @decorators.idempotent_id('4f5db52f-6685-4c75-b848-f4bb363f9aa6')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600120 def test_get_image_metadata_item(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500121 # The value for a specific metadata key should be returned
Ken'ichi Ohmichi0943d9b2015-06-17 02:27:05 +0000122 meta = self.client.show_image_metadata_item(self.image_id,
ghanshyam1756e0b2015-08-18 19:19:05 +0900123 'os_distro')['meta']
Flavio Percococ4801a32015-01-16 17:32:19 +0100124 self.assertEqual('value2', meta['os_distro'])
Daryl Wallecked8bef32011-12-05 23:02:08 -0600125
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800126 @decorators.idempotent_id('f2de776a-4778-4d90-a5da-aae63aee64ae')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600127 def test_set_image_metadata_item(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500128 # The value provided for the given meta item should be set for
129 # the image
Flavio Percococ4801a32015-01-16 17:32:19 +0100130 meta = {'os_version': 'alt'}
David Kranza5299eb2015-01-15 17:24:05 -0500131 self.client.set_image_metadata_item(self.image_id,
Flavio Percococ4801a32015-01-16 17:32:19 +0100132 'os_version', meta)
David Kranza5299eb2015-01-15 17:24:05 -0500133 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900134 expected = {'metadata': {'os_version': 'alt', 'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500135 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600136
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800137 @decorators.idempotent_id('a013796c-ba37-4bb5-8602-d944511def14')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600138 def test_delete_image_metadata_item(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500139 # The metadata value/key pair should be deleted from the image
David Kranza5299eb2015-01-15 17:24:05 -0500140 self.client.delete_image_metadata_item(self.image_id,
Flavio Percococ4801a32015-01-16 17:32:19 +0100141 'os_version')
David Kranza5299eb2015-01-15 17:24:05 -0500142 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900143 expected = {'metadata': {'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500144 self.assertEqual(expected, resp_metadata)