blob: 561265f53d8e9308d73eaa56a27eda9c8bcddb9a [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
Andrea Frittolib17f7a32017-08-29 17:45:58 +010023from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -080024from tempest.lib import decorators
guo yunxianffc4fc02016-11-15 09:56:08 +080025from tempest.lib import exceptions
Daryl Wallecked8bef32011-12-05 23:02:08 -060026
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000027CONF = config.CONF
28
Daryl Wallecked8bef32011-12-05 23:02:08 -060029
ivan-zhuf2b00502013-10-18 10:06:52 +080030class ImagesMetadataTestJSON(base.BaseV2ComputeTest):
zhufl4e726a62020-08-10 16:30:28 +080031 """Test image metadata with compute microversion less than 2.39"""
32
zhufl641f43b2018-03-21 14:50:05 +080033 max_microversion = '2.38'
Daryl Wallecked8bef32011-12-05 23:02:08 -060034
35 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053036 def skip_checks(cls):
37 super(ImagesMetadataTestJSON, cls).skip_checks()
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000038 if not CONF.service_available.glance:
Matthew Treinish853ae442013-07-19 16:36:07 -040039 skip_msg = ("%s skipped as glance is not available" % cls.__name__)
40 raise cls.skipException(skip_msg)
41
Rohan Kanade60b73092015-02-04 17:58:19 +053042 @classmethod
43 def setup_clients(cls):
44 super(ImagesMetadataTestJSON, cls).setup_clients()
Matt Riedemann2aa19d42016-06-06 17:45:41 -040045 # Check if glance v1 is available to determine which client to use. We
46 # prefer glance v1 for the compute API tests since the compute image
47 # API proxy was written for glance v1.
48 if CONF.image_feature_enabled.api_v1:
Jordan Pittier8160d312017-04-18 11:52:23 +020049 cls.glance_client = cls.os_primary.image_client
Matt Riedemann2aa19d42016-06-06 17:45:41 -040050 elif CONF.image_feature_enabled.api_v2:
Jordan Pittier8160d312017-04-18 11:52:23 +020051 cls.glance_client = cls.os_primary.image_client_v2
Matt Riedemann2aa19d42016-06-06 17:45:41 -040052 else:
53 raise exceptions.InvalidConfiguration(
54 'Either api_v1 or api_v2 must be True in '
55 '[image-feature-enabled].')
Ghanshyamae76c122015-12-22 13:41:35 +090056 cls.client = cls.compute_images_client
Rohan Kanade60b73092015-02-04 17:58:19 +053057
58 @classmethod
59 def resource_setup(cls):
60 super(ImagesMetadataTestJSON, cls).resource_setup()
Zhi Kun Liu22fb4702014-02-27 16:15:24 +080061 cls.image_id = None
Daryl Wallecked8bef32011-12-05 23:02:08 -060062
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070063 params = {
64 'name': data_utils.rand_name('image'),
65 'container_format': 'bare',
66 'disk_format': 'raw'
67 }
Matt Riedemann2aa19d42016-06-06 17:45:41 -040068 if CONF.image_feature_enabled.api_v1:
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070069 params.update({'is_public': False})
70 params = {'headers': common_image.image_meta_to_headers(**params)}
Matt Riedemann2aa19d42016-06-06 17:45:41 -040071 else:
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -070072 params.update({'visibility': 'private'})
73
74 body = cls.glance_client.create_image(**params)
Matt Riedemann2aa19d42016-06-06 17:45:41 -040075 body = body['image'] if 'image' in body else body
Adam Gandelman7c741dc2014-07-14 18:21:35 -070076 cls.image_id = body['id']
Andrea Frittolib17f7a32017-08-29 17:45:58 +010077 cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc,
Andrea Frittolif78565d2017-09-12 08:06:17 -060078 cls.glance_client.delete_image,
Andrea Frittolib17f7a32017-08-29 17:45:58 +010079 cls.image_id)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053080 image_file = six.BytesIO((b'*' * 1024))
Matt Riedemann2aa19d42016-06-06 17:45:41 -040081 if CONF.image_feature_enabled.api_v1:
82 cls.glance_client.update_image(cls.image_id, data=image_file)
83 else:
84 cls.glance_client.store_image_file(cls.image_id, data=image_file)
Ken'ichi Ohmichi8b9c7802015-07-08 05:57:37 +000085 waiters.wait_for_image_status(cls.client, cls.image_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060086
Daryl Wallecked8bef32011-12-05 23:02:08 -060087 def setUp(self):
nayna-pateleda1d122013-03-20 14:44:31 +000088 super(ImagesMetadataTestJSON, self).setUp()
Flavio Percococ4801a32015-01-16 17:32:19 +010089 meta = {'os_version': 'value1', 'os_distro': 'value2'}
David Kranza5299eb2015-01-15 17:24:05 -050090 self.client.set_image_metadata(self.image_id, meta)
Daryl Wallecked8bef32011-12-05 23:02:08 -060091
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -080092 @decorators.idempotent_id('37ec6edd-cf30-4c53-bd45-ae74db6b0531')
Daryl Wallecked8bef32011-12-05 23:02:08 -060093 def test_list_image_metadata(self):
zhufl4e726a62020-08-10 16:30:28 +080094 """Test listing image metadata
95
96 All metadata key/value pairs for an image should be returned.
97 """
David Kranza5299eb2015-01-15 17:24:05 -050098 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +090099 expected = {'metadata': {
100 'os_version': 'value1', 'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500101 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600102
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800103 @decorators.idempotent_id('ece7befc-d3ce-42a4-b4be-c3067a418c29')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600104 def test_set_image_metadata(self):
zhufl4e726a62020-08-10 16:30:28 +0800105 """Test setting image metadata
106
107 The metadata for the image should match the new values.
108 """
Flavio Percococ4801a32015-01-16 17:32:19 +0100109 req_metadata = {'os_version': 'value2', 'architecture': 'value3'}
David Kranza5299eb2015-01-15 17:24:05 -0500110 self.client.set_image_metadata(self.image_id,
111 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600112
ghanshyam1756e0b2015-08-18 19:19:05 +0900113 resp_metadata = (self.client.list_image_metadata(self.image_id)
114 ['metadata'])
Brian Waldon738cd632011-12-12 18:45:09 -0500115 self.assertEqual(req_metadata, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600116
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800117 @decorators.idempotent_id('7b491c11-a9d5-40fe-a696-7f7e03d3fea2')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600118 def test_update_image_metadata(self):
zhufl4e726a62020-08-10 16:30:28 +0800119 """Test updating image medata
120
121 The metadata for the image should match the updated values.
122 """
Flavio Percococ4801a32015-01-16 17:32:19 +0100123 req_metadata = {'os_version': 'alt1', 'architecture': 'value3'}
David Kranza5299eb2015-01-15 17:24:05 -0500124 self.client.update_image_metadata(self.image_id,
125 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600126
David Kranza5299eb2015-01-15 17:24:05 -0500127 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900128 expected = {'metadata': {
129 'os_version': 'alt1',
130 'os_distro': 'value2',
131 'architecture': 'value3'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500132 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600133
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800134 @decorators.idempotent_id('4f5db52f-6685-4c75-b848-f4bb363f9aa6')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600135 def test_get_image_metadata_item(self):
zhufl4e726a62020-08-10 16:30:28 +0800136 """Test getting image metadata item
137
138 The value for a specific metadata key should be returned.
139 """
Ken'ichi Ohmichi0943d9b2015-06-17 02:27:05 +0000140 meta = self.client.show_image_metadata_item(self.image_id,
ghanshyam1756e0b2015-08-18 19:19:05 +0900141 'os_distro')['meta']
Flavio Percococ4801a32015-01-16 17:32:19 +0100142 self.assertEqual('value2', meta['os_distro'])
Daryl Wallecked8bef32011-12-05 23:02:08 -0600143
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800144 @decorators.idempotent_id('f2de776a-4778-4d90-a5da-aae63aee64ae')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600145 def test_set_image_metadata_item(self):
zhufl4e726a62020-08-10 16:30:28 +0800146 """Test setting image metadata item
147
148 The value provided for the given meta item should be set for
149 the image.
150 """
Flavio Percococ4801a32015-01-16 17:32:19 +0100151 meta = {'os_version': 'alt'}
David Kranza5299eb2015-01-15 17:24:05 -0500152 self.client.set_image_metadata_item(self.image_id,
Flavio Percococ4801a32015-01-16 17:32:19 +0100153 'os_version', meta)
David Kranza5299eb2015-01-15 17:24:05 -0500154 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900155 expected = {'metadata': {'os_version': 'alt', 'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500156 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600157
Ken'ichi Ohmichi6c92edf2017-01-27 17:32:10 -0800158 @decorators.idempotent_id('a013796c-ba37-4bb5-8602-d944511def14')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600159 def test_delete_image_metadata_item(self):
zhufl4e726a62020-08-10 16:30:28 +0800160 """Test deleting image metadata item
161
162 The metadata value/key pair should be deleted from the image.
163 """
David Kranza5299eb2015-01-15 17:24:05 -0500164 self.client.delete_image_metadata_item(self.image_id,
Flavio Percococ4801a32015-01-16 17:32:19 +0100165 'os_version')
David Kranza5299eb2015-01-15 17:24:05 -0500166 resp_metadata = self.client.list_image_metadata(self.image_id)
ghanshyam1756e0b2015-08-18 19:19:05 +0900167 expected = {'metadata': {'os_distro': 'value2'}}
Brian Waldon738cd632011-12-12 18:45:09 -0500168 self.assertEqual(expected, resp_metadata)