Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / test.py @ 882c7e33

History | View | Annotate | Download (14.5 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 0482817c Stavros Sachtouris
from mock import patch, call
35 304a92dc Stavros Sachtouris
from unittest import TestCase
36 630dea9b Stavros Sachtouris
from itertools import product
37 304a92dc Stavros Sachtouris
38 630dea9b Stavros Sachtouris
from kamaki.clients.compute import ComputeClient, ComputeClientApi
39 0482817c Stavros Sachtouris
from kamaki.clients import ClientError
40 304a92dc Stavros Sachtouris
41 edf8ad52 Stavros Sachtouris
42 630dea9b Stavros Sachtouris
rest_pkg = 'kamaki.clients.compute.rest_api.ComputeClientApi'
43 630dea9b Stavros Sachtouris
compute_pkg = 'kamaki.clients.compute.ComputeClient'
44 edf8ad52 Stavros Sachtouris
45 304a92dc Stavros Sachtouris
img_ref = "1m4g3-r3f3r3nc3"
46 304a92dc Stavros Sachtouris
vm_name = "my new VM"
47 304a92dc Stavros Sachtouris
fid = 42
48 304a92dc Stavros Sachtouris
vm_send = dict(server=dict(
49 304a92dc Stavros Sachtouris
    flavorRef=fid,
50 304a92dc Stavros Sachtouris
    name=vm_name,
51 304a92dc Stavros Sachtouris
    imageRef=img_ref,
52 304a92dc Stavros Sachtouris
    metadata=dict(os="debian", users="root")))
53 304a92dc Stavros Sachtouris
vm_recv = dict(server=dict(
54 304a92dc Stavros Sachtouris
    status="BUILD",
55 304a92dc Stavros Sachtouris
    updated="2013-03-01T10:04:00.637152+00:00",
56 304a92dc Stavros Sachtouris
    hostId="",
57 304a92dc Stavros Sachtouris
    name=vm_name,
58 304a92dc Stavros Sachtouris
    imageRef=img_ref,
59 304a92dc Stavros Sachtouris
    created="2013-03-01T10:04:00.087324+00:00",
60 304a92dc Stavros Sachtouris
    flavorRef=fid,
61 304a92dc Stavros Sachtouris
    adminPass="n0n3sh@11p@55",
62 304a92dc Stavros Sachtouris
    suspended=False,
63 304a92dc Stavros Sachtouris
    progress=0,
64 304a92dc Stavros Sachtouris
    id=31173,
65 304a92dc Stavros Sachtouris
    metadata=dict(values=dict(os="debian", users="root"))))
66 304a92dc Stavros Sachtouris
img_recv = dict(image=dict(
67 304a92dc Stavros Sachtouris
    status="ACTIVE",
68 304a92dc Stavros Sachtouris
    updated="2013-02-26T11:10:14+00:00",
69 304a92dc Stavros Sachtouris
    name="Debian Base",
70 304a92dc Stavros Sachtouris
    created="2013-02-26T11:03:29+00:00",
71 304a92dc Stavros Sachtouris
    progress=100,
72 304a92dc Stavros Sachtouris
    id=img_ref,
73 304a92dc Stavros Sachtouris
    metadata=dict(values=dict(
74 304a92dc Stavros Sachtouris
        partition_table="msdos",
75 304a92dc Stavros Sachtouris
        kernel="2.6.32",
76 304a92dc Stavros Sachtouris
        osfamily="linux",
77 304a92dc Stavros Sachtouris
        users="root",
78 304a92dc Stavros Sachtouris
        gui="No GUI",
79 304a92dc Stavros Sachtouris
        sortorder="1",
80 304a92dc Stavros Sachtouris
        os="debian",
81 304a92dc Stavros Sachtouris
        root_partition="1",
82 304a92dc Stavros Sachtouris
        description="Debian 6.0.7 (Squeeze) Base System"))))
83 304a92dc Stavros Sachtouris
vm_list = dict(servers=dict(values=[
84 304a92dc Stavros Sachtouris
    dict(name='n1', id=1),
85 304a92dc Stavros Sachtouris
    dict(name='n2', id=2)]))
86 304a92dc Stavros Sachtouris
flavor_list = dict(flavors=dict(values=[
87 0482817c Stavros Sachtouris
    dict(id=41, name="C1R1024D20"),
88 0482817c Stavros Sachtouris
    dict(id=42, name="C1R1024D40"),
89 0482817c Stavros Sachtouris
    dict(id=43, name="C1R1028D20")]))
90 304a92dc Stavros Sachtouris
img_list = dict(images=dict(values=[
91 304a92dc Stavros Sachtouris
    dict(name="maelstrom", id="0fb03e45-7d5a-4515-bd4e-e6bbf6457f06"),
92 304a92dc Stavros Sachtouris
    dict(name="edx_saas", id="1357163d-5fd8-488e-a117-48734c526206"),
93 304a92dc Stavros Sachtouris
    dict(name="Debian_Wheezy_Base", id="1f8454f0-8e3e-4b6c-ab8e-5236b728dffe"),
94 304a92dc Stavros Sachtouris
    dict(name="CentOS", id="21894b48-c805-4568-ac8b-7d4bb8eb533d"),
95 304a92dc Stavros Sachtouris
    dict(name="Ubuntu Desktop", id="37bc522c-c479-4085-bfb9-464f9b9e2e31"),
96 304a92dc Stavros Sachtouris
    dict(name="Ubuntu 12.10", id="3a24fef9-1a8c-47d1-8f11-e07bd5e544fd"),
97 304a92dc Stavros Sachtouris
    dict(name="Debian Base", id="40ace203-6254-4e17-a5cb-518d55418a7d"),
98 304a92dc Stavros Sachtouris
    dict(name="ubuntu_bundled", id="5336e265-5c7c-4127-95cb-2bf832a79903")]))
99 304a92dc Stavros Sachtouris
100 304a92dc Stavros Sachtouris
101 304a92dc Stavros Sachtouris
class FR(object):
102 304a92dc Stavros Sachtouris
    """FR stands for Fake Response"""
103 304a92dc Stavros Sachtouris
    json = vm_recv
104 304a92dc Stavros Sachtouris
    headers = {}
105 304a92dc Stavros Sachtouris
    content = json
106 304a92dc Stavros Sachtouris
    status = None
107 304a92dc Stavros Sachtouris
    status_code = 200
108 304a92dc Stavros Sachtouris
109 304a92dc Stavros Sachtouris
    def release(self):
110 304a92dc Stavros Sachtouris
        pass
111 304a92dc Stavros Sachtouris
112 304a92dc Stavros Sachtouris
113 630dea9b Stavros Sachtouris
class ComputeRestApi(TestCase):
114 630dea9b Stavros Sachtouris
115 630dea9b Stavros Sachtouris
    """Set up a ComputesRestApi thorough test"""
116 630dea9b Stavros Sachtouris
    def setUp(self):
117 630dea9b Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
118 630dea9b Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
119 630dea9b Stavros Sachtouris
        self.client = ComputeClientApi(self.url, self.token)
120 630dea9b Stavros Sachtouris
121 630dea9b Stavros Sachtouris
    def tearDown(self):
122 630dea9b Stavros Sachtouris
        FR.json = vm_recv
123 630dea9b Stavros Sachtouris
124 630dea9b Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
125 630dea9b Stavros Sachtouris
    def test_servers_get(self, get):
126 630dea9b Stavros Sachtouris
        vm_id = vm_recv['server']['id']
127 630dea9b Stavros Sachtouris
        for args in product(
128 630dea9b Stavros Sachtouris
                ('', vm_id),
129 630dea9b Stavros Sachtouris
                ('', 'cmd'),
130 630dea9b Stavros Sachtouris
                (200, 204),
131 630dea9b Stavros Sachtouris
                ({}, {'k': 'v'})):
132 630dea9b Stavros Sachtouris
            (server_id, command, success, kwargs) = args
133 630dea9b Stavros Sachtouris
            self.client.servers_get(*args[:3], **args[3])
134 630dea9b Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
135 630dea9b Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
136 630dea9b Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
137 630dea9b Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
138 630dea9b Stavros Sachtouris
                success=success,
139 630dea9b Stavros Sachtouris
                **args[3]))
140 630dea9b Stavros Sachtouris
141 882c7e33 Stavros Sachtouris
    @patch('%s.delete' % rest_pkg, return_value=FR())
142 882c7e33 Stavros Sachtouris
    def test_servers_delete(self, delete):
143 882c7e33 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
144 882c7e33 Stavros Sachtouris
        for args in product(
145 882c7e33 Stavros Sachtouris
                ('', vm_id),
146 882c7e33 Stavros Sachtouris
                ('', 'cmd'),
147 882c7e33 Stavros Sachtouris
                (204, 208),
148 882c7e33 Stavros Sachtouris
                ({}, {'k': 'v'})):
149 882c7e33 Stavros Sachtouris
            (server_id, command, success, kwargs) = args
150 882c7e33 Stavros Sachtouris
            self.client.servers_delete(*args[:3], **args[3])
151 882c7e33 Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
152 882c7e33 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
153 882c7e33 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(
154 882c7e33 Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
155 882c7e33 Stavros Sachtouris
                success=success,
156 882c7e33 Stavros Sachtouris
                **args[3]))
157 882c7e33 Stavros Sachtouris
158 630dea9b Stavros Sachtouris
159 630dea9b Stavros Sachtouris
class Compute(TestCase):
160 304a92dc Stavros Sachtouris
161 304a92dc Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
162 304a92dc Stavros Sachtouris
        for k, v in d1.items():
163 304a92dc Stavros Sachtouris
            self.assertTrue(k in d2)
164 304a92dc Stavros Sachtouris
            if isinstance(v, dict):
165 304a92dc Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
166 304a92dc Stavros Sachtouris
            else:
167 304a92dc Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
168 304a92dc Stavros Sachtouris
169 304a92dc Stavros Sachtouris
    """Set up a Cyclades thorough test"""
170 304a92dc Stavros Sachtouris
    def setUp(self):
171 304a92dc Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
172 304a92dc Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
173 630dea9b Stavros Sachtouris
        self.client = ComputeClient(self.url, self.token)
174 304a92dc Stavros Sachtouris
175 304a92dc Stavros Sachtouris
    def tearDown(self):
176 304a92dc Stavros Sachtouris
        FR.status_code = 200
177 304a92dc Stavros Sachtouris
        FR.json = vm_recv
178 304a92dc Stavros Sachtouris
179 edf8ad52 Stavros Sachtouris
    @patch(
180 edf8ad52 Stavros Sachtouris
        '%s.get_image_details' % compute_pkg,
181 edf8ad52 Stavros Sachtouris
        return_value=img_recv['image'])
182 edf8ad52 Stavros Sachtouris
    def test_create_server(self, GID):
183 edf8ad52 Stavros Sachtouris
        with patch.object(
184 630dea9b Stavros Sachtouris
                ComputeClient, 'servers_post',
185 edf8ad52 Stavros Sachtouris
                side_effect=ClientError(
186 edf8ad52 Stavros Sachtouris
                    'REQUEST ENTITY TOO LARGE',
187 edf8ad52 Stavros Sachtouris
                    status=403)):
188 304a92dc Stavros Sachtouris
            self.assertRaises(
189 304a92dc Stavros Sachtouris
                ClientError,
190 304a92dc Stavros Sachtouris
                self.client.create_server,
191 304a92dc Stavros Sachtouris
                vm_name, fid, img_ref)
192 304a92dc Stavros Sachtouris
193 304a92dc Stavros Sachtouris
        with patch.object(
194 630dea9b Stavros Sachtouris
                ComputeClient, 'servers_post',
195 edf8ad52 Stavros Sachtouris
                return_value=FR()) as post:
196 304a92dc Stavros Sachtouris
            r = self.client.create_server(vm_name, fid, img_ref)
197 edf8ad52 Stavros Sachtouris
            self.assertEqual(r, FR.json['server'])
198 edf8ad52 Stavros Sachtouris
            self.assertEqual(GID.mock_calls[-1], call(img_ref))
199 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=vm_send))
200 304a92dc Stavros Sachtouris
            prsn = 'Personality string (does not work with real servers)'
201 304a92dc Stavros Sachtouris
            self.client.create_server(vm_name, fid, img_ref, prsn)
202 edf8ad52 Stavros Sachtouris
            expected = dict(server=dict(vm_send['server']))
203 edf8ad52 Stavros Sachtouris
            expected['server']['personality'] = prsn
204 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=expected))
205 304a92dc Stavros Sachtouris
206 0067c031 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
207 0067c031 Stavros Sachtouris
    def test_list_servers(self, SG):
208 304a92dc Stavros Sachtouris
        FR.json = vm_list
209 0067c031 Stavros Sachtouris
        for detail in (False, True):
210 0067c031 Stavros Sachtouris
            r = self.client.list_servers(detail)
211 0067c031 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(
212 0067c031 Stavros Sachtouris
                command='detail' if detail else ''))
213 b6403d2d Stavros Sachtouris
            for i, vm in enumerate(vm_list['servers']['values']):
214 b6403d2d Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], vm)
215 b6403d2d Stavros Sachtouris
            self.assertEqual(i + 1, len(r))
216 304a92dc Stavros Sachtouris
217 26ccd6fb Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
218 26ccd6fb Stavros Sachtouris
    def test_get_server_details(self, SG):
219 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
220 304a92dc Stavros Sachtouris
        r = self.client.get_server_details(vm_id)
221 b6403d2d Stavros Sachtouris
        SG.assert_called_once_with(vm_id)
222 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, vm_recv['server'])
223 304a92dc Stavros Sachtouris
224 2ace03e5 Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
225 2ace03e5 Stavros Sachtouris
    def test_update_server_name(self, SP):
226 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
227 304a92dc Stavros Sachtouris
        new_name = vm_name + '_new'
228 304a92dc Stavros Sachtouris
        self.client.update_server_name(vm_id, new_name)
229 b6403d2d Stavros Sachtouris
        SP.assert_called_once_with(vm_id, json_data=dict(
230 b6403d2d Stavros Sachtouris
            server=dict(name=new_name)))
231 304a92dc Stavros Sachtouris
232 876aae74 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
233 876aae74 Stavros Sachtouris
    def test_reboot_server(self, SP):
234 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
235 876aae74 Stavros Sachtouris
        for hard in (None, True):
236 876aae74 Stavros Sachtouris
            self.client.reboot_server(vm_id, hard=hard)
237 876aae74 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
238 876aae74 Stavros Sachtouris
                vm_id, 'action',
239 876aae74 Stavros Sachtouris
                json_data=dict(reboot=dict(type='HARD' if hard else 'SOFT'))))
240 304a92dc Stavros Sachtouris
241 d560c67b Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
242 d560c67b Stavros Sachtouris
    def test_create_server_metadata(self, SP):
243 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
244 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
245 304a92dc Stavros Sachtouris
        FR.json = dict(meta=vm_recv['server'])
246 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
247 304a92dc Stavros Sachtouris
            r = self.client.create_server_metadata(vm_id, k, v)
248 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, vm_recv['server'])
249 d560c67b Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
250 d560c67b Stavros Sachtouris
                vm_id, 'meta/%s' % k,
251 d560c67b Stavros Sachtouris
                json_data=dict(meta={k: v}), success=201))
252 304a92dc Stavros Sachtouris
253 d224bb37 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
254 d224bb37 Stavros Sachtouris
    def test_get_server_metadata(self, SG):
255 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
256 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
257 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=dict(values=metadata))
258 304a92dc Stavros Sachtouris
        r = self.client.get_server_metadata(vm_id)
259 b6403d2d Stavros Sachtouris
        SG.assert_called_once_with(vm_id, '/meta')
260 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
261 304a92dc Stavros Sachtouris
262 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
263 304a92dc Stavros Sachtouris
            FR.json = dict(meta={k: v})
264 304a92dc Stavros Sachtouris
            r = self.client.get_server_metadata(vm_id, k)
265 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, {k: v})
266 d224bb37 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(vm_id, '/meta/%s' % k))
267 304a92dc Stavros Sachtouris
268 d224bb37 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
269 e750a969 Stavros Sachtouris
    def test_update_server_metadata(self, SP):
270 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
271 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
272 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
273 304a92dc Stavros Sachtouris
        r = self.client.update_server_metadata(vm_id, **metadata)
274 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
275 b6403d2d Stavros Sachtouris
        SP.assert_called_once_with(
276 e750a969 Stavros Sachtouris
            vm_id, 'meta',
277 b6403d2d Stavros Sachtouris
            json_data=dict(metadata=metadata), success=201)
278 304a92dc Stavros Sachtouris
279 d224bb37 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
280 dbd50059 Stavros Sachtouris
    def test_delete_server_metadata(self, SD):
281 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
282 304a92dc Stavros Sachtouris
        key = 'metakey'
283 304a92dc Stavros Sachtouris
        self.client.delete_server_metadata(vm_id, key)
284 b6403d2d Stavros Sachtouris
        SD.assert_called_once_with(vm_id, 'meta/' + key)
285 304a92dc Stavros Sachtouris
286 8c40c4a6 Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
287 8c40c4a6 Stavros Sachtouris
    def test_list_flavors(self, FG):
288 304a92dc Stavros Sachtouris
        FR.json = flavor_list
289 8c40c4a6 Stavros Sachtouris
        for cmd in ('', 'detail'):
290 8c40c4a6 Stavros Sachtouris
            r = self.client.list_flavors(detail=(cmd == 'detail'))
291 8c40c4a6 Stavros Sachtouris
            self.assertEqual(FG.mock_calls[-1], call(command=cmd))
292 8c40c4a6 Stavros Sachtouris
            self.assert_dicts_are_equal(dict(values=r), flavor_list['flavors'])
293 304a92dc Stavros Sachtouris
294 ae9c3b5f Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
295 ae9c3b5f Stavros Sachtouris
    def test_get_flavor_details(self, FG):
296 304a92dc Stavros Sachtouris
        FR.json = dict(flavor=flavor_list['flavors'])
297 304a92dc Stavros Sachtouris
        r = self.client.get_flavor_details(fid)
298 b6403d2d Stavros Sachtouris
        FG.assert_called_once_with(fid)
299 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, flavor_list['flavors'])
300 304a92dc Stavros Sachtouris
301 b2347a17 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
302 b2347a17 Stavros Sachtouris
    def test_list_images(self, IG):
303 304a92dc Stavros Sachtouris
        FR.json = img_list
304 b2347a17 Stavros Sachtouris
        for cmd in ('', 'detail'):
305 b2347a17 Stavros Sachtouris
            r = self.client.list_images(detail=(cmd == 'detail'))
306 b2347a17 Stavros Sachtouris
            self.assertEqual(IG.mock_calls[-1], call(command=cmd))
307 b2347a17 Stavros Sachtouris
            expected = img_list['images']['values']
308 b2347a17 Stavros Sachtouris
            for i in range(len(r)):
309 b2347a17 Stavros Sachtouris
                self.assert_dicts_are_equal(expected[i], r[i])
310 304a92dc Stavros Sachtouris
311 937ef4dd Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
312 937ef4dd Stavros Sachtouris
    def test_get_image_details(self, IG):
313 304a92dc Stavros Sachtouris
        FR.json = img_recv
314 304a92dc Stavros Sachtouris
        r = self.client.get_image_details(img_ref)
315 b6403d2d Stavros Sachtouris
        IG.assert_called_once_with(img_ref)
316 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
317 304a92dc Stavros Sachtouris
318 d224bb37 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
319 304a92dc Stavros Sachtouris
    def test_get_image_metadata(self, IG):
320 b6403d2d Stavros Sachtouris
        for key in ('', '50m3k3y'):
321 b6403d2d Stavros Sachtouris
            FR.json = dict(meta=img_recv['image']) if (
322 b6403d2d Stavros Sachtouris
                key) else dict(metadata=dict(values=img_recv['image']))
323 b6403d2d Stavros Sachtouris
            r = self.client.get_image_metadata(img_ref, key)
324 b6403d2d Stavros Sachtouris
            self.assertEqual(IG.mock_calls[-1], call(
325 b6403d2d Stavros Sachtouris
                '%s' % img_ref,
326 b6403d2d Stavros Sachtouris
                '/meta%s' % (('/%s' % key) if key else '')))
327 b6403d2d Stavros Sachtouris
            self.assert_dicts_are_equal(img_recv['image'], r)
328 304a92dc Stavros Sachtouris
329 0651cda3 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
330 0651cda3 Stavros Sachtouris
    def test_delete_server(self, SD):
331 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
332 304a92dc Stavros Sachtouris
        self.client.delete_server(vm_id)
333 1df5305d Stavros Sachtouris
        SD.assert_called_once_with(vm_id)
334 304a92dc Stavros Sachtouris
335 f711008c Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
336 f711008c Stavros Sachtouris
    def test_delete_image(self, ID):
337 304a92dc Stavros Sachtouris
        self.client.delete_image(img_ref)
338 1df5305d Stavros Sachtouris
        ID.assert_called_once_with(img_ref)
339 304a92dc Stavros Sachtouris
340 71017d87 Stavros Sachtouris
    @patch('%s.images_put' % compute_pkg, return_value=FR())
341 71017d87 Stavros Sachtouris
    def test_create_image_metadata(self, IP):
342 71017d87 Stavros Sachtouris
        (key, val) = ('k1', 'v1')
343 304a92dc Stavros Sachtouris
        FR.json = dict(meta=img_recv['image'])
344 71017d87 Stavros Sachtouris
        r = self.client.create_image_metadata(img_ref, key, val)
345 1df5305d Stavros Sachtouris
        IP.assert_called_once_with(
346 71017d87 Stavros Sachtouris
            img_ref, 'meta/%s' % key,
347 1df5305d Stavros Sachtouris
            json_data=dict(meta={key: val}))
348 71017d87 Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
349 304a92dc Stavros Sachtouris
350 d224bb37 Stavros Sachtouris
    @patch('%s.images_post' % compute_pkg, return_value=FR())
351 428aa852 Stavros Sachtouris
    def test_update_image_metadata(self, IP):
352 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
353 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
354 304a92dc Stavros Sachtouris
        r = self.client.update_image_metadata(img_ref, **metadata)
355 1df5305d Stavros Sachtouris
        IP.assert_called_once_with(
356 1df5305d Stavros Sachtouris
            img_ref, 'meta',
357 1df5305d Stavros Sachtouris
            json_data=dict(metadata=metadata))
358 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
359 304a92dc Stavros Sachtouris
360 d224bb37 Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
361 0482817c Stavros Sachtouris
    def test_delete_image_metadata(self, ID):
362 304a92dc Stavros Sachtouris
        key = 'metakey'
363 304a92dc Stavros Sachtouris
        self.client.delete_image_metadata(img_ref, key)
364 1df5305d Stavros Sachtouris
        ID.assert_called_once_with(img_ref, '/meta/%s' % key)
365 304a92dc Stavros Sachtouris
366 630dea9b Stavros Sachtouris
367 304a92dc Stavros Sachtouris
if __name__ == '__main__':
368 304a92dc Stavros Sachtouris
    from sys import argv
369 304a92dc Stavros Sachtouris
    from kamaki.clients.test import runTestCase
370 630dea9b Stavros Sachtouris
    not_found = True
371 630dea9b Stavros Sachtouris
    if not argv[1:] or argv[1] == 'Compute':
372 630dea9b Stavros Sachtouris
        not_found = False
373 630dea9b Stavros Sachtouris
        runTestCase(Compute, 'Compute Client', argv[2:])
374 630dea9b Stavros Sachtouris
    if not argv[1:] or argv[1] == 'ComputeRestApi':
375 630dea9b Stavros Sachtouris
        not_found = False
376 630dea9b Stavros Sachtouris
        runTestCase(ComputeRestApi, 'ComputeRestApi Client', argv[2:])
377 630dea9b Stavros Sachtouris
    if not_found:
378 630dea9b Stavros Sachtouris
        print('TestCase %s not found' % argv[1])