Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / compute / test.py @ 6af47576

History | View | Annotate | Download (17.3 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 6695edc9 Stavros Sachtouris
from json import dumps
38 304a92dc Stavros Sachtouris
39 630dea9b Stavros Sachtouris
from kamaki.clients.compute import ComputeClient, ComputeClientApi
40 0482817c Stavros Sachtouris
from kamaki.clients import ClientError
41 304a92dc Stavros Sachtouris
42 edf8ad52 Stavros Sachtouris
43 630dea9b Stavros Sachtouris
rest_pkg = 'kamaki.clients.compute.rest_api.ComputeClientApi'
44 630dea9b Stavros Sachtouris
compute_pkg = 'kamaki.clients.compute.ComputeClient'
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 0482817c Stavros Sachtouris
    dict(id=41, name="C1R1024D20"),
89 0482817c Stavros Sachtouris
    dict(id=42, name="C1R1024D40"),
90 0482817c 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
101 304a92dc Stavros Sachtouris
102 304a92dc Stavros Sachtouris
class FR(object):
103 304a92dc Stavros Sachtouris
    """FR stands for Fake Response"""
104 304a92dc Stavros Sachtouris
    json = vm_recv
105 304a92dc Stavros Sachtouris
    headers = {}
106 304a92dc Stavros Sachtouris
    content = json
107 304a92dc Stavros Sachtouris
    status = None
108 304a92dc Stavros Sachtouris
    status_code = 200
109 304a92dc Stavros Sachtouris
110 304a92dc Stavros Sachtouris
    def release(self):
111 304a92dc Stavros Sachtouris
        pass
112 304a92dc Stavros Sachtouris
113 304a92dc Stavros Sachtouris
114 630dea9b Stavros Sachtouris
class ComputeRestApi(TestCase):
115 630dea9b Stavros Sachtouris
116 630dea9b Stavros Sachtouris
    """Set up a ComputesRestApi thorough test"""
117 630dea9b Stavros Sachtouris
    def setUp(self):
118 630dea9b Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
119 630dea9b Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
120 630dea9b Stavros Sachtouris
        self.client = ComputeClientApi(self.url, self.token)
121 630dea9b Stavros Sachtouris
122 630dea9b Stavros Sachtouris
    def tearDown(self):
123 630dea9b Stavros Sachtouris
        FR.json = vm_recv
124 630dea9b Stavros Sachtouris
125 630dea9b Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
126 630dea9b Stavros Sachtouris
    def test_servers_get(self, get):
127 630dea9b Stavros Sachtouris
        vm_id = vm_recv['server']['id']
128 630dea9b Stavros Sachtouris
        for args in product(
129 630dea9b Stavros Sachtouris
                ('', vm_id),
130 630dea9b Stavros Sachtouris
                ('', 'cmd'),
131 630dea9b Stavros Sachtouris
                (200, 204),
132 630dea9b Stavros Sachtouris
                ({}, {'k': 'v'})):
133 630dea9b Stavros Sachtouris
            (server_id, command, success, kwargs) = args
134 6a00d7a7 Stavros Sachtouris
            self.client.servers_get(*args[:3], **kwargs)
135 630dea9b Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
136 630dea9b Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
137 630dea9b Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
138 630dea9b Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
139 630dea9b Stavros Sachtouris
                success=success,
140 6a00d7a7 Stavros Sachtouris
                **kwargs))
141 630dea9b Stavros Sachtouris
142 882c7e33 Stavros Sachtouris
    @patch('%s.delete' % rest_pkg, return_value=FR())
143 882c7e33 Stavros Sachtouris
    def test_servers_delete(self, delete):
144 882c7e33 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
145 882c7e33 Stavros Sachtouris
        for args in product(
146 882c7e33 Stavros Sachtouris
                ('', vm_id),
147 882c7e33 Stavros Sachtouris
                ('', 'cmd'),
148 882c7e33 Stavros Sachtouris
                (204, 208),
149 882c7e33 Stavros Sachtouris
                ({}, {'k': 'v'})):
150 882c7e33 Stavros Sachtouris
            (server_id, command, success, kwargs) = args
151 882c7e33 Stavros Sachtouris
            self.client.servers_delete(*args[:3], **args[3])
152 882c7e33 Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
153 882c7e33 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
154 882c7e33 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(
155 882c7e33 Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
156 882c7e33 Stavros Sachtouris
                success=success,
157 6a00d7a7 Stavros Sachtouris
                **kwargs))
158 6a00d7a7 Stavros Sachtouris
159 6a00d7a7 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
160 6a00d7a7 Stavros Sachtouris
    @patch('%s.post' % rest_pkg, return_value=FR())
161 6a00d7a7 Stavros Sachtouris
    def test_servers_post(self, post, SH):
162 6a00d7a7 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
163 6a00d7a7 Stavros Sachtouris
        for args in product(
164 6a00d7a7 Stavros Sachtouris
                ('', vm_id),
165 6a00d7a7 Stavros Sachtouris
                ('', 'cmd'),
166 6a00d7a7 Stavros Sachtouris
                (None, [dict(json="data"), dict(data="json")]),
167 6a00d7a7 Stavros Sachtouris
                (202, 204),
168 6a00d7a7 Stavros Sachtouris
                ({}, {'k': 'v'})):
169 6a00d7a7 Stavros Sachtouris
            (server_id, command, json_data, success, kwargs) = args
170 6a00d7a7 Stavros Sachtouris
171 6a00d7a7 Stavros Sachtouris
            self.client.servers_post(*args[:4], **kwargs)
172 6a00d7a7 Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
173 6a00d7a7 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
174 6a00d7a7 Stavros Sachtouris
            if json_data:
175 6a00d7a7 Stavros Sachtouris
                json_data = dumps(json_data)
176 6a00d7a7 Stavros Sachtouris
                self.assertEqual(SH.mock_calls[-2:], [
177 6a00d7a7 Stavros Sachtouris
                    call('Content-Type', 'application/json'),
178 6a00d7a7 Stavros Sachtouris
                    call('Content-Length', len(json_data))])
179 6a00d7a7 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(
180 6a00d7a7 Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
181 6a00d7a7 Stavros Sachtouris
                data=json_data, success=success,
182 6a00d7a7 Stavros Sachtouris
                **kwargs))
183 882c7e33 Stavros Sachtouris
184 6695edc9 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
185 6695edc9 Stavros Sachtouris
    @patch('%s.put' % rest_pkg, return_value=FR())
186 6695edc9 Stavros Sachtouris
    def test_servers_put(self, put, SH):
187 6695edc9 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
188 6695edc9 Stavros Sachtouris
        for args in product(
189 6695edc9 Stavros Sachtouris
                ('', vm_id),
190 6695edc9 Stavros Sachtouris
                ('', 'cmd'),
191 6695edc9 Stavros Sachtouris
                (None, [dict(json="data"), dict(data="json")]),
192 6695edc9 Stavros Sachtouris
                (204, 504),
193 6695edc9 Stavros Sachtouris
                ({}, {'k': 'v'})):
194 6695edc9 Stavros Sachtouris
            (server_id, command, json_data, success, kwargs) = args
195 6695edc9 Stavros Sachtouris
196 6695edc9 Stavros Sachtouris
            self.client.servers_put(*args[:4], **kwargs)
197 6695edc9 Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
198 6695edc9 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
199 6695edc9 Stavros Sachtouris
            if json_data:
200 6695edc9 Stavros Sachtouris
                json_data = dumps(json_data)
201 6695edc9 Stavros Sachtouris
                self.assertEqual(SH.mock_calls[-2:], [
202 6695edc9 Stavros Sachtouris
                    call('Content-Type', 'application/json'),
203 6695edc9 Stavros Sachtouris
                    call('Content-Length', len(json_data))])
204 6695edc9 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], call(
205 6695edc9 Stavros Sachtouris
                '/servers%s%s' % (vm_str, cmd_str),
206 6695edc9 Stavros Sachtouris
                data=json_data, success=success,
207 6695edc9 Stavros Sachtouris
                **kwargs))
208 6695edc9 Stavros Sachtouris
209 6af47576 Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
210 6af47576 Stavros Sachtouris
    def test_flavors_get(self, get):
211 6af47576 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
212 6af47576 Stavros Sachtouris
        for args in product(
213 6af47576 Stavros Sachtouris
                ('', vm_id),
214 6af47576 Stavros Sachtouris
                ('', 'cmd'),
215 6af47576 Stavros Sachtouris
                (200, 204),
216 6af47576 Stavros Sachtouris
                ({}, {'k': 'v'})):
217 6af47576 Stavros Sachtouris
            (server_id, command, success, kwargs) = args
218 6af47576 Stavros Sachtouris
            self.client.flavors_get(*args[:3], **kwargs)
219 6af47576 Stavros Sachtouris
            vm_str = '/%s' % server_id if server_id else ''
220 6af47576 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
221 6af47576 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
222 6af47576 Stavros Sachtouris
                '/flavors%s%s' % (vm_str, cmd_str),
223 6af47576 Stavros Sachtouris
                success=success,
224 6af47576 Stavros Sachtouris
                **kwargs))
225 6af47576 Stavros Sachtouris
226 630dea9b Stavros Sachtouris
227 630dea9b Stavros Sachtouris
class Compute(TestCase):
228 304a92dc Stavros Sachtouris
229 304a92dc Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
230 304a92dc Stavros Sachtouris
        for k, v in d1.items():
231 304a92dc Stavros Sachtouris
            self.assertTrue(k in d2)
232 304a92dc Stavros Sachtouris
            if isinstance(v, dict):
233 304a92dc Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
234 304a92dc Stavros Sachtouris
            else:
235 304a92dc Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
236 304a92dc Stavros Sachtouris
237 304a92dc Stavros Sachtouris
    """Set up a Cyclades thorough test"""
238 304a92dc Stavros Sachtouris
    def setUp(self):
239 304a92dc Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
240 304a92dc Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
241 630dea9b Stavros Sachtouris
        self.client = ComputeClient(self.url, self.token)
242 304a92dc Stavros Sachtouris
243 304a92dc Stavros Sachtouris
    def tearDown(self):
244 304a92dc Stavros Sachtouris
        FR.status_code = 200
245 304a92dc Stavros Sachtouris
        FR.json = vm_recv
246 304a92dc Stavros Sachtouris
247 edf8ad52 Stavros Sachtouris
    @patch(
248 edf8ad52 Stavros Sachtouris
        '%s.get_image_details' % compute_pkg,
249 edf8ad52 Stavros Sachtouris
        return_value=img_recv['image'])
250 edf8ad52 Stavros Sachtouris
    def test_create_server(self, GID):
251 edf8ad52 Stavros Sachtouris
        with patch.object(
252 630dea9b Stavros Sachtouris
                ComputeClient, 'servers_post',
253 edf8ad52 Stavros Sachtouris
                side_effect=ClientError(
254 edf8ad52 Stavros Sachtouris
                    'REQUEST ENTITY TOO LARGE',
255 edf8ad52 Stavros Sachtouris
                    status=403)):
256 304a92dc Stavros Sachtouris
            self.assertRaises(
257 304a92dc Stavros Sachtouris
                ClientError,
258 304a92dc Stavros Sachtouris
                self.client.create_server,
259 304a92dc Stavros Sachtouris
                vm_name, fid, img_ref)
260 304a92dc Stavros Sachtouris
261 304a92dc Stavros Sachtouris
        with patch.object(
262 630dea9b Stavros Sachtouris
                ComputeClient, 'servers_post',
263 edf8ad52 Stavros Sachtouris
                return_value=FR()) as post:
264 304a92dc Stavros Sachtouris
            r = self.client.create_server(vm_name, fid, img_ref)
265 edf8ad52 Stavros Sachtouris
            self.assertEqual(r, FR.json['server'])
266 edf8ad52 Stavros Sachtouris
            self.assertEqual(GID.mock_calls[-1], call(img_ref))
267 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=vm_send))
268 304a92dc Stavros Sachtouris
            prsn = 'Personality string (does not work with real servers)'
269 304a92dc Stavros Sachtouris
            self.client.create_server(vm_name, fid, img_ref, prsn)
270 edf8ad52 Stavros Sachtouris
            expected = dict(server=dict(vm_send['server']))
271 edf8ad52 Stavros Sachtouris
            expected['server']['personality'] = prsn
272 edf8ad52 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(json_data=expected))
273 304a92dc Stavros Sachtouris
274 0067c031 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
275 0067c031 Stavros Sachtouris
    def test_list_servers(self, SG):
276 304a92dc Stavros Sachtouris
        FR.json = vm_list
277 0067c031 Stavros Sachtouris
        for detail in (False, True):
278 0067c031 Stavros Sachtouris
            r = self.client.list_servers(detail)
279 0067c031 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(
280 0067c031 Stavros Sachtouris
                command='detail' if detail else ''))
281 b6403d2d Stavros Sachtouris
            for i, vm in enumerate(vm_list['servers']['values']):
282 b6403d2d Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], vm)
283 b6403d2d Stavros Sachtouris
            self.assertEqual(i + 1, len(r))
284 304a92dc Stavros Sachtouris
285 26ccd6fb Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
286 26ccd6fb Stavros Sachtouris
    def test_get_server_details(self, SG):
287 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
288 304a92dc Stavros Sachtouris
        r = self.client.get_server_details(vm_id)
289 b6403d2d Stavros Sachtouris
        SG.assert_called_once_with(vm_id)
290 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, vm_recv['server'])
291 304a92dc Stavros Sachtouris
292 2ace03e5 Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
293 2ace03e5 Stavros Sachtouris
    def test_update_server_name(self, SP):
294 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
295 304a92dc Stavros Sachtouris
        new_name = vm_name + '_new'
296 304a92dc Stavros Sachtouris
        self.client.update_server_name(vm_id, new_name)
297 b6403d2d Stavros Sachtouris
        SP.assert_called_once_with(vm_id, json_data=dict(
298 b6403d2d Stavros Sachtouris
            server=dict(name=new_name)))
299 304a92dc Stavros Sachtouris
300 876aae74 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
301 876aae74 Stavros Sachtouris
    def test_reboot_server(self, SP):
302 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
303 876aae74 Stavros Sachtouris
        for hard in (None, True):
304 876aae74 Stavros Sachtouris
            self.client.reboot_server(vm_id, hard=hard)
305 876aae74 Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
306 876aae74 Stavros Sachtouris
                vm_id, 'action',
307 876aae74 Stavros Sachtouris
                json_data=dict(reboot=dict(type='HARD' if hard else 'SOFT'))))
308 304a92dc Stavros Sachtouris
309 d560c67b Stavros Sachtouris
    @patch('%s.servers_put' % compute_pkg, return_value=FR())
310 d560c67b Stavros Sachtouris
    def test_create_server_metadata(self, SP):
311 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
312 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
313 304a92dc Stavros Sachtouris
        FR.json = dict(meta=vm_recv['server'])
314 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
315 304a92dc Stavros Sachtouris
            r = self.client.create_server_metadata(vm_id, k, v)
316 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, vm_recv['server'])
317 d560c67b Stavros Sachtouris
            self.assertEqual(SP.mock_calls[-1], call(
318 d560c67b Stavros Sachtouris
                vm_id, 'meta/%s' % k,
319 d560c67b Stavros Sachtouris
                json_data=dict(meta={k: v}), success=201))
320 304a92dc Stavros Sachtouris
321 d224bb37 Stavros Sachtouris
    @patch('%s.servers_get' % compute_pkg, return_value=FR())
322 d224bb37 Stavros Sachtouris
    def test_get_server_metadata(self, SG):
323 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
324 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
325 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=dict(values=metadata))
326 304a92dc Stavros Sachtouris
        r = self.client.get_server_metadata(vm_id)
327 b6403d2d Stavros Sachtouris
        SG.assert_called_once_with(vm_id, '/meta')
328 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
329 304a92dc Stavros Sachtouris
330 304a92dc Stavros Sachtouris
        for k, v in metadata.items():
331 304a92dc Stavros Sachtouris
            FR.json = dict(meta={k: v})
332 304a92dc Stavros Sachtouris
            r = self.client.get_server_metadata(vm_id, k)
333 304a92dc Stavros Sachtouris
            self.assert_dicts_are_equal(r, {k: v})
334 d224bb37 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(vm_id, '/meta/%s' % k))
335 304a92dc Stavros Sachtouris
336 d224bb37 Stavros Sachtouris
    @patch('%s.servers_post' % compute_pkg, return_value=FR())
337 e750a969 Stavros Sachtouris
    def test_update_server_metadata(self, SP):
338 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
339 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
340 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
341 304a92dc Stavros Sachtouris
        r = self.client.update_server_metadata(vm_id, **metadata)
342 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
343 b6403d2d Stavros Sachtouris
        SP.assert_called_once_with(
344 e750a969 Stavros Sachtouris
            vm_id, 'meta',
345 b6403d2d Stavros Sachtouris
            json_data=dict(metadata=metadata), success=201)
346 304a92dc Stavros Sachtouris
347 d224bb37 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
348 dbd50059 Stavros Sachtouris
    def test_delete_server_metadata(self, SD):
349 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
350 304a92dc Stavros Sachtouris
        key = 'metakey'
351 304a92dc Stavros Sachtouris
        self.client.delete_server_metadata(vm_id, key)
352 b6403d2d Stavros Sachtouris
        SD.assert_called_once_with(vm_id, 'meta/' + key)
353 304a92dc Stavros Sachtouris
354 8c40c4a6 Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
355 8c40c4a6 Stavros Sachtouris
    def test_list_flavors(self, FG):
356 304a92dc Stavros Sachtouris
        FR.json = flavor_list
357 8c40c4a6 Stavros Sachtouris
        for cmd in ('', 'detail'):
358 8c40c4a6 Stavros Sachtouris
            r = self.client.list_flavors(detail=(cmd == 'detail'))
359 8c40c4a6 Stavros Sachtouris
            self.assertEqual(FG.mock_calls[-1], call(command=cmd))
360 8c40c4a6 Stavros Sachtouris
            self.assert_dicts_are_equal(dict(values=r), flavor_list['flavors'])
361 304a92dc Stavros Sachtouris
362 ae9c3b5f Stavros Sachtouris
    @patch('%s.flavors_get' % compute_pkg, return_value=FR())
363 ae9c3b5f Stavros Sachtouris
    def test_get_flavor_details(self, FG):
364 304a92dc Stavros Sachtouris
        FR.json = dict(flavor=flavor_list['flavors'])
365 304a92dc Stavros Sachtouris
        r = self.client.get_flavor_details(fid)
366 b6403d2d Stavros Sachtouris
        FG.assert_called_once_with(fid)
367 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, flavor_list['flavors'])
368 304a92dc Stavros Sachtouris
369 b2347a17 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
370 b2347a17 Stavros Sachtouris
    def test_list_images(self, IG):
371 304a92dc Stavros Sachtouris
        FR.json = img_list
372 b2347a17 Stavros Sachtouris
        for cmd in ('', 'detail'):
373 b2347a17 Stavros Sachtouris
            r = self.client.list_images(detail=(cmd == 'detail'))
374 b2347a17 Stavros Sachtouris
            self.assertEqual(IG.mock_calls[-1], call(command=cmd))
375 b2347a17 Stavros Sachtouris
            expected = img_list['images']['values']
376 b2347a17 Stavros Sachtouris
            for i in range(len(r)):
377 b2347a17 Stavros Sachtouris
                self.assert_dicts_are_equal(expected[i], r[i])
378 304a92dc Stavros Sachtouris
379 937ef4dd Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
380 937ef4dd Stavros Sachtouris
    def test_get_image_details(self, IG):
381 304a92dc Stavros Sachtouris
        FR.json = img_recv
382 304a92dc Stavros Sachtouris
        r = self.client.get_image_details(img_ref)
383 b6403d2d Stavros Sachtouris
        IG.assert_called_once_with(img_ref)
384 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
385 304a92dc Stavros Sachtouris
386 d224bb37 Stavros Sachtouris
    @patch('%s.images_get' % compute_pkg, return_value=FR())
387 304a92dc Stavros Sachtouris
    def test_get_image_metadata(self, IG):
388 b6403d2d Stavros Sachtouris
        for key in ('', '50m3k3y'):
389 b6403d2d Stavros Sachtouris
            FR.json = dict(meta=img_recv['image']) if (
390 b6403d2d Stavros Sachtouris
                key) else dict(metadata=dict(values=img_recv['image']))
391 b6403d2d Stavros Sachtouris
            r = self.client.get_image_metadata(img_ref, key)
392 b6403d2d Stavros Sachtouris
            self.assertEqual(IG.mock_calls[-1], call(
393 b6403d2d Stavros Sachtouris
                '%s' % img_ref,
394 b6403d2d Stavros Sachtouris
                '/meta%s' % (('/%s' % key) if key else '')))
395 b6403d2d Stavros Sachtouris
            self.assert_dicts_are_equal(img_recv['image'], r)
396 304a92dc Stavros Sachtouris
397 0651cda3 Stavros Sachtouris
    @patch('%s.servers_delete' % compute_pkg, return_value=FR())
398 0651cda3 Stavros Sachtouris
    def test_delete_server(self, SD):
399 304a92dc Stavros Sachtouris
        vm_id = vm_recv['server']['id']
400 304a92dc Stavros Sachtouris
        self.client.delete_server(vm_id)
401 1df5305d Stavros Sachtouris
        SD.assert_called_once_with(vm_id)
402 304a92dc Stavros Sachtouris
403 f711008c Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
404 f711008c Stavros Sachtouris
    def test_delete_image(self, ID):
405 304a92dc Stavros Sachtouris
        self.client.delete_image(img_ref)
406 1df5305d Stavros Sachtouris
        ID.assert_called_once_with(img_ref)
407 304a92dc Stavros Sachtouris
408 71017d87 Stavros Sachtouris
    @patch('%s.images_put' % compute_pkg, return_value=FR())
409 71017d87 Stavros Sachtouris
    def test_create_image_metadata(self, IP):
410 71017d87 Stavros Sachtouris
        (key, val) = ('k1', 'v1')
411 304a92dc Stavros Sachtouris
        FR.json = dict(meta=img_recv['image'])
412 71017d87 Stavros Sachtouris
        r = self.client.create_image_metadata(img_ref, key, val)
413 1df5305d Stavros Sachtouris
        IP.assert_called_once_with(
414 71017d87 Stavros Sachtouris
            img_ref, 'meta/%s' % key,
415 1df5305d Stavros Sachtouris
            json_data=dict(meta={key: val}))
416 71017d87 Stavros Sachtouris
        self.assert_dicts_are_equal(r, img_recv['image'])
417 304a92dc Stavros Sachtouris
418 d224bb37 Stavros Sachtouris
    @patch('%s.images_post' % compute_pkg, return_value=FR())
419 428aa852 Stavros Sachtouris
    def test_update_image_metadata(self, IP):
420 304a92dc Stavros Sachtouris
        metadata = dict(m1='v1', m2='v2', m3='v3')
421 304a92dc Stavros Sachtouris
        FR.json = dict(metadata=metadata)
422 304a92dc Stavros Sachtouris
        r = self.client.update_image_metadata(img_ref, **metadata)
423 1df5305d Stavros Sachtouris
        IP.assert_called_once_with(
424 1df5305d Stavros Sachtouris
            img_ref, 'meta',
425 1df5305d Stavros Sachtouris
            json_data=dict(metadata=metadata))
426 304a92dc Stavros Sachtouris
        self.assert_dicts_are_equal(r, metadata)
427 304a92dc Stavros Sachtouris
428 d224bb37 Stavros Sachtouris
    @patch('%s.images_delete' % compute_pkg, return_value=FR())
429 0482817c Stavros Sachtouris
    def test_delete_image_metadata(self, ID):
430 304a92dc Stavros Sachtouris
        key = 'metakey'
431 304a92dc Stavros Sachtouris
        self.client.delete_image_metadata(img_ref, key)
432 1df5305d Stavros Sachtouris
        ID.assert_called_once_with(img_ref, '/meta/%s' % key)
433 304a92dc Stavros Sachtouris
434 630dea9b Stavros Sachtouris
435 304a92dc Stavros Sachtouris
if __name__ == '__main__':
436 304a92dc Stavros Sachtouris
    from sys import argv
437 304a92dc Stavros Sachtouris
    from kamaki.clients.test import runTestCase
438 630dea9b Stavros Sachtouris
    not_found = True
439 630dea9b Stavros Sachtouris
    if not argv[1:] or argv[1] == 'Compute':
440 630dea9b Stavros Sachtouris
        not_found = False
441 630dea9b Stavros Sachtouris
        runTestCase(Compute, 'Compute Client', argv[2:])
442 630dea9b Stavros Sachtouris
    if not argv[1:] or argv[1] == 'ComputeRestApi':
443 630dea9b Stavros Sachtouris
        not_found = False
444 630dea9b Stavros Sachtouris
        runTestCase(ComputeRestApi, 'ComputeRestApi Client', argv[2:])
445 630dea9b Stavros Sachtouris
    if not_found:
446 630dea9b Stavros Sachtouris
        print('TestCase %s not found' % argv[1])