Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / image / test.py @ 10e6c39a

History | View | Annotate | Download (10.4 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 10e6c39a Stavros Sachtouris
    @patch('%s.delete' % image_pkg, return_value=FR())
256 10e6c39a Stavros Sachtouris
    def test_remove_member(self, delete):
257 10e6c39a Stavros Sachtouris
        imgid = example_images_detailed[0]['id']
258 e09db3c4 Stavros Sachtouris
        old_member = 'us3r-15-0ld'
259 10e6c39a Stavros Sachtouris
        self.client.remove_member(imgid, old_member)
260 10e6c39a Stavros Sachtouris
        delete.assert_called_once_with(
261 10e6c39a Stavros Sachtouris
            '/images/%s/members/%s' % (imgid, old_member),
262 10e6c39a Stavros Sachtouris
            success=204)
263 c1004a00 Stavros Sachtouris
264 975270f2 Stavros Sachtouris
    @patch('%s.perform_request' % khttp, return_value=FR())
265 975270f2 Stavros Sachtouris
    def test_list_shared(self, PR):
266 785b478b Stavros Sachtouris
        img0 = example_images_detailed[0]
267 975270f2 Stavros Sachtouris
        FR.json = dict(shared_images=example_images)
268 975270f2 Stavros Sachtouris
        r = self.client.list_shared(img0['id'])
269 975270f2 Stavros Sachtouris
        self.assertEqual(self.client.http_client.url, self.url)
270 975270f2 Stavros Sachtouris
        self.assertEqual(
271 975270f2 Stavros Sachtouris
            self.client.http_client.path,
272 975270f2 Stavros Sachtouris
            '/shared-images/%s' % img0['id'])
273 975270f2 Stavros Sachtouris
        for i in range(len(r)):
274 4ba03838 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], example_images[i])
275 85898ca4 Stavros Sachtouris
276 85898ca4 Stavros Sachtouris
if __name__ == '__main__':
277 85898ca4 Stavros Sachtouris
    from sys import argv
278 85898ca4 Stavros Sachtouris
    from kamaki.clients.test import runTestCase
279 85898ca4 Stavros Sachtouris
    runTestCase(Image, 'Plankton Client', argv[1:])