blob: 263a7711dd4086dcfe1e0682eeac300f73957fb5 [file] [log] [blame]
Daryl Walleck416af922011-11-22 22:28:33 -06001from nose.plugins.attrib import attr
2from storm import openstack
3from storm.common.utils.data_utils import rand_name
4import storm.config
5import unittest2 as unittest
6
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 = storm.config.StormConfig()
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')
21 resp, cls.server = cls.servers_client.create_server(name,
22 cls.image_ref,
23 cls.flavor_ref)
24 #Wait for the server to become active
25 cls.servers_client.wait_for_server_status(cls.server['id'], 'ACTIVE')
26
27 #Create an image from the server
28 name = rand_name('image')
29 cls.meta = {'key1': 'value1', 'key2': 'value2'}
30 resp, body = cls.client.create_image(cls.server['id'], name, cls.meta)
31 image_ref = resp['location']
32 temp = image_ref.rsplit('/')
33 image_id = temp[len(temp) - 1]
34
35 cls.client.wait_for_image_resp_code(image_id, 200)
36 cls.client.wait_for_image_status(image_id, 'ACTIVE')
37 resp, cls.image = cls.client.get_image(image_id)
38
39 @classmethod
40 def tearDownClass(cls):
41 cls.servers_client.delete_server(cls.server['id'])
42 cls.client.delete_image(cls.image['id'])
43
44 def _parse_image_id(self, image_ref):
45 temp = image_ref.rsplit('/')
46 return len(temp) - 1
47
48 def test_list_image_metadata(self):
49 """All metadata key/value pairs for an image should be returned"""
50 resp, metadata = self.client.list_image_metadata(self.image['id'])
51 self.assertEqual('value1', metadata['key1'])
52 self.assertEqual('value2', metadata['key2'])
53
54 def test_set_image_metadata(self):
55 """The metadata for the image should match the new values"""
56 meta = {'meta1': 'data1'}
57 name = rand_name('server')
58 resp, server = self.servers_client.create_server(name, self.image_ref,
59 self.flavor_ref)
60 self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
61
62 name = rand_name('image')
63 resp, body = self.client.create_image(server['id'], name, meta)
64 image_id = self._parse_image_id(resp['location'])
65 self.client.wait_for_image_resp_code(image_id, 200)
66 self.client.wait_for_image_status(image_id, 'ACTIVE')
67 resp, image = self.client.get_image(image_id)
68
69 meta = {'meta2': 'data2', 'meta3': 'data3'}
70 resp, body = self.client.set_image_metadata(image['id'], meta)
71
72 resp, metadata = self.client.list_image_metadata(image['id'])
73 self.assertEqual('data2', metadata['meta2'])
74 self.assertEqual('data3', metadata['meta3'])
75 self.assertTrue('meta1' not in metadata)
76
77 self.servers_client.delete_server(server['id'])
78 self.client.delete_image(image['id'])
79
80 def test_update_image_metadata(self):
81 """The metadata for the image should match the updated values"""
82 meta = {'key1': 'value1', 'key2': 'value2'}
83 name = rand_name('server')
84 resp, server = self.servers_client.create_server(name, self.image_ref,
85 self.flavor_ref)
86 self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
87
88 name = rand_name('image')
89 resp, body = self.client.create_image(server['id'], name, meta)
90 image_id = self._parse_image_id(resp['location'])
91 self.client.wait_for_image_resp_code(image_id, 200)
92 self.client.wait_for_image_status(image_id, 'ACTIVE')
93 resp, image = self.client.get_image(image_id)
94
95 meta = {'key1': 'alt1', 'key2': 'alt2'}
96 resp, metadata = self.client.update_image_metadata(image['id'], meta)
97
98 resp, metadata = self.client.list_image_metadata(image['id'])
99 self.assertEqual('alt1', metadata['key1'])
100 self.assertEqual('alt2', metadata['key2'])
101
102 self.servers_client.delete_server(server['id'])
103 self.client.delete_image(image['id'])
104
105 def test_get_image_metadata_item(self):
106 """The value for a specic metadata key should be returned"""
107 resp, meta = self.client.get_image_metadata_item(self.image['id'],
108 'key2')
109 self.assertTrue('value2', meta['key2'])
110
111 def test_set_image_metadata_item(self):
112 """
113 The value provided for the given meta item should be set for the image
114 """
115 meta = {'nova': 'server'}
116 name = rand_name('server')
117 resp, server = self.servers_client.create_server(name, self.image_ref,
118 self.flavor_ref)
119 self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
120
121 name = rand_name('image')
122 resp, body = self.client.create_image(server['id'], name, meta)
123 image_id = self._parse_image_id(resp['location'])
124 self.client.wait_for_image_resp_code(image_id, 200)
125 self.client.wait_for_image_status(image_id, 'ACTIVE')
126 resp, image = self.client.get_image(image_id)
127
128 meta = {'nova': 'alt'}
129 resp, body = self.client.set_image_metadata_item(image['id'],
130 'nova', meta)
131 resp, metadata = self.client.list_image_metadata(image['id'])
132 self.assertEqual('alt', metadata['nova'])
133
134 self.servers_client.delete_server(server['id'])
135 self.client.delete_image(image['id'])
136
137 def test_delete_image_metadata_item(self):
138 """The metadata value/key pair should be deleted from the image"""
139 meta = {'delkey': 'delvalue'}
140 name = rand_name('server')
141 resp, server = self.servers_client.create_server(name, self.image_ref,
142 self.flavor_ref)
143 self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
144
145 name = rand_name('image')
146 resp, body = self.client.create_image(server['id'], name, meta)
147 image_id = self._parse_image_id(resp['location'])
148 self.client.wait_for_image_resp_code(image_id, 200)
149 self.client.wait_for_image_status(image_id, 'ACTIVE')
150 resp, image = self.client.get_image(image_id)
151
152 resp, body = self.client.delete_image_metadata_item(image['id'],
153 'delkey')
154 resp, metadata = self.client.list_image_metadata(image['id'])
155 self.assertTrue('delkey' not in metadata)
156
157 self.servers_client.delete_server(server['id'])
158 self.client.delete_image(image['id'])