Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / test.py @ 428aa852

History | View | Annotate | Download (13.8 kB)

1 304a92dc Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 304a92dc Stavros Sachtouris
#
3 304a92dc Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 304a92dc Stavros Sachtouris
# without modification, are permitted provided that the following
5 304a92dc Stavros Sachtouris
# conditions are met:
6 304a92dc Stavros Sachtouris
#
7 304a92dc Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 304a92dc Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 304a92dc Stavros Sachtouris
#      disclaimer.
10 304a92dc Stavros Sachtouris
#
11 304a92dc Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 304a92dc Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 304a92dc Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 304a92dc Stavros Sachtouris
#      provided with the distribution.
15 304a92dc Stavros Sachtouris
#
16 304a92dc Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 304a92dc Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 304a92dc Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 304a92dc Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 304a92dc Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 304a92dc Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 304a92dc Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 304a92dc Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 304a92dc Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 304a92dc Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 304a92dc Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 304a92dc Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 304a92dc Stavros Sachtouris
#
29 304a92dc Stavros Sachtouris
# The views and conclusions contained in the software and
30 304a92dc Stavros Sachtouris
# documentation are those of the authors and should not be
31 304a92dc Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 304a92dc Stavros Sachtouris
# or implied, of GRNET S.A.
33 304a92dc Stavros Sachtouris
34 304a92dc Stavros Sachtouris
from mock import patch, Mock, call
35 304a92dc Stavros Sachtouris
from unittest import TestCase
36 304a92dc Stavros Sachtouris
from json import loads
37 304a92dc Stavros Sachtouris
38 304a92dc Stavros Sachtouris
from kamaki.clients import Client, ClientError
39 304a92dc Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient
40 304a92dc Stavros Sachtouris
from kamaki.clients.cyclades_rest_api import CycladesClientApi
41 304a92dc Stavros Sachtouris
42 edf8ad52 Stavros Sachtouris
43 d224bb37 Stavros Sachtouris
compute_pkg_pkg = 'kamaki.clients.connection.kamakicon.KamakiHTTPConnection'
44 edf8ad52 Stavros Sachtouris
compute_pkg = 'kamaki.clients.cyclades.CycladesClient'
45 edf8ad52 Stavros Sachtouris
46 304a92dc Stavros Sachtouris
img_ref = "1m4g3-r3f3r3nc3"
47 304a92dc Stavros Sachtouris
vm_name = "my new VM"
48 304a92dc Stavros Sachtouris
fid = 42
49 304a92dc Stavros Sachtouris
vm_send = dict(server=dict(
50 304a92dc Stavros Sachtouris
    flavorRef=fid,
51 304a92dc Stavros Sachtouris
    name=vm_name,
52 304a92dc Stavros Sachtouris
    imageRef=img_ref,
53 304a92dc Stavros Sachtouris
    metadata=dict(os="debian", users="root")))
54 304a92dc Stavros Sachtouris
vm_recv = dict(server=dict(
55 304a92dc Stavros Sachtouris
    status="BUILD",
56 304a92dc Stavros Sachtouris
    updated="2013-03-01T10:04:00.637152+00:00",
57 304a92dc Stavros Sachtouris
    hostId="",
58 304a92dc Stavros Sachtouris
    name=vm_name,
59 304a92dc Stavros Sachtouris
    imageRef=img_ref,
60 304a92dc Stavros Sachtouris
    created="2013-03-01T10:04:00.087324+00:00",
61 304a92dc Stavros Sachtouris
    flavorRef=fid,
62 304a92dc Stavros Sachtouris
    adminPass="n0n3sh@11p@55",
63 304a92dc Stavros Sachtouris
    suspended=False,
64 304a92dc Stavros Sachtouris
    progress=0,
65 304a92dc Stavros Sachtouris
    id=31173,
66 304a92dc Stavros Sachtouris
    metadata=dict(values=dict(os="debian", users="root"))))
67 304a92dc Stavros Sachtouris
img_recv = dict(image=dict(
68 304a92dc Stavros Sachtouris
    status="ACTIVE",
69 304a92dc Stavros Sachtouris
    updated="2013-02-26T11:10:14+00:00",
70 304a92dc Stavros Sachtouris
    name="Debian Base",
71 304a92dc Stavros Sachtouris
    created="2013-02-26T11:03:29+00:00",
72 304a92dc Stavros Sachtouris
    progress=100,
73 304a92dc Stavros Sachtouris
    id=img_ref,
74 304a92dc Stavros Sachtouris
    metadata=dict(values=dict(
75 304a92dc Stavros Sachtouris
        partition_table="msdos",
76 304a92dc Stavros Sachtouris
        kernel="2.6.32",
77 304a92dc Stavros Sachtouris
        osfamily="linux",
78 304a92dc Stavros Sachtouris
        users="root",
79 304a92dc Stavros Sachtouris
        gui="No GUI",
80 304a92dc Stavros Sachtouris
        sortorder="1",
81 304a92dc Stavros Sachtouris
        os="debian",
82 304a92dc Stavros Sachtouris
        root_partition="1",
83 304a92dc Stavros Sachtouris
        description="Debian 6.0.7 (Squeeze) Base System"))))
84 304a92dc Stavros Sachtouris
vm_list = dict(servers=dict(values=[
85 304a92dc Stavros Sachtouris
    dict(name='n1', id=1),
86 304a92dc Stavros Sachtouris
    dict(name='n2', id=2)]))
87 304a92dc Stavros Sachtouris
flavor_list = dict(flavors=dict(values=[
88 304a92dc Stavros Sachtouris
        dict(id=41, name="C1R1024D20"),
89 304a92dc Stavros Sachtouris
        dict(id=42, name="C1R1024D40"),
90 304a92dc Stavros Sachtouris
        dict(id=43, name="C1R1028D20")]))
91 304a92dc Stavros Sachtouris
img_list = dict(images=dict(values=[
92 304a92dc Stavros Sachtouris
    dict(name="maelstrom", id="0fb03e45-7d5a-4515-bd4e-e6bbf6457f06"),
93 304a92dc Stavros Sachtouris
    dict(name="edx_saas", id="1357163d-5fd8-488e-a117-48734c526206"),
94 304a92dc Stavros Sachtouris
    dict(name="Debian_Wheezy_Base", id="1f8454f0-8e3e-4b6c-ab8e-5236b728dffe"),
95 304a92dc Stavros Sachtouris
    dict(name="CentOS", id="21894b48-c805-4568-ac8b-7d4bb8eb533d"),
96 304a92dc Stavros Sachtouris
    dict(name="Ubuntu Desktop", id="37bc522c-c479-4085-bfb9-464f9b9e2e31"),
97 304a92dc Stavros Sachtouris
    dict(name="Ubuntu 12.10", id="3a24fef9-1a8c-47d1-8f11-e07bd5e544fd"),
98 304a92dc Stavros Sachtouris
    dict(name="Debian Base", id="40ace203-6254-4e17-a5cb-518d55418a7d"),
99 304a92dc Stavros Sachtouris
    dict(name="ubuntu_bundled", id="5336e265-5c7c-4127-95cb-2bf832a79903")]))
100 304a92dc Stavros Sachtouris
net_send = dict(network=dict(dhcp=False, name='someNet'))
101 304a92dc Stavros Sachtouris
net_recv = dict(network=dict(
102 304a92dc Stavros Sachtouris
    status="PENDING",
103 304a92dc Stavros Sachtouris
    updated="2013-03-05T15:04:51.758780+00:00",
104 304a92dc Stavros Sachtouris
    name="someNet",
105 304a92dc Stavros Sachtouris
    created="2013-03-05T15:04:51.758728+00:00",
106 304a92dc Stavros Sachtouris
    cidr6=None,
107 304a92dc Stavros Sachtouris
    id="2130",
108 304a92dc Stavros Sachtouris
    gateway6=None,
109 304a92dc Stavros Sachtouris
    public=False,
110 304a92dc Stavros Sachtouris
    dhcp=False,
111 304a92dc Stavros Sachtouris
    cidr="192.168.1.0/24",
112 304a92dc Stavros Sachtouris
    type="MAC_FILTERED",
113 304a92dc Stavros Sachtouris
    gateway=None,
114 304a92dc Stavros Sachtouris
    attachments=dict(values=[dict(name='att1'), dict(name='att2')])))
115 304a92dc Stavros Sachtouris
net_list = dict(networks=dict(values=[
116 304a92dc Stavros Sachtouris
    dict(id=1, name='n1'),
117 304a92dc Stavros Sachtouris
    dict(id=2, name='n2'),
118 304a92dc Stavros Sachtouris
    dict(id=3, name='n3')]))
119 304a92dc Stavros Sachtouris
120 304a92dc Stavros Sachtouris
121 304a92dc Stavros Sachtouris
class FR(object):
122 304a92dc Stavros Sachtouris
    """FR stands for Fake Response"""
123 304a92dc Stavros Sachtouris
    json = vm_recv
124 304a92dc Stavros Sachtouris
    headers = {}
125 304a92dc Stavros Sachtouris
    content = json
126 304a92dc Stavros Sachtouris
    status = None
127 304a92dc Stavros Sachtouris
    status_code = 200
128 304a92dc Stavros Sachtouris
129 304a92dc Stavros Sachtouris
    def release(self):
130 304a92dc Stavros Sachtouris
        pass
131 304a92dc Stavros Sachtouris
132 304a92dc Stavros Sachtouris
133 304a92dc Stavros Sachtouris
class Cyclades(TestCase):
134 304a92dc Stavros Sachtouris
135 304a92dc Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
136 304a92dc Stavros Sachtouris
        for k, v in d1.items():
137 304a92dc Stavros Sachtouris
            self.assertTrue(k in d2)
138 304a92dc Stavros Sachtouris
            if isinstance(v, dict):
139 304a92dc Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
140 304a92dc Stavros Sachtouris
            else:
141 304a92dc Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
142 304a92dc Stavros Sachtouris
143 304a92dc Stavros Sachtouris
    """Set up a Cyclades thorough test"""
144 304a92dc Stavros Sachtouris
    def setUp(self):
145 304a92dc Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
146 304a92dc Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
147 304a92dc Stavros Sachtouris
        self.client = CycladesClient(self.url, self.token)
148 304a92dc Stavros Sachtouris
        from kamaki.clients.connection.kamakicon import KamakiHTTPConnection
149 304a92dc Stavros Sachtouris
        self.C = KamakiHTTPConnection
150 304a92dc Stavros Sachtouris
151 304a92dc Stavros Sachtouris
    def tearDown(self):
152 304a92dc Stavros Sachtouris
        FR.status_code = 200
153 304a92dc Stavros Sachtouris
        FR.json = vm_recv
154 304a92dc Stavros Sachtouris
155 edf8ad52 Stavros Sachtouris
    @patch(
156 edf8ad52 Stavros Sachtouris
        '%s.get_image_details' % compute_pkg,
157 edf8ad52 Stavros Sachtouris
        return_value=img_recv['image'])
158 edf8ad52 Stavros Sachtouris
    def test_create_server(self, GID):
159 edf8ad52 Stavros Sachtouris
        with patch.object(
160 edf8ad52 Stavros Sachtouris
                CycladesClient, 'servers_post',
161 edf8ad52 Stavros Sachtouris
                side_effect=ClientError(
162 edf8ad52 Stavros Sachtouris
                    'REQUEST ENTITY TOO LARGE',
163 edf8ad52 Stavros Sachtouris
                    status=403)):
164 304a92dc Stavros Sachtouris
            self.assertRaises(
165 304a92dc Stavros Sachtouris
                ClientError,
166 304a92dc Stavros Sachtouris
                self.client.create_server,
167 304a92dc Stavros Sachtouris
                vm_name, fid, img_ref)
168 edf8ad52 Stavros Sachtouris
        self.assertEqual(GID.mock_calls[-1], call(img_ref))
169 304a92dc Stavros Sachtouris
170 304a92dc Stavros Sachtouris
        with patch.object(
171 edf8ad52 Stavros Sachtouris
                CycladesClient, 'servers_post',
172 edf8ad52 Stavros Sachtouris
                return_value=FR()) as post:
173 304a92dc Stavros Sachtouris
            r = self.client.create_server(vm_name, fid, img_ref)
174 edf8ad52 Stavros Sachtouris
            self.assertEqual(r, FR.json['server'])
175 edf8ad52 Stavros Sachtouris
            self.assertEqual(GID.mock_calls[-1], call(img_ref))
176 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=vm_send))
177 304a92dc Stavros Sachtouris
            prsn = 'Personality string (does not work with real servers)'
178 304a92dc Stavros Sachtouris
            self.client.create_server(vm_name, fid, img_ref, prsn)
179 edf8ad52 Stavros Sachtouris
            expected = dict(server=dict(vm_send['server']))
180 edf8ad52 Stavros Sachtouris
            expected['server']['personality'] = prsn
181 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=expected))
182 304a92dc Stavros Sachtouris
183 0067c031 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
184 0067c031 Stavros Sachtouris
    def test_list_servers(self, SG):
185 304a92dc Stavros Sachtouris
        FR.json = vm_list
186 0067c031 Stavros Sachtouris
        for detail in (False, True):
187 0067c031 Stavros Sachtouris
            r = self.client.list_servers(detail)
188 0067c031 Stavros Sachtouris
            for i, vm in enumerate(vm_list['servers']['values']):
189 0067c031 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], vm)
190 0067c031 Stavros Sachtouris
            self.assertEqual(i + 1, len(r))
191 0067c031 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(
192 0067c031 Stavros Sachtouris
                changes_since=None,
193 0067c031 Stavros Sachtouris
                command='detail' if detail else ''))
194 304a92dc Stavros Sachtouris
195 26ccd6fb Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
196 26ccd6fb Stavros Sachtouris
    def test_get_server_details(self, SG):
197 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
198 304a92dc Stavros Sachtouris
        r = self.client.get_server_details(vm_id)
199 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, vm_recv['server'])
200 26ccd6fb Stavros Sachtouris
        self.assertEqual(SG.mock_calls[-1], call(vm_id))
201 304a92dc Stavros Sachtouris
202 2ace03e5 Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
203 2ace03e5 Stavros Sachtouris
    def test_update_server_name(self, SP):
204 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
205 304a92dc Stavros Sachtouris
        new_name = vm_name + '_new'
206 304a92dc Stavros Sachtouris
        self.client.update_server_name(vm_id, new_name)
207 2ace03e5 Stavros Sachtouris
        self.assertEqual(SP.mock_calls[-1], call(vm_id, json_data=dict(
208 2ace03e5 Stavros Sachtouris
            server=dict(name=new_name))))
209 304a92dc Stavros Sachtouris
210 876aae74 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
211 876aae74 Stavros Sachtouris
    def test_reboot_server(self, SP):
212 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
213 876aae74 Stavros Sachtouris
        for hard in (None, True):
214 876aae74 Stavros Sachtouris
            self.client.reboot_server(vm_id, hard=hard)
215 876aae74 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
216 876aae74 Stavros Sachtouris
                vm_id, 'action',
217 876aae74 Stavros Sachtouris
                json_data=dict(reboot=dict(type='HARD' if hard else 'SOFT'))))
218 304a92dc Stavros Sachtouris
219 d560c67b Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
220 d560c67b Stavros Sachtouris
    def test_create_server_metadata(self, SP):
221 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
222 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
223 304a92dc Stavros Sachtouris
        FR.json = dict(meta=vm_recv['server'])
224 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
225 304a92dc Stavros Sachtouris
            r = self.client.create_server_metadata(vm_id, k, v)
226 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, vm_recv['server'])
227 d560c67b Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
228 d560c67b Stavros Sachtouris
                vm_id, 'meta/%s' % k,
229 d560c67b Stavros Sachtouris
                json_data=dict(meta={k: v}), success=201))
230 304a92dc Stavros Sachtouris
231 d224bb37 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
232 d224bb37 Stavros Sachtouris
    def test_get_server_metadata(self, SG):
233 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
234 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
235 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=dict(values=metadata))
236 304a92dc Stavros Sachtouris
        r = self.client.get_server_metadata(vm_id)
237 d224bb37 Stavros Sachtouris
        self.assertEqual(SG.mock_calls[-1], call(vm_id, '/meta'))
238 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
239 304a92dc Stavros Sachtouris
240 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
241 304a92dc Stavros Sachtouris
            FR.json = dict(meta={k: v})
242 304a92dc Stavros Sachtouris
            r = self.client.get_server_metadata(vm_id, k)
243 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, {k: v})
244 d224bb37 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(vm_id, '/meta/%s' % k))
245 304a92dc Stavros Sachtouris
246 d224bb37 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
247 e750a969 Stavros Sachtouris
    def test_update_server_metadata(self, SP):
248 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
249 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
250 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
251 304a92dc Stavros Sachtouris
        r = self.client.update_server_metadata(vm_id, **metadata)
252 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
253 e750a969 Stavros Sachtouris
        self.assertEqual(SP.mock_calls[-1], call(
254 e750a969 Stavros Sachtouris
            vm_id, 'meta',
255 e750a969 Stavros Sachtouris
            json_data=dict(metadata=metadata), success=201))
256 304a92dc Stavros Sachtouris
257 d224bb37 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
258 dbd50059 Stavros Sachtouris
    def test_delete_server_metadata(self, SD):
259 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
260 304a92dc Stavros Sachtouris
        key = 'metakey'
261 304a92dc Stavros Sachtouris
        self.client.delete_server_metadata(vm_id, key)
262 dbd50059 Stavros Sachtouris
        self.assertEqual(SD.mock_calls[-1], call(vm_id, 'meta/' + key))
263 304a92dc Stavros Sachtouris
264 8c40c4a6 Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
265 8c40c4a6 Stavros Sachtouris
    def test_list_flavors(self, FG):
266 304a92dc Stavros Sachtouris
        FR.json = flavor_list
267 8c40c4a6 Stavros Sachtouris
        for cmd in ('', 'detail'):
268 8c40c4a6 Stavros Sachtouris
            r = self.client.list_flavors(detail=(cmd == 'detail'))
269 8c40c4a6 Stavros Sachtouris
            self.assertEqual(FG.mock_calls[-1], call(command=cmd))
270 8c40c4a6 Stavros Sachtouris
            self.assert_dicts_are_equal(dict(values=r), flavor_list['flavors'])
271 304a92dc Stavros Sachtouris
272 ae9c3b5f Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
273 ae9c3b5f Stavros Sachtouris
    def test_get_flavor_details(self, FG):
274 304a92dc Stavros Sachtouris
        FR.json = dict(flavor=flavor_list['flavors'])
275 304a92dc Stavros Sachtouris
        r = self.client.get_flavor_details(fid)
276 ae9c3b5f Stavros Sachtouris
        self.assertEqual(FG.mock_calls[-1], call(fid))
277 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, flavor_list['flavors'])
278 304a92dc Stavros Sachtouris
279 b2347a17 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
280 b2347a17 Stavros Sachtouris
    def test_list_images(self, IG):
281 304a92dc Stavros Sachtouris
        FR.json = img_list
282 b2347a17 Stavros Sachtouris
        for cmd in ('', 'detail'):
283 b2347a17 Stavros Sachtouris
            r = self.client.list_images(detail=(cmd == 'detail'))
284 b2347a17 Stavros Sachtouris
            self.assertEqual(IG.mock_calls[-1], call(command=cmd))
285 b2347a17 Stavros Sachtouris
            expected = img_list['images']['values']
286 b2347a17 Stavros Sachtouris
            for i in range(len(r)):
287 b2347a17 Stavros Sachtouris
                self.assert_dicts_are_equal(expected[i], r[i])
288 304a92dc Stavros Sachtouris
289 937ef4dd Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
290 937ef4dd Stavros Sachtouris
    def test_get_image_details(self, IG):
291 304a92dc Stavros Sachtouris
        FR.json = img_recv
292 304a92dc Stavros Sachtouris
        r = self.client.get_image_details(img_ref)
293 937ef4dd Stavros Sachtouris
        self.assertEqual(IG.mock_calls[-1], call(img_ref))
294 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
295 304a92dc Stavros Sachtouris
296 d224bb37 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
297 304a92dc Stavros Sachtouris
    def test_get_image_metadata(self, IG):
298 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=dict(values=img_recv['image']))
299 304a92dc Stavros Sachtouris
        r = self.client.get_image_metadata(img_ref)
300 5656f78c Stavros Sachtouris
        self.assertEqual(IG.mock_calls[-1], call('%s' % img_ref, '/meta'))
301 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(img_recv['image'], r)
302 304a92dc Stavros Sachtouris
        FR.json = dict(meta=img_recv['image'])
303 304a92dc Stavros Sachtouris
        key = 'somekey'
304 5656f78c Stavros Sachtouris
        r = self.client.get_image_metadata(img_ref, key)
305 5656f78c Stavros Sachtouris
        self.assertEqual(
306 5656f78c Stavros Sachtouris
            IG.mock_calls[-1],
307 5656f78c Stavros Sachtouris
            call('%s' % img_ref, '/meta/%s' % key))
308 5656f78c Stavros Sachtouris
        self.assert_dicts_are_equal(img_recv['image'], r)
309 304a92dc Stavros Sachtouris
310 0651cda3 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
311 0651cda3 Stavros Sachtouris
    def test_delete_server(self, SD):
312 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
313 304a92dc Stavros Sachtouris
        self.client.delete_server(vm_id)
314 0651cda3 Stavros Sachtouris
        self.assertEqual(SD.mock_calls[-1], call(vm_id))
315 304a92dc Stavros Sachtouris
316 f711008c Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
317 f711008c Stavros Sachtouris
    def test_delete_image(self, ID):
318 304a92dc Stavros Sachtouris
        self.client.delete_image(img_ref)
319 f711008c Stavros Sachtouris
        self.assertEqual(ID.mock_calls[-1], call(img_ref))
320 304a92dc Stavros Sachtouris
321 71017d87 Stavros Sachtouris
    @patch('%s.images_put' % compute_pkg, return_value=FR())
322 71017d87 Stavros Sachtouris
    def test_create_image_metadata(self, IP):
323 71017d87 Stavros Sachtouris
        (key, val) = ('k1', 'v1')
324 304a92dc Stavros Sachtouris
        FR.json = dict(meta=img_recv['image'])
325 71017d87 Stavros Sachtouris
        r = self.client.create_image_metadata(img_ref, key, val)
326 71017d87 Stavros Sachtouris
        self.assertEqual(IP.mock_calls[-1], call(
327 71017d87 Stavros Sachtouris
            img_ref, 'meta/%s' % key,
328 71017d87 Stavros Sachtouris
            json_data=dict(meta={key: val})))
329 71017d87 Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
330 304a92dc Stavros Sachtouris
331 d224bb37 Stavros Sachtouris
    @patch('%s.images_post' % compute_pkg, return_value=FR())
332 428aa852 Stavros Sachtouris
    def test_update_image_metadata(self, IP):
333 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
334 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
335 304a92dc Stavros Sachtouris
        r = self.client.update_image_metadata(img_ref, **metadata)
336 428aa852 Stavros Sachtouris
        self.assertEqual(
337 428aa852 Stavros Sachtouris
            IP.mock_calls[-1],
338 428aa852 Stavros Sachtouris
            call(img_ref, 'meta', json_data=dict(metadata=metadata)))
339 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
340 304a92dc Stavros Sachtouris
341 428aa852 Stavros Sachtouris
    """
342 d224bb37 Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
343 304a92dc Stavros Sachtouris
    def test_delete_image_metadata(self, images_delete):
344 304a92dc Stavros Sachtouris
        key = 'metakey'
345 304a92dc Stavros Sachtouris
        self.client.delete_image_metadata(img_ref, key)
346 304a92dc Stavros Sachtouris
        self.assertEqual(
347 304a92dc Stavros Sachtouris
            (img_ref, '/meta/' + key),
348 304a92dc Stavros Sachtouris
            images_delete.call_args[0])
349 304a92dc Stavros Sachtouris
    """
350 304a92dc Stavros Sachtouris
351 304a92dc Stavros Sachtouris
if __name__ == '__main__':
352 304a92dc Stavros Sachtouris
    from sys import argv
353 304a92dc Stavros Sachtouris
    from kamaki.clients.test import runTestCase
354 304a92dc Stavros Sachtouris
    runTestCase(Cyclades, 'Cyclades (multi) Client', argv[1:])