ZhiQiang Fan | 39f9722 | 2013-09-20 04:49:44 +0800 | [diff] [blame] | 1 | # Copyright 2012 OpenStack Foundation |
Jay Pipes | 13b479b | 2012-06-11 14:52:27 -0400 | [diff] [blame] | 2 | # 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 Treinish | b0c65f2 | 2015-04-23 09:09:41 -0400 | [diff] [blame] | 16 | import six |
Adam Gandelman | 7c741dc | 2014-07-14 18:21:35 -0700 | [diff] [blame] | 17 | |
Sean Dague | 1937d09 | 2013-05-17 16:36:38 -0400 | [diff] [blame] | 18 | from tempest.api.compute import base |
Ken'ichi Ohmichi | 02bcdf3 | 2016-06-17 16:41:26 -0700 | [diff] [blame] | 19 | from tempest.common import image as common_image |
Ken'ichi Ohmichi | 8b9c780 | 2015-07-08 05:57:37 +0000 | [diff] [blame] | 20 | from tempest.common import waiters |
Matthew Treinish | bc0e03e | 2014-01-30 16:51:06 +0000 | [diff] [blame] | 21 | from tempest import config |
Ken'ichi Ohmichi | 757833a | 2017-03-10 10:30:30 -0800 | [diff] [blame] | 22 | from tempest.lib.common.utils import data_utils |
Andrea Frittoli | b17f7a3 | 2017-08-29 17:45:58 +0100 | [diff] [blame] | 23 | from tempest.lib.common.utils import test_utils |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 24 | from tempest.lib import decorators |
guo yunxian | ffc4fc0 | 2016-11-15 09:56:08 +0800 | [diff] [blame] | 25 | from tempest.lib import exceptions |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 26 | |
Matthew Treinish | bc0e03e | 2014-01-30 16:51:06 +0000 | [diff] [blame] | 27 | CONF = config.CONF |
| 28 | |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 29 | |
ivan-zhu | f2b0050 | 2013-10-18 10:06:52 +0800 | [diff] [blame] | 30 | class ImagesMetadataTestJSON(base.BaseV2ComputeTest): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 31 | """Test image metadata with compute microversion less than 2.39""" |
| 32 | |
zhufl | 641f43b | 2018-03-21 14:50:05 +0800 | [diff] [blame] | 33 | max_microversion = '2.38' |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 34 | |
| 35 | @classmethod |
Rohan Kanade | 60b7309 | 2015-02-04 17:58:19 +0530 | [diff] [blame] | 36 | def skip_checks(cls): |
| 37 | super(ImagesMetadataTestJSON, cls).skip_checks() |
Matthew Treinish | bc0e03e | 2014-01-30 16:51:06 +0000 | [diff] [blame] | 38 | if not CONF.service_available.glance: |
Matthew Treinish | 853ae44 | 2013-07-19 16:36:07 -0400 | [diff] [blame] | 39 | skip_msg = ("%s skipped as glance is not available" % cls.__name__) |
| 40 | raise cls.skipException(skip_msg) |
| 41 | |
Rohan Kanade | 60b7309 | 2015-02-04 17:58:19 +0530 | [diff] [blame] | 42 | @classmethod |
| 43 | def setup_clients(cls): |
| 44 | super(ImagesMetadataTestJSON, cls).setup_clients() |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 45 | # 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 Pittier | 8160d31 | 2017-04-18 11:52:23 +0200 | [diff] [blame] | 49 | cls.glance_client = cls.os_primary.image_client |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 50 | elif CONF.image_feature_enabled.api_v2: |
Jordan Pittier | 8160d31 | 2017-04-18 11:52:23 +0200 | [diff] [blame] | 51 | cls.glance_client = cls.os_primary.image_client_v2 |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 52 | else: |
| 53 | raise exceptions.InvalidConfiguration( |
| 54 | 'Either api_v1 or api_v2 must be True in ' |
| 55 | '[image-feature-enabled].') |
Ghanshyam | ae76c12 | 2015-12-22 13:41:35 +0900 | [diff] [blame] | 56 | cls.client = cls.compute_images_client |
Rohan Kanade | 60b7309 | 2015-02-04 17:58:19 +0530 | [diff] [blame] | 57 | |
| 58 | @classmethod |
| 59 | def resource_setup(cls): |
| 60 | super(ImagesMetadataTestJSON, cls).resource_setup() |
Zhi Kun Liu | 22fb470 | 2014-02-27 16:15:24 +0800 | [diff] [blame] | 61 | cls.image_id = None |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 62 | |
Ken'ichi Ohmichi | 02bcdf3 | 2016-06-17 16:41:26 -0700 | [diff] [blame] | 63 | params = { |
| 64 | 'name': data_utils.rand_name('image'), |
| 65 | 'container_format': 'bare', |
| 66 | 'disk_format': 'raw' |
| 67 | } |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 68 | if CONF.image_feature_enabled.api_v1: |
Ken'ichi Ohmichi | 02bcdf3 | 2016-06-17 16:41:26 -0700 | [diff] [blame] | 69 | params.update({'is_public': False}) |
| 70 | params = {'headers': common_image.image_meta_to_headers(**params)} |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 71 | else: |
Ken'ichi Ohmichi | 02bcdf3 | 2016-06-17 16:41:26 -0700 | [diff] [blame] | 72 | params.update({'visibility': 'private'}) |
| 73 | |
| 74 | body = cls.glance_client.create_image(**params) |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 75 | body = body['image'] if 'image' in body else body |
Adam Gandelman | 7c741dc | 2014-07-14 18:21:35 -0700 | [diff] [blame] | 76 | cls.image_id = body['id'] |
Andrea Frittoli | b17f7a3 | 2017-08-29 17:45:58 +0100 | [diff] [blame] | 77 | cls.addClassResourceCleanup(test_utils.call_and_ignore_notfound_exc, |
Andrea Frittoli | f78565d | 2017-09-12 08:06:17 -0600 | [diff] [blame] | 78 | cls.glance_client.delete_image, |
Andrea Frittoli | b17f7a3 | 2017-08-29 17:45:58 +0100 | [diff] [blame] | 79 | cls.image_id) |
Sirushti Murugesan | 12dc973 | 2016-07-13 22:49:17 +0530 | [diff] [blame] | 80 | image_file = six.BytesIO((b'*' * 1024)) |
Matt Riedemann | 2aa19d4 | 2016-06-06 17:45:41 -0400 | [diff] [blame] | 81 | 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 Ohmichi | 8b9c780 | 2015-07-08 05:57:37 +0000 | [diff] [blame] | 85 | waiters.wait_for_image_status(cls.client, cls.image_id, 'ACTIVE') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 86 | |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 87 | def setUp(self): |
nayna-patel | eda1d12 | 2013-03-20 14:44:31 +0000 | [diff] [blame] | 88 | super(ImagesMetadataTestJSON, self).setUp() |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 89 | meta = {'os_version': 'value1', 'os_distro': 'value2'} |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 90 | self.client.set_image_metadata(self.image_id, meta) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 91 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 92 | @decorators.idempotent_id('37ec6edd-cf30-4c53-bd45-ae74db6b0531') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 93 | def test_list_image_metadata(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 94 | """Test listing image metadata |
| 95 | |
| 96 | All metadata key/value pairs for an image should be returned. |
| 97 | """ |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 98 | resp_metadata = self.client.list_image_metadata(self.image_id) |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 99 | expected = {'metadata': { |
| 100 | 'os_version': 'value1', 'os_distro': 'value2'}} |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 101 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 102 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 103 | @decorators.idempotent_id('ece7befc-d3ce-42a4-b4be-c3067a418c29') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 104 | def test_set_image_metadata(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 105 | """Test setting image metadata |
| 106 | |
| 107 | The metadata for the image should match the new values. |
| 108 | """ |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 109 | req_metadata = {'os_version': 'value2', 'architecture': 'value3'} |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 110 | self.client.set_image_metadata(self.image_id, |
| 111 | req_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 112 | |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 113 | resp_metadata = (self.client.list_image_metadata(self.image_id) |
| 114 | ['metadata']) |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 115 | self.assertEqual(req_metadata, resp_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 116 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 117 | @decorators.idempotent_id('7b491c11-a9d5-40fe-a696-7f7e03d3fea2') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 118 | def test_update_image_metadata(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 119 | """Test updating image medata |
| 120 | |
| 121 | The metadata for the image should match the updated values. |
| 122 | """ |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 123 | req_metadata = {'os_version': 'alt1', 'architecture': 'value3'} |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 124 | self.client.update_image_metadata(self.image_id, |
| 125 | req_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 126 | |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 127 | resp_metadata = self.client.list_image_metadata(self.image_id) |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 128 | expected = {'metadata': { |
| 129 | 'os_version': 'alt1', |
| 130 | 'os_distro': 'value2', |
| 131 | 'architecture': 'value3'}} |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 132 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 133 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 134 | @decorators.idempotent_id('4f5db52f-6685-4c75-b848-f4bb363f9aa6') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 135 | def test_get_image_metadata_item(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 136 | """Test getting image metadata item |
| 137 | |
| 138 | The value for a specific metadata key should be returned. |
| 139 | """ |
Ken'ichi Ohmichi | 0943d9b | 2015-06-17 02:27:05 +0000 | [diff] [blame] | 140 | meta = self.client.show_image_metadata_item(self.image_id, |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 141 | 'os_distro')['meta'] |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 142 | self.assertEqual('value2', meta['os_distro']) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 143 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 144 | @decorators.idempotent_id('f2de776a-4778-4d90-a5da-aae63aee64ae') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 145 | def test_set_image_metadata_item(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 146 | """Test setting image metadata item |
| 147 | |
| 148 | The value provided for the given meta item should be set for |
| 149 | the image. |
| 150 | """ |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 151 | meta = {'os_version': 'alt'} |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 152 | self.client.set_image_metadata_item(self.image_id, |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 153 | 'os_version', meta) |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 154 | resp_metadata = self.client.list_image_metadata(self.image_id) |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 155 | expected = {'metadata': {'os_version': 'alt', 'os_distro': 'value2'}} |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 156 | self.assertEqual(expected, resp_metadata) |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 157 | |
Ken'ichi Ohmichi | 6c92edf | 2017-01-27 17:32:10 -0800 | [diff] [blame] | 158 | @decorators.idempotent_id('a013796c-ba37-4bb5-8602-d944511def14') |
Daryl Walleck | ed8bef3 | 2011-12-05 23:02:08 -0600 | [diff] [blame] | 159 | def test_delete_image_metadata_item(self): |
zhufl | 4e726a6 | 2020-08-10 16:30:28 +0800 | [diff] [blame] | 160 | """Test deleting image metadata item |
| 161 | |
| 162 | The metadata value/key pair should be deleted from the image. |
| 163 | """ |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 164 | self.client.delete_image_metadata_item(self.image_id, |
Flavio Percoco | c4801a3 | 2015-01-16 17:32:19 +0100 | [diff] [blame] | 165 | 'os_version') |
David Kranz | a5299eb | 2015-01-15 17:24:05 -0500 | [diff] [blame] | 166 | resp_metadata = self.client.list_image_metadata(self.image_id) |
ghanshyam | 1756e0b | 2015-08-18 19:19:05 +0900 | [diff] [blame] | 167 | expected = {'metadata': {'os_distro': 'value2'}} |
Brian Waldon | 738cd63 | 2011-12-12 18:45:09 -0500 | [diff] [blame] | 168 | self.assertEqual(expected, resp_metadata) |