Revision 7b6e977c
b/kamaki/cli/commands/image_cli.py | ||
---|---|---|
202 | 202 |
if self['update']: |
203 | 203 |
self.client.reregister(location, name, params, properties) |
204 | 204 |
else: |
205 |
self.client.register(name, location, params, properties) |
|
205 |
r = self.client.register(name, location, params, properties) |
|
206 |
print_dict(r) |
|
206 | 207 |
|
207 | 208 |
def main(self, name, location): |
208 | 209 |
super(self.__class__, self)._run() |
b/kamaki/clients/image/__init__.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
from kamaki.clients import Client, ClientError |
35 |
from kamaki.clients.utils import path4url |
|
35 |
from kamaki.clients.utils import path4url, filter_in
|
|
36 | 36 |
|
37 | 37 |
|
38 | 38 |
class ImageClient(Client): |
... | ... | |
109 | 109 |
disc_format, container_format, size, checksum, is_public, owner |
110 | 110 |
|
111 | 111 |
:param properties: (dict) image properties (X-Image-Meta-Property) |
112 |
|
|
113 |
:returns: (dict) details of the created image |
|
112 | 114 |
""" |
113 | 115 |
path = path4url('images') + '/' |
114 | 116 |
self.set_header('X-Image-Meta-Name', name) |
... | ... | |
124 | 126 |
for key, val in properties.items(): |
125 | 127 |
async_headers['x-image-meta-property-%s' % key] = val |
126 | 128 |
|
127 |
self.post(path, success=200, async_headers=async_headers) |
|
129 |
r = self.post(path, success=200, async_headers=async_headers) |
|
130 |
return filter_in(r.headers, 'X-Image-') |
|
128 | 131 |
|
129 | 132 |
def list_members(self, image_id): |
130 | 133 |
""" |
b/kamaki/clients/image/test.py | ||
---|---|---|
35 | 35 |
from unittest import TestCase |
36 | 36 |
from itertools import product |
37 | 37 |
|
38 |
example_image_headers = { |
|
39 |
'x-image-meta-id': '3edd4d15-41b4-4a39-9601-015ef56b3bb3', |
|
40 |
'x-image-meta-checksum': 'df23837c30889252c0aed80b6f770a53a86', |
|
41 |
'x-image-meta-container-format': 'bare', |
|
42 |
'x-image-meta-location': 'pithos://a13528163db/con/obj_13.0', |
|
43 |
'x-image-meta-disk-format': 'diskdump', |
|
44 |
'x-image-meta-is-public': 'True', |
|
45 |
'x-image-meta-status': 'available', |
|
46 |
'x-image-meta-deleted-at': '', |
|
47 |
'x-image-meta-updated-at': '2013-04-11 15:22:39', |
|
48 |
'x-image-meta-created-at': '2013-04-11 15:22:37', |
|
49 |
'x-image-meta-owner': 'a13529bb3c3db', |
|
50 |
'x-image-meta-size': '1073741824', |
|
51 |
'x-image-meta-name': 'img_1365686546.0', |
|
52 |
'extraheaders': 'should be ignored' |
|
53 |
} |
|
38 | 54 |
example_images = [ |
39 | 55 |
{ |
40 | 56 |
"status": "available", |
... | ... | |
185 | 201 |
@patch('%s.post' % image_pkg, return_value=FR()) |
186 | 202 |
def test_register(self, post, SH): |
187 | 203 |
img0 = example_images_detailed[0] |
204 |
FR.headers = example_image_headers |
|
188 | 205 |
img0_location = img0['location'] |
189 | 206 |
img0_name = 'A new img0 name' |
190 | 207 |
prfx = 'x-image-meta-' |
... | ... | |
206 | 223 |
async_headers['%s%s' % (prfx, k)] = args[i] |
207 | 224 |
props['%s%s' % (proprfx, args[i])] = k |
208 | 225 |
async_headers.update(props) |
209 |
self.client.register( |
|
226 |
r = self.client.register(
|
|
210 | 227 |
img0_name, img0_location, |
211 | 228 |
params=params, properties=props) |
229 |
expectedict = dict(example_image_headers) |
|
230 |
expectedict.pop('extraheaders') |
|
231 |
self.assert_dicts_are_equal(expectedict, r) |
|
212 | 232 |
self.assertEqual( |
213 | 233 |
post.mock_calls[-1], |
214 | 234 |
call('/images/', async_headers=async_headers, success=200)) |
b/kamaki/clients/livetest/image.py | ||
---|---|---|
39 | 39 |
from kamaki.clients import ClientError |
40 | 40 |
|
41 | 41 |
|
42 |
IMGMETA = set([ |
|
43 |
'id', 'name', 'checksum', 'container-format', 'location', 'disk-format', |
|
44 |
'is-public', 'status', 'deleted-at', 'updated-at', 'created-at', 'owner', |
|
45 |
'size']) |
|
46 |
|
|
47 |
|
|
42 | 48 |
class Image(livetest.Generic): |
43 | 49 |
def setUp(self): |
44 | 50 |
self.now = time.mktime(time.gmtime()) |
... | ... | |
49 | 55 |
cyclades_url = self['compute', 'url'] |
50 | 56 |
self.cyclades = CycladesClient(cyclades_url, self['token']) |
51 | 57 |
self._imglist = {} |
58 |
self._imgdetails = {} |
|
52 | 59 |
|
53 | 60 |
def test_000(self): |
54 | 61 |
self._prepare_img() |
... | ... | |
73 | 80 |
print('\t- ok') |
74 | 81 |
f.close() |
75 | 82 |
|
76 |
self.client.register( |
|
83 |
r = self.client.register(
|
|
77 | 84 |
self.imgname, |
78 | 85 |
self.location, |
79 | 86 |
params=dict(is_public=True)) |
80 |
img = self._get_img_by_name(self.imgname) |
|
81 |
self._imglist[self.imgname] = img |
|
87 |
self._imglist[self.imgname] = dict( |
|
88 |
name=r['x-image-meta-name'], id=r['x-image-meta-id']) |
|
89 |
self._imgdetails[self.imgname] = r |
|
82 | 90 |
|
83 | 91 |
def tearDown(self): |
84 | 92 |
for img in self._imglist.values(): |
... | ... | |
200 | 208 |
self.assertTrue(self._imglist) |
201 | 209 |
for img in self._imglist.values(): |
202 | 210 |
self.assertTrue(img is not None) |
211 |
r = set(self._imgdetails[img['name']].keys()) |
|
212 |
self.assertTrue( |
|
213 |
r.issubset(['x-image-meta-%s' % k for k in IMGMETA])) |
|
203 | 214 |
|
204 | 215 |
def test_set_members(self): |
205 | 216 |
"""Test set_members""" |
Also available in: Unified diff