Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (13 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 d86c3c7d Stavros Sachtouris
from mock import patch
35 c1004a00 Stavros Sachtouris
import time
36 c1004a00 Stavros Sachtouris
37 d86c3c7d Stavros Sachtouris
from unittest import TestCase
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 d86c3c7d Stavros Sachtouris
class Image(TestCase):
131 d86c3c7d Stavros Sachtouris
132 d86c3c7d Stavros Sachtouris
    class FR(object):
133 d86c3c7d Stavros Sachtouris
        json = example_images
134 d86c3c7d Stavros Sachtouris
        headers = {}
135 d86c3c7d Stavros Sachtouris
        content = json
136 d86c3c7d Stavros Sachtouris
        status = None
137 d86c3c7d Stavros Sachtouris
        status_code = 200
138 c1004a00 Stavros Sachtouris
139 fe5173b9 Stavros Sachtouris
        def release(self):
140 fe5173b9 Stavros Sachtouris
            pass
141 fe5173b9 Stavros Sachtouris
142 c1004a00 Stavros Sachtouris
    def setUp(self):
143 c1004a00 Stavros Sachtouris
        self.now = time.mktime(time.gmtime())
144 c1004a00 Stavros Sachtouris
        self.imgname = 'img_%s' % self.now
145 d86c3c7d Stavros Sachtouris
        self.url = 'http://image.example.com'
146 d86c3c7d Stavros Sachtouris
        self.token = 'an1m@g370k3n=='
147 d86c3c7d Stavros Sachtouris
        from kamaki.clients.image import ImageClient
148 d86c3c7d Stavros Sachtouris
        self.client = ImageClient(self.url, self.token)
149 d86c3c7d Stavros Sachtouris
        self.cyclades_url = 'http://cyclades.example.com'
150 d86c3c7d Stavros Sachtouris
        from kamaki.clients.cyclades import CycladesClient
151 d86c3c7d Stavros Sachtouris
        self.cyclades = CycladesClient(self.cyclades_url, self.token)
152 d86c3c7d Stavros Sachtouris
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
153 d86c3c7d Stavros Sachtouris
        self.C = KamakiHTTPConnection
154 c1004a00 Stavros Sachtouris
155 c1004a00 Stavros Sachtouris
    def tearDown(self):
156 d86c3c7d Stavros Sachtouris
        self.FR.json = example_images
157 03314970 Stavros Sachtouris
        self.FR.status_code = 200
158 c1004a00 Stavros Sachtouris
159 c1004a00 Stavros Sachtouris
    def assert_dicts_are_deeply_equal(self, d1, d2):
160 c1004a00 Stavros Sachtouris
        for k, v in d1.items():
161 c1004a00 Stavros Sachtouris
            self.assertTrue(k in d2)
162 c1004a00 Stavros Sachtouris
            if isinstance(v, dict):
163 c1004a00 Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(v, d2[k])
164 c1004a00 Stavros Sachtouris
            else:
165 c1004a00 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
166 c1004a00 Stavros Sachtouris
167 c1004a00 Stavros Sachtouris
    def test_list_public(self):
168 d86c3c7d Stavros Sachtouris
        with patch.object(
169 d86c3c7d Stavros Sachtouris
            self.C,
170 d86c3c7d Stavros Sachtouris
            'perform_request',
171 d86c3c7d Stavros Sachtouris
            return_value=self.FR()) as perform_req:
172 d86c3c7d Stavros Sachtouris
            r = self.client.list_public()
173 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
174 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/images/')
175 d86c3c7d Stavros Sachtouris
            params = perform_req.call_args[0][3]
176 d86c3c7d Stavros Sachtouris
            self.assertEqual(params['sort_dir'], 'asc')
177 d86c3c7d Stavros Sachtouris
            for i in range(len(r)):
178 d86c3c7d Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(r[i], example_images[i])
179 d86c3c7d Stavros Sachtouris
180 d86c3c7d Stavros Sachtouris
            r = self.client.list_public(order='-')
181 d86c3c7d Stavros Sachtouris
            params = perform_req.call_args[0][3]
182 d86c3c7d Stavros Sachtouris
            self.assertEqual(params['sort_dir'], 'desc')
183 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
184 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/images/')
185 d86c3c7d Stavros Sachtouris
186 e2c53122 Stavros Sachtouris
            self.FR.json = example_images_detailed
187 d86c3c7d Stavros Sachtouris
            r = self.client.list_public(detail=True)
188 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
189 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/images/detail')
190 e2c53122 Stavros Sachtouris
            for i in range(len(r)):
191 e2c53122 Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(
192 e2c53122 Stavros Sachtouris
                    r[i],
193 e2c53122 Stavros Sachtouris
                    example_images_detailed[i])
194 d86c3c7d Stavros Sachtouris
195 d86c3c7d Stavros Sachtouris
            size_max = 1000000000
196 d86c3c7d Stavros Sachtouris
            r = self.client.list_public(filters=dict(size_max=size_max))
197 d86c3c7d Stavros Sachtouris
            params = perform_req.call_args[0][3]
198 d86c3c7d Stavros Sachtouris
            self.assertEqual(params['size_max'], size_max)
199 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
200 d86c3c7d Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/images/')
201 d86c3c7d Stavros Sachtouris
202 c1004a00 Stavros Sachtouris
    def test_get_meta(self):
203 e2c53122 Stavros Sachtouris
        img0 = example_images[0]
204 e2c53122 Stavros Sachtouris
        self.FR.json = img0
205 e2c53122 Stavros Sachtouris
        img0_headers = {}
206 e2c53122 Stavros Sachtouris
        for k, v in example_images_detailed[0].items():
207 e2c53122 Stavros Sachtouris
            img0_headers['x-image-meta-%s' % k] = v
208 e2c53122 Stavros Sachtouris
        self.FR.headers = img0_headers
209 e2c53122 Stavros Sachtouris
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
210 e2c53122 Stavros Sachtouris
            r = self.client.get_meta(img0['id'])
211 e2c53122 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
212 e2c53122 Stavros Sachtouris
            expected_path = '/images/%s' % img0['id']
213 e2c53122 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, expected_path)
214 c1004a00 Stavros Sachtouris
215 e2c53122 Stavros Sachtouris
            self.assertEqual(r['id'], img0['id'])
216 e2c53122 Stavros Sachtouris
            self.assert_dicts_are_deeply_equal(r, example_images_detailed[0])
217 e2c53122 Stavros Sachtouris
218 c1004a00 Stavros Sachtouris
    def test_register(self):
219 fe5173b9 Stavros Sachtouris
        img0 = example_images_detailed[0]
220 fe5173b9 Stavros Sachtouris
        img0_location = img0['location']
221 fe5173b9 Stavros Sachtouris
        img0_name = 'A new img0 name'
222 fe5173b9 Stavros Sachtouris
        with patch.object(
223 fe5173b9 Stavros Sachtouris
                self.C,
224 fe5173b9 Stavros Sachtouris
                'perform_request',
225 fe5173b9 Stavros Sachtouris
                return_value=self.FR()) as perform_req:
226 fe5173b9 Stavros Sachtouris
            self.client.register(img0_name, img0_location)
227 fe5173b9 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
228 fe5173b9 Stavros Sachtouris
            self.assertEqual(self.client.http_client.path, '/images/')
229 fe5173b9 Stavros Sachtouris
            (method, data, headers, params) = perform_req.call_args[0]
230 fe5173b9 Stavros Sachtouris
            self.assertEqual(method, 'post')
231 fe5173b9 Stavros Sachtouris
            self.assertTrue(0 == len(params))
232 c1004a00 Stavros Sachtouris
233 fe5173b9 Stavros Sachtouris
            val = 'Some random value'
234 fe5173b9 Stavros Sachtouris
            param_dict = dict(
235 fe5173b9 Stavros Sachtouris
                id=val,
236 fe5173b9 Stavros Sachtouris
                store=val,
237 fe5173b9 Stavros Sachtouris
                disk_format=val,
238 fe5173b9 Stavros Sachtouris
                container_format=val,
239 fe5173b9 Stavros Sachtouris
                size=val,
240 fe5173b9 Stavros Sachtouris
                checksum=val,
241 fe5173b9 Stavros Sachtouris
                is_public=val,
242 fe5173b9 Stavros Sachtouris
                owner=val)
243 fe5173b9 Stavros Sachtouris
            for key in param_dict.keys():
244 fe5173b9 Stavros Sachtouris
                param = {key: val}
245 fe5173b9 Stavros Sachtouris
                self.client.register(img0_name, img0_location, params=param)
246 fe5173b9 Stavros Sachtouris
                (method, data, a_headers, a_params) = perform_req.call_args[0]
247 fe5173b9 Stavros Sachtouris
                key = 'x-image-meta-%s' % key.replace('_', '-')
248 fe5173b9 Stavros Sachtouris
                self.assertEqual(a_headers[key], val)
249 fe5173b9 Stavros Sachtouris
            self.client.register(img0_name, img0_location, params=param_dict)
250 fe5173b9 Stavros Sachtouris
            (method, data, a_headers, a_params) = perform_req.call_args[0]
251 fe5173b9 Stavros Sachtouris
            self.assertEqual(len(param_dict), len(a_headers))
252 fe5173b9 Stavros Sachtouris
            for key, val in param_dict.items():
253 fe5173b9 Stavros Sachtouris
                key = 'x-image-meta-%s' % key.replace('_', '-')
254 fe5173b9 Stavros Sachtouris
                self.assertEqual(a_headers[key], val)
255 c1004a00 Stavros Sachtouris
256 fe5173b9 Stavros Sachtouris
            props = dict(key0='val0', key2='val2', key3='val3')
257 fe5173b9 Stavros Sachtouris
            self.client.register(img0_name, img0_location, properties=props)
258 fe5173b9 Stavros Sachtouris
            (method, data, a_headers, a_params) = perform_req.call_args[0]
259 fe5173b9 Stavros Sachtouris
            for k, v in props.items():
260 fe5173b9 Stavros Sachtouris
                self.assertEquals(a_headers['X-Image-Meta-Property-%s' % k], v)
261 c1004a00 Stavros Sachtouris
262 c1004a00 Stavros Sachtouris
    def test_set_members(self):
263 03314970 Stavros Sachtouris
        img0 = example_images_detailed[0]
264 03314970 Stavros Sachtouris
        members = ['use3r-1d-0', 'us2r-1d-1', 'us3r-1d-2']
265 03314970 Stavros Sachtouris
        with patch.object(
266 03314970 Stavros Sachtouris
                self.C,
267 03314970 Stavros Sachtouris
                'perform_request',
268 03314970 Stavros Sachtouris
                return_value=self.FR()) as perform_req:
269 03314970 Stavros Sachtouris
            self.assertRaises(
270 03314970 Stavros Sachtouris
                ClientError,
271 03314970 Stavros Sachtouris
                self.client.set_members,
272 03314970 Stavros Sachtouris
                img0['id'], members)
273 03314970 Stavros Sachtouris
            self.FR.status_code = 204
274 03314970 Stavros Sachtouris
            self.client.set_members(img0['id'], members)
275 04f0c625 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
276 04f0c625 Stavros Sachtouris
            self.assertEqual(
277 04f0c625 Stavros Sachtouris
                    self.client.http_client.path,
278 04f0c625 Stavros Sachtouris
                '/images/%s/members' % img0['id'])
279 03314970 Stavros Sachtouris
            (method, data, a_headers, a_params) = perform_req.call_args[0]
280 03314970 Stavros Sachtouris
            from json import loads
281 03314970 Stavros Sachtouris
            memberships = loads(data)['memberships']
282 03314970 Stavros Sachtouris
            for membership in memberships:
283 03314970 Stavros Sachtouris
                self.assertTrue(membership['member_id'] in members)
284 c1004a00 Stavros Sachtouris
285 c1004a00 Stavros Sachtouris
    def test_list_members(self):
286 d01f7d92 Stavros Sachtouris
        img0 = example_images_detailed[0]
287 d01f7d92 Stavros Sachtouris
        members = ['use3r-1d-0', 'us2r-1d-1', 'us3r-1d-2']
288 d01f7d92 Stavros Sachtouris
        self.FR.json = dict(members=members)
289 d01f7d92 Stavros Sachtouris
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
290 d01f7d92 Stavros Sachtouris
            r = self.client.list_members(img0['id'])
291 04f0c625 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
292 04f0c625 Stavros Sachtouris
            self.assertEqual(
293 04f0c625 Stavros Sachtouris
                self.client.http_client.path,
294 04f0c625 Stavros Sachtouris
                '/images/%s/members' % img0['id'])
295 d01f7d92 Stavros Sachtouris
            self.assertEqual(r, members)
296 c1004a00 Stavros Sachtouris
297 04f0c625 Stavros Sachtouris
    def test_add_member(self):
298 04f0c625 Stavros Sachtouris
        img0 = example_images_detailed[0]
299 04f0c625 Stavros Sachtouris
        new_member = 'us3r-15-n3w'
300 04f0c625 Stavros Sachtouris
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
301 04f0c625 Stavros Sachtouris
            self.assertRaises(
302 04f0c625 Stavros Sachtouris
                ClientError,
303 e09db3c4 Stavros Sachtouris
                self.client.add_member,
304 04f0c625 Stavros Sachtouris
                img0['id'], new_member)
305 04f0c625 Stavros Sachtouris
            self.FR.status_code = 204
306 04f0c625 Stavros Sachtouris
            self.client.add_member(img0['id'], new_member)
307 04f0c625 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
308 04f0c625 Stavros Sachtouris
            self.assertEqual(
309 04f0c625 Stavros Sachtouris
                self.client.http_client.path,
310 04f0c625 Stavros Sachtouris
                '/images/%s/members/%s' % (img0['id'], new_member))
311 04f0c625 Stavros Sachtouris
312 e09db3c4 Stavros Sachtouris
    def test_remove_member(self):
313 e09db3c4 Stavros Sachtouris
        img0 = example_images_detailed[0]
314 e09db3c4 Stavros Sachtouris
        old_member = 'us3r-15-0ld'
315 e09db3c4 Stavros Sachtouris
        with patch.object(self.C, 'perform_request', return_value=self.FR()):
316 e09db3c4 Stavros Sachtouris
            self.assertRaises(
317 e09db3c4 Stavros Sachtouris
                ClientError,
318 e09db3c4 Stavros Sachtouris
                self.client.remove_member,
319 e09db3c4 Stavros Sachtouris
                img0['id'], old_member)
320 e09db3c4 Stavros Sachtouris
            self.FR.status_code = 204
321 e09db3c4 Stavros Sachtouris
            self.client.remove_member(img0['id'], old_member)
322 e09db3c4 Stavros Sachtouris
            self.assertEqual(self.client.http_client.url, self.url)
323 e09db3c4 Stavros Sachtouris
            self.assertEqual(
324 e09db3c4 Stavros Sachtouris
                self.client.http_client.path,
325 e09db3c4 Stavros Sachtouris
                '/images/%s/members/%s' % (img0['id'], old_member))
326 c1004a00 Stavros Sachtouris
327 e09db3c4 Stavros Sachtouris
    """
328 c1004a00 Stavros Sachtouris
    def test_list_shared(self):
329 c1004a00 Stavros Sachtouris
        #No way to test this, if I dont have member images
330 c1004a00 Stavros Sachtouris
        pass
331 d86c3c7d Stavros Sachtouris
    """