blob: 80f5a0a1793404f41e17ffe7b4501577a0cf119b [file] [log] [blame]
sapan-kona0779dfd2011-12-23 00:29:36 +05301from nose.plugins.attrib import attr
Daryl Wallecked8bef32011-12-05 23:02:08 -06002from tempest import openstack
3from tempest.common.utils.data_utils import rand_name
Daryl Wallecked8bef32011-12-05 23:02:08 -06004import unittest2 as unittest
sapan-kona0779dfd2011-12-23 00:29:36 +05305from tempest import exceptions
Daryl Wallecked8bef32011-12-05 23:02:08 -06006
7
8class ImagesMetadataTest(unittest.TestCase):
9
10 @classmethod
11 def setUpClass(cls):
12 cls.os = openstack.Manager()
13 cls.servers_client = cls.os.servers_client
14 cls.client = cls.os.images_client
15 cls.config = cls.os.config
16 cls.image_ref = cls.config.env.image_ref
17 cls.flavor_ref = cls.config.env.flavor_ref
18 cls.ssh_timeout = cls.config.nova.ssh_timeout
19
20 name = rand_name('server')
Brian Waldon738cd632011-12-12 18:45:09 -050021 resp, server = cls.servers_client.create_server(name, cls.image_ref,
22 cls.flavor_ref)
23 cls.server_id = server['id']
24
Daryl Wallecked8bef32011-12-05 23:02:08 -060025 #Wait for the server to become active
Brian Waldon738cd632011-12-12 18:45:09 -050026 cls.servers_client.wait_for_server_status(cls.server_id, 'ACTIVE')
27
28 # Snapshot the server once to save time
29 name = rand_name('image')
30 resp, _ = cls.client.create_image(cls.server_id, name, {})
31 cls.image_id = resp['location'].rsplit('/', 1)[1]
32
33 cls.client.wait_for_image_resp_code(cls.image_id, 200)
34 cls.client.wait_for_image_status(cls.image_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060035
36 @classmethod
37 def tearDownClass(cls):
Brian Waldon738cd632011-12-12 18:45:09 -050038 cls.client.delete_image(cls.image_id)
39 cls.servers_client.delete_server(cls.server_id)
Brian Lamar12d9b292011-12-08 12:41:21 -050040
Daryl Wallecked8bef32011-12-05 23:02:08 -060041 def setUp(self):
42 meta = {'key1': 'value1', 'key2': 'value2'}
Brian Waldon738cd632011-12-12 18:45:09 -050043 resp, _ = self.client.set_image_metadata(self.image_id, meta)
44 self.assertEqual(resp.status, 200)
Daryl Wallecked8bef32011-12-05 23:02:08 -060045
46 def test_list_image_metadata(self):
47 """All metadata key/value pairs for an image should be returned"""
Brian Waldon738cd632011-12-12 18:45:09 -050048 resp, resp_metadata = self.client.list_image_metadata(self.image_id)
49 expected = {'key1': 'value1', 'key2': 'value2'}
50 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060051
52 def test_set_image_metadata(self):
53 """The metadata for the image should match the new values"""
Brian Waldon738cd632011-12-12 18:45:09 -050054 req_metadata = {'meta2': 'value2', 'meta3': 'value3'}
55 resp, body = self.client.set_image_metadata(self.image_id,
56 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060057
Brian Waldon738cd632011-12-12 18:45:09 -050058 resp, resp_metadata = self.client.list_image_metadata(self.image_id)
59 self.assertEqual(req_metadata, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060060
61 def test_update_image_metadata(self):
62 """The metadata for the image should match the updated values"""
Brian Waldon738cd632011-12-12 18:45:09 -050063 req_metadata = {'key1': 'alt1', 'key3': 'value3'}
64 resp, metadata = self.client.update_image_metadata(self.image_id,
65 req_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060066
Brian Waldon738cd632011-12-12 18:45:09 -050067 resp, resp_metadata = self.client.list_image_metadata(self.image_id)
68 expected = {'key1': 'alt1', 'key2': 'value2', 'key3': 'value3'}
69 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060070
71 def test_get_image_metadata_item(self):
Brian Waldon738cd632011-12-12 18:45:09 -050072 """The value for a specific metadata key should be returned"""
73 resp, meta = self.client.get_image_metadata_item(self.image_id,
Daryl Wallecked8bef32011-12-05 23:02:08 -060074 'key2')
75 self.assertTrue('value2', meta['key2'])
76
77 def test_set_image_metadata_item(self):
78 """
79 The value provided for the given meta item should be set for the image
80 """
81 meta = {'key1': 'alt'}
Brian Waldon738cd632011-12-12 18:45:09 -050082 resp, body = self.client.set_image_metadata_item(self.image_id,
Daryl Wallecked8bef32011-12-05 23:02:08 -060083 'key1', meta)
Brian Waldon738cd632011-12-12 18:45:09 -050084 resp, resp_metadata = self.client.list_image_metadata(self.image_id)
85 expected = {'key1': 'alt', 'key2': 'value2'}
86 self.assertEqual(expected, resp_metadata)
Daryl Wallecked8bef32011-12-05 23:02:08 -060087
88 def test_delete_image_metadata_item(self):
89 """The metadata value/key pair should be deleted from the image"""
Brian Waldon738cd632011-12-12 18:45:09 -050090 resp, body = self.client.delete_image_metadata_item(self.image_id,
Daryl Wallecked8bef32011-12-05 23:02:08 -060091 'key1')
Brian Waldon738cd632011-12-12 18:45:09 -050092 resp, resp_metadata = self.client.list_image_metadata(self.image_id)
93 expected = {'key2': 'value2'}
94 self.assertEqual(expected, resp_metadata)
sapan-kona0779dfd2011-12-23 00:29:36 +053095
96 @attr(type='negative')
97 def test_list_nonexistant_image_metadata(self):
98 """Negative test: List on nonexistant image
99 metadata should not happen"""
100 try:
101 resp, resp_metadata = self.client.list_image_metadata(999)
102 except exceptions.NotFound:
103 pass
104 else:
105 self.fail('List on nonexistant image metadata should'
106 'not happen')
107
108 @attr(type='negative')
109 def test_update_nonexistant_image_metadata(self):
110 """Negative test:An update should not happen for a nonexistant image"""
111 meta = {'key1': 'alt1', 'key2': 'alt2'}
112 try:
113 resp, metadata = self.client.update_image_metadata(999, meta)
114 except exceptions.NotFound:
115 pass
116 else:
117 self.fail('An update shouldnt happen for nonexistant image')
118
119 @attr(type='negative')
120 def test_get_nonexistant_image_metadata_item(self):
121 """Negative test: Get on nonexistant image should not happen"""
122 try:
123 resp, metadata = self.client.get_image_metadata_item(999,
124 'key2')
125 except exceptions.NotFound:
126 pass
127 else:
128 self.fail('Get on nonexistant image should not happen')
129
130 @attr(type='negative')
131 def test_set_nonexistant_image_metadata(self):
132 """Negative test: Metadata should not be set to a nonexistant image"""
133 meta = {'key1': 'alt1', 'key2': 'alt2'}
134 try:
135 resp, meta = self.client.set_image_metadata(999, meta)
136 except exceptions.NotFound:
137 pass
138 else:
139 self.fail('Metadata should not be set to a nonexistant image')
140
141 @attr(type='negative')
142 def test_set_nonexistant_image_metadata_item(self):
143 """Negative test: Metadata item should not be set to a
144 nonexistant image"""
145 meta = {'key1': 'alt'}
146 try:
147 resp, body = self.client.set_image_metadata_item(999,
148 'key1', meta)
149 resp, metadata = self.client.list_image_metadata(999)
150 except exceptions.NotFound:
151 pass
152 else:
153 self.fail('Metadata item should not be set to a nonexistant image')
154
155 @attr(type='negative')
156 def test_delete_nonexistant_image_metadata_item(self):
157 """Negative test: Shouldnt be able to delete metadata
158 item from nonexistant image"""
159 try:
160 resp, body = self.client.delete_image_metadata_item(999,
161 'key1')
162 resp, metadata = self.client.list_image_metadata(999)
163 except exceptions.NotFound:
164 pass
165 else:
166 self.fail('Should not be able to delete metadata item from a'
167 'nonexistant image')