Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / image / test.py @ d8c7cccc

History | View | Annotate | Download (10.6 kB)

1 c1004a00 Stavros Sachtouris
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 c1004a00 Stavros Sachtouris
#
3 c1004a00 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 c1004a00 Stavros Sachtouris
# without modification, are permitted provided that the following
5 c1004a00 Stavros Sachtouris
# conditions are met:
6 c1004a00 Stavros Sachtouris
#
7 c1004a00 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 c1004a00 Stavros Sachtouris
#      disclaimer.
10 c1004a00 Stavros Sachtouris
#
11 c1004a00 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 c1004a00 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 c1004a00 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 c1004a00 Stavros Sachtouris
#      provided with the distribution.
15 c1004a00 Stavros Sachtouris
#
16 c1004a00 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c1004a00 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c1004a00 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c1004a00 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c1004a00 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c1004a00 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c1004a00 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c1004a00 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c1004a00 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c1004a00 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c1004a00 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c1004a00 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 c1004a00 Stavros Sachtouris
#
29 c1004a00 Stavros Sachtouris
# The views and conclusions contained in the software and
30 c1004a00 Stavros Sachtouris
# documentation are those of the authors and should not be
31 c1004a00 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 c1004a00 Stavros Sachtouris
# or implied, of GRNET S.A.
33 c1004a00 Stavros Sachtouris
34 4ba03838 Stavros Sachtouris
from mock import patch, call
35 d86c3c7d Stavros Sachtouris
from unittest import TestCase
36 4ba03838 Stavros Sachtouris
from itertools import product
37 db113224 Stavros Sachtouris
38 c1004a00 Stavros Sachtouris
from kamaki.clients import ClientError
39 c1004a00 Stavros Sachtouris
40 d86c3c7d Stavros Sachtouris
example_images = [
41 d86c3c7d Stavros Sachtouris
    {
42 d86c3c7d Stavros Sachtouris
        "status": "available",
43 d86c3c7d Stavros Sachtouris
        "name": "Archlinux",
44 d86c3c7d Stavros Sachtouris
        "disk_format": "diskdump",
45 d86c3c7d Stavros Sachtouris
        "container_format": "bare",
46 d86c3c7d Stavros Sachtouris
        "id": "b4713f20-3a41-4eaf-81ae-88698c18b3e8",
47 d86c3c7d Stavros Sachtouris
        "size": 752782848},
48 d86c3c7d Stavros Sachtouris
    {
49 d86c3c7d Stavros Sachtouris
        "status": "available",
50 d86c3c7d Stavros Sachtouris
        "name": "maelstrom",
51 d86c3c7d Stavros Sachtouris
        "disk_format": "diskdump",
52 d86c3c7d Stavros Sachtouris
        "container_format": "bare",
53 d86c3c7d Stavros Sachtouris
        "id": "0fb03e45-7d5a-4515-bd4e-e6bbf6457f06",
54 d86c3c7d Stavros Sachtouris
        "size": 2583195644},
55 d86c3c7d Stavros Sachtouris
    {
56 d86c3c7d Stavros Sachtouris
        "status": "available",
57 d86c3c7d Stavros Sachtouris
        "name": "Gardenia",
58 d86c3c7d Stavros Sachtouris
        "disk_format": "diskdump",
59 d86c3c7d Stavros Sachtouris
        "container_format": "bare",
60 d86c3c7d Stavros Sachtouris
        "id": "5963020b-ab74-4e11-bc59-90c494bbdedb",
61 d86c3c7d Stavros Sachtouris
        "size": 2589802496}]
62 d86c3c7d Stavros Sachtouris
63 e2c53122 Stavros Sachtouris
example_images_detailed = [
64 e2c53122 Stavros Sachtouris
    {
65 e2c53122 Stavros Sachtouris
        "status": "available",
66 e2c53122 Stavros Sachtouris
        "name": "Archlinux",
67 e2c53122 Stavros Sachtouris
        "checksum": "1a126aad07475b43cc1959b446344211be13974",
68 e2c53122 Stavros Sachtouris
        "created_at": "2013-01-28 22:44:54",
69 e2c53122 Stavros Sachtouris
        "disk_format": "diskdump",
70 e2c53122 Stavros Sachtouris
        "updated_at": "2013-01-28 22:44:55",
71 e2c53122 Stavros Sachtouris
        "properties": {
72 e2c53122 Stavros Sachtouris
            "partition_table": "msdos",
73 e2c53122 Stavros Sachtouris
            "osfamily": "linux",
74 e2c53122 Stavros Sachtouris
            "users": "root",
75 e2c53122 Stavros Sachtouris
            "exclude_task_assignhostname": "yes",
76 e2c53122 Stavros Sachtouris
            "os": "archlinux",
77 e2c53122 Stavros Sachtouris
            "root_partition": "1",
78 e2c53122 Stavros Sachtouris
            "description": "Archlinux base install 2012.12.01"},
79 e2c53122 Stavros Sachtouris
        "location": "pithos://us3r-I6E-1d/images/archlinux.12.2012",
80 e2c53122 Stavros Sachtouris
        "container_format": "bare",
81 e2c53122 Stavros Sachtouris
        "owner": "user163@mail.example.com",
82 e2c53122 Stavros Sachtouris
        "is_public": True,
83 e2c53122 Stavros Sachtouris
        "deleted_at": "",
84 e2c53122 Stavros Sachtouris
        "id": "b4713f20-3a41-4eaf-81ae-88698c18b3e8",
85 e2c53122 Stavros Sachtouris
        "size": 752782848},
86 e2c53122 Stavros Sachtouris
    {
87 e2c53122 Stavros Sachtouris
        "status": "available",
88 e2c53122 Stavros Sachtouris
        "name": "maelstrom",
89 e2c53122 Stavros Sachtouris
        "checksum": "b202b8c7030cb22f896c6664ac",
90 e2c53122 Stavros Sachtouris
        "created_at": "2013-02-13 10:07:42",
91 e2c53122 Stavros Sachtouris
        "disk_format": "diskdump",
92 e2c53122 Stavros Sachtouris
        "updated_at": "2013-02-13 10:07:44",
93 e2c53122 Stavros Sachtouris
        "properties": {
94 e2c53122 Stavros Sachtouris
            "partition_table": "msdos",
95 e2c53122 Stavros Sachtouris
            "osfamily": "linux",
96 e2c53122 Stavros Sachtouris
            "description": "Ubuntu 12.04.1 LTS",
97 e2c53122 Stavros Sachtouris
            "os": "ubuntu",
98 e2c53122 Stavros Sachtouris
            "root_partition": "1",
99 e2c53122 Stavros Sachtouris
            "users": "user"},
100 e2c53122 Stavros Sachtouris
        "location": "pithos://us3r-@r3n@-1d/images/mls-201302131203.diskdump",
101 e2c53122 Stavros Sachtouris
        "container_format": "bare",
102 e2c53122 Stavros Sachtouris
        "owner": "user3@mail.example.com",
103 e2c53122 Stavros Sachtouris
        "is_public": True,
104 e2c53122 Stavros Sachtouris
        "deleted_at": "",
105 e2c53122 Stavros Sachtouris
        "id": "0fb03e45-7d5a-4515-bd4e-e6bbf6457f06",
106 e2c53122 Stavros Sachtouris
        "size": 2583195648},
107 e2c53122 Stavros Sachtouris
    {
108 e2c53122 Stavros Sachtouris
        "status": "available",
109 e2c53122 Stavros Sachtouris
        "name": "Gardenia",
110 e2c53122 Stavros Sachtouris
        "checksum": "06d3099815d1f6fada91e80107638b882",
111 e2c53122 Stavros Sachtouris
        "created_at": "2013-02-13 12:35:21",
112 e2c53122 Stavros Sachtouris
        "disk_format": "diskdump",
113 e2c53122 Stavros Sachtouris
        "updated_at": "2013-02-13 12:35:23",
114 e2c53122 Stavros Sachtouris
        "properties": {
115 e2c53122 Stavros Sachtouris
            "partition_table": "msdos",
116 e2c53122 Stavros Sachtouris
            "osfamily": "linux",
117 e2c53122 Stavros Sachtouris
            "description": "Ubuntu 12.04.2 LTS",
118 e2c53122 Stavros Sachtouris
            "os": "ubuntu",
119 e2c53122 Stavros Sachtouris
            "root_partition": "1",
120 e2c53122 Stavros Sachtouris
            "users": "user"},
121 e2c53122 Stavros Sachtouris
        "location": "pithos://us3r-E-1d/images/Gardenia-201302131431.diskdump",
122 e2c53122 Stavros Sachtouris
        "container_format": "bare",
123 e2c53122 Stavros Sachtouris
        "owner": "user3@mail.example.com",
124 e2c53122 Stavros Sachtouris
        "is_public": True,
125 e2c53122 Stavros Sachtouris
        "deleted_at": "",
126 e2c53122 Stavros Sachtouris
        "id": "5963020b-ab74-4e11-bc59-90c494bbdedb",
127 e2c53122 Stavros Sachtouris
        "size": 2589802496}]
128 e2c53122 Stavros Sachtouris
129 fe5173b9 Stavros Sachtouris
130 975270f2 Stavros Sachtouris
class FR(object):
131 975270f2 Stavros Sachtouris
    json = example_images
132 975270f2 Stavros Sachtouris
    headers = {}
133 975270f2 Stavros Sachtouris
    content = json
134 975270f2 Stavros Sachtouris
    status = None
135 975270f2 Stavros Sachtouris
    status_code = 200
136 975270f2 Stavros Sachtouris
137 975270f2 Stavros Sachtouris
    def release(self):
138 975270f2 Stavros Sachtouris
        pass
139 975270f2 Stavros Sachtouris
140 975270f2 Stavros Sachtouris
khttp = 'kamaki.clients.connection.kamakicon.KamakiHTTPConnection'
141 4ba03838 Stavros Sachtouris
image_pkg = 'kamaki.clients.image.ImageClient'
142 975270f2 Stavros Sachtouris
143 975270f2 Stavros Sachtouris
144 d86c3c7d Stavros Sachtouris
class Image(TestCase):
145 d86c3c7d Stavros Sachtouris
146 4ba03838 Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
147 03493855 Stavros Sachtouris
        for k, v in d1.items():
148 03493855 Stavros Sachtouris
            self.assertTrue(k in d2)
149 03493855 Stavros Sachtouris
            if isinstance(v, dict):
150 4ba03838 Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
151 03493855 Stavros Sachtouris
            else:
152 03493855 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
153 03493855 Stavros Sachtouris
154 c1004a00 Stavros Sachtouris
    def setUp(self):
155 d86c3c7d Stavros Sachtouris
        self.url = 'http://image.example.com'
156 d86c3c7d Stavros Sachtouris
        self.token = 'an1m@g370k3n=='
157 d86c3c7d Stavros Sachtouris
        from kamaki.clients.image import ImageClient
158 d86c3c7d Stavros Sachtouris
        self.client = ImageClient(self.url, self.token)
159 d86c3c7d Stavros Sachtouris
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
160 d86c3c7d Stavros Sachtouris
        self.C = KamakiHTTPConnection
161 c1004a00 Stavros Sachtouris
162 c1004a00 Stavros Sachtouris
    def tearDown(self):
163 975270f2 Stavros Sachtouris
        FR.json = example_images
164 975270f2 Stavros Sachtouris
        FR.status_code = 200
165 c1004a00 Stavros Sachtouris
166 4ba03838 Stavros Sachtouris
    @patch('%s.get' % image_pkg, return_value=FR())
167 4ba03838 Stavros Sachtouris
    def test_list_public(self, get):
168 4ba03838 Stavros Sachtouris
        a_filter = dict(size_max=42)
169 4ba03838 Stavros Sachtouris
        for args in product((False, True), ({}, a_filter), ('', '-')):
170 4ba03838 Stavros Sachtouris
            (detail, filters, order) = args
171 4ba03838 Stavros Sachtouris
            r = self.client.list_public(*args)
172 4ba03838 Stavros Sachtouris
            filters['sort_dir'] = 'desc' if order.startswith('-') else 'asc'
173 4ba03838 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
174 4ba03838 Stavros Sachtouris
                '/images/%s' % ('detail' if detail else ''),
175 4ba03838 Stavros Sachtouris
                async_params=filters, success=200))
176 4ba03838 Stavros Sachtouris
            for i in range(len(r)):
177 4ba03838 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], example_images[i])
178 d86c3c7d Stavros Sachtouris
179 d55c06f0 Stavros Sachtouris
    @patch('%s.head' % image_pkg, return_value=FR())
180 d55c06f0 Stavros Sachtouris
    def test_get_meta(self, head):
181 e2c53122 Stavros Sachtouris
        img0 = example_images[0]
182 975270f2 Stavros Sachtouris
        FR.json = img0
183 e2c53122 Stavros Sachtouris
        img0_headers = {}
184 e2c53122 Stavros Sachtouris
        for k, v in example_images_detailed[0].items():
185 e2c53122 Stavros Sachtouris
            img0_headers['x-image-meta-%s' % k] = v
186 975270f2 Stavros Sachtouris
        FR.headers = img0_headers
187 975270f2 Stavros Sachtouris
        r = self.client.get_meta(img0['id'])
188 d55c06f0 Stavros Sachtouris
        head.assert_called_once_with('/images/%s' % img0['id'], success=200)
189 975270f2 Stavros Sachtouris
        self.assertEqual(r['id'], img0['id'])
190 4ba03838 Stavros Sachtouris
        self.assert_dicts_are_equal(r, example_images_detailed[0])
191 e2c53122 Stavros Sachtouris
192 f875dd02 Stavros Sachtouris
    @patch('%s.set_header' % image_pkg, return_value=FR())
193 f875dd02 Stavros Sachtouris
    @patch('%s.post' % image_pkg, return_value=FR())
194 f875dd02 Stavros Sachtouris
    def test_register(self, post, SH):
195 fe5173b9 Stavros Sachtouris
        img0 = example_images_detailed[0]
196 fe5173b9 Stavros Sachtouris
        img0_location = img0['location']
197 fe5173b9 Stavros Sachtouris
        img0_name = 'A new img0 name'
198 f875dd02 Stavros Sachtouris
        prfx = 'x-image-meta-'
199 f875dd02 Stavros Sachtouris
        proprfx = 'x-image-meta-property-'
200 f875dd02 Stavros Sachtouris
        keys = [
201 f875dd02 Stavros Sachtouris
            'id', 'store', 'dist_format', 'container_format',
202 f875dd02 Stavros Sachtouris
            'size', 'checksum', 'is_public', 'owner']
203 f875dd02 Stavros Sachtouris
        for args in product(
204 f875dd02 Stavros Sachtouris
                ('v_id', None), ('v_store', None),
205 f875dd02 Stavros Sachtouris
                ('v_dist_format', None), ('v_container_format', None),
206 f875dd02 Stavros Sachtouris
                ('v_size', None), ('v_checksum', None),
207 f875dd02 Stavros Sachtouris
                ('v_is_public', None), ('v_owner', None)):
208 f875dd02 Stavros Sachtouris
            params = dict()
209 f875dd02 Stavros Sachtouris
            async_headers = dict()
210 f875dd02 Stavros Sachtouris
            props = dict()
211 f875dd02 Stavros Sachtouris
            for i, k in enumerate(keys):
212 f875dd02 Stavros Sachtouris
                if args[i]:
213 f875dd02 Stavros Sachtouris
                    params[k] = args[i]
214 f875dd02 Stavros Sachtouris
                    async_headers['%s%s' % (prfx, k)] = args[i]
215 f875dd02 Stavros Sachtouris
                    props['%s%s' % (proprfx, args[i])] = k
216 f875dd02 Stavros Sachtouris
            async_headers.update(props)
217 f875dd02 Stavros Sachtouris
        self.client.register(
218 f875dd02 Stavros Sachtouris
            img0_name, img0_location,
219 f875dd02 Stavros Sachtouris
            params=params, properties=props)
220 f875dd02 Stavros Sachtouris
        self.assertEqual(
221 f875dd02 Stavros Sachtouris
            post.mock_calls[-1],
222 f875dd02 Stavros Sachtouris
            call('/images/', async_headers=async_headers, success=200))
223 f875dd02 Stavros Sachtouris
        self.assertEqual(SH.mock_calls[-2:], [
224 f875dd02 Stavros Sachtouris
            call('X-Image-Meta-Name', img0_name),
225 f875dd02 Stavros Sachtouris
            call('X-Image-Meta-Location', img0_location)])
226 c1004a00 Stavros Sachtouris
227 80643233 Stavros Sachtouris
    @patch('%s.put' % image_pkg, return_value=FR())
228 80643233 Stavros Sachtouris
    def test_set_members(self, put):
229 03314970 Stavros Sachtouris
        img0 = example_images_detailed[0]
230 03314970 Stavros Sachtouris
        members = ['use3r-1d-0', 'us2r-1d-1', 'us3r-1d-2']
231 975270f2 Stavros Sachtouris
        self.client.set_members(img0['id'], members)
232 80643233 Stavros Sachtouris
        put.assert_called_once_with(
233 80643233 Stavros Sachtouris
            '/images/%s/members' % img0['id'],
234 80643233 Stavros Sachtouris
            json=dict(memberships=[dict(member_id=m) for m in members]),
235 80643233 Stavros Sachtouris
            success=204)
236 c1004a00 Stavros Sachtouris
237 5a745d8a Stavros Sachtouris
    @patch('%s.put' % image_pkg, return_value=FR())
238 5a745d8a Stavros Sachtouris
    def test_list_members(self, get):
239 5a745d8a Stavros Sachtouris
        imgid = example_images_detailed[0]['id']
240 d01f7d92 Stavros Sachtouris
        members = ['use3r-1d-0', 'us2r-1d-1', 'us3r-1d-2']
241 975270f2 Stavros Sachtouris
        FR.json = dict(members=members)
242 5a745d8a Stavros Sachtouris
        r = self.client.list_members(imgid)
243 5a745d8a Stavros Sachtouris
        get.assert_called_once_with('/images/%s/members' % imgid, success=200)
244 975270f2 Stavros Sachtouris
        self.assertEqual(r, members)
245 c1004a00 Stavros Sachtouris
246 d8c7cccc Stavros Sachtouris
    @patch('%s.put' % image_pkg, return_value=FR())
247 d8c7cccc Stavros Sachtouris
    def test_add_member(self, put):
248 d8c7cccc Stavros Sachtouris
        imgid = example_images_detailed[0]['id']
249 04f0c625 Stavros Sachtouris
        new_member = 'us3r-15-n3w'
250 d8c7cccc Stavros Sachtouris
        self.client.add_member(imgid, new_member)
251 d8c7cccc Stavros Sachtouris
        put.assert_called_once_with(
252 d8c7cccc Stavros Sachtouris
            '/images/%s/members/%s' % (imgid, new_member),
253 d8c7cccc Stavros Sachtouris
            success=204)
254 04f0c625 Stavros Sachtouris
255 975270f2 Stavros Sachtouris
    @patch('%s.perform_request' % khttp, return_value=FR())
256 975270f2 Stavros Sachtouris
    def test_remove_member(self, PR):
257 e09db3c4 Stavros Sachtouris
        img0 = example_images_detailed[0]
258 e09db3c4 Stavros Sachtouris
        old_member = 'us3r-15-0ld'
259 975270f2 Stavros Sachtouris
        self.assertRaises(
260 975270f2 Stavros Sachtouris
            ClientError,
261 975270f2 Stavros Sachtouris
            self.client.remove_member,
262 975270f2 Stavros Sachtouris
            img0['id'], old_member)
263 975270f2 Stavros Sachtouris
        FR.status_code = 204
264 975270f2 Stavros Sachtouris
        self.client.remove_member(img0['id'], old_member)
265 975270f2 Stavros Sachtouris
        self.assertEqual(self.client.http_client.url, self.url)
266 975270f2 Stavros Sachtouris
        self.assertEqual(
267 975270f2 Stavros Sachtouris
            self.client.http_client.path,
268 975270f2 Stavros Sachtouris
            '/images/%s/members/%s' % (img0['id'], old_member))
269 c1004a00 Stavros Sachtouris
270 975270f2 Stavros Sachtouris
    @patch('%s.perform_request' % khttp, return_value=FR())
271 975270f2 Stavros Sachtouris
    def test_list_shared(self, PR):
272 785b478b Stavros Sachtouris
        img0 = example_images_detailed[0]
273 975270f2 Stavros Sachtouris
        FR.json = dict(shared_images=example_images)
274 975270f2 Stavros Sachtouris
        r = self.client.list_shared(img0['id'])
275 975270f2 Stavros Sachtouris
        self.assertEqual(self.client.http_client.url, self.url)
276 975270f2 Stavros Sachtouris
        self.assertEqual(
277 975270f2 Stavros Sachtouris
            self.client.http_client.path,
278 975270f2 Stavros Sachtouris
            '/shared-images/%s' % img0['id'])
279 975270f2 Stavros Sachtouris
        for i in range(len(r)):
280 4ba03838 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], example_images[i])
281 85898ca4 Stavros Sachtouris
282 85898ca4 Stavros Sachtouris
if __name__ == '__main__':
283 85898ca4 Stavros Sachtouris
    from sys import argv
284 85898ca4 Stavros Sachtouris
    from kamaki.clients.test import runTestCase
285 85898ca4 Stavros Sachtouris
    runTestCase(Image, 'Plankton Client', argv[1:])