Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / cyclades / test.py @ fab9b17f

History | View | Annotate | Download (17.4 kB)

1 24851aa5 Stavros Sachtouris
# Copyright 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 3c50df2e Stavros Sachtouris
34 0482817c Stavros Sachtouris
from mock import patch, call
35 03493855 Stavros Sachtouris
from unittest import TestCase
36 68fd1bda Stavros Sachtouris
from itertools import product
37 03493855 Stavros Sachtouris
38 3c50df2e Stavros Sachtouris
from kamaki.clients import ClientError, cyclades
39 03493855 Stavros Sachtouris
40 03493855 Stavros Sachtouris
img_ref = "1m4g3-r3f3r3nc3"
41 03493855 Stavros Sachtouris
vm_name = "my new VM"
42 03493855 Stavros Sachtouris
fid = 42
43 03493855 Stavros Sachtouris
vm_recv = dict(server=dict(
44 03493855 Stavros Sachtouris
    status="BUILD",
45 03493855 Stavros Sachtouris
    updated="2013-03-01T10:04:00.637152+00:00",
46 03493855 Stavros Sachtouris
    hostId="",
47 5e194c99 Stavros Sachtouris
    name=vm_name,
48 5e194c99 Stavros Sachtouris
    imageRef=img_ref,
49 03493855 Stavros Sachtouris
    created="2013-03-01T10:04:00.087324+00:00",
50 03493855 Stavros Sachtouris
    flavorRef=fid,
51 03493855 Stavros Sachtouris
    adminPass="n0n3sh@11p@55",
52 03493855 Stavros Sachtouris
    suspended=False,
53 03493855 Stavros Sachtouris
    progress=0,
54 03493855 Stavros Sachtouris
    id=31173,
55 03493855 Stavros Sachtouris
    metadata=dict(values=dict(os="debian", users="root"))))
56 257b931a Stavros Sachtouris
vm_list = dict(servers=dict(values=[
57 257b931a Stavros Sachtouris
    dict(name='n1', id=1),
58 257b931a Stavros Sachtouris
    dict(name='n2', id=2)]))
59 e6ec9ea6 Stavros Sachtouris
net_send = dict(network=dict(dhcp=False, name='someNet'))
60 e6ec9ea6 Stavros Sachtouris
net_recv = dict(network=dict(
61 e6ec9ea6 Stavros Sachtouris
    status="PENDING",
62 e6ec9ea6 Stavros Sachtouris
    updated="2013-03-05T15:04:51.758780+00:00",
63 e6ec9ea6 Stavros Sachtouris
    name="someNet",
64 e6ec9ea6 Stavros Sachtouris
    created="2013-03-05T15:04:51.758728+00:00",
65 e6ec9ea6 Stavros Sachtouris
    cidr6=None,
66 e6ec9ea6 Stavros Sachtouris
    id="2130",
67 e6ec9ea6 Stavros Sachtouris
    gateway6=None,
68 e6ec9ea6 Stavros Sachtouris
    public=False,
69 e6ec9ea6 Stavros Sachtouris
    dhcp=False,
70 e6ec9ea6 Stavros Sachtouris
    cidr="192.168.1.0/24",
71 e6ec9ea6 Stavros Sachtouris
    type="MAC_FILTERED",
72 e6ec9ea6 Stavros Sachtouris
    gateway=None,
73 e6ec9ea6 Stavros Sachtouris
    attachments=dict(values=[dict(name='att1'), dict(name='att2')])))
74 0da4f84b Stavros Sachtouris
net_list = dict(networks=dict(values=[
75 0da4f84b Stavros Sachtouris
    dict(id=1, name='n1'),
76 0da4f84b Stavros Sachtouris
    dict(id=2, name='n2'),
77 0da4f84b Stavros Sachtouris
    dict(id=3, name='n3')]))
78 852d2713 Stavros Sachtouris
firewalls = dict(attachments=dict(values=[
79 852d2713 Stavros Sachtouris
    dict(firewallProfile='50m3_pr0f1L3', otherStuff='57uff')]))
80 03493855 Stavros Sachtouris
81 03493855 Stavros Sachtouris
82 975270f2 Stavros Sachtouris
class FR(object):
83 975270f2 Stavros Sachtouris
    """FR stands for Fake Response"""
84 975270f2 Stavros Sachtouris
    json = vm_recv
85 975270f2 Stavros Sachtouris
    headers = {}
86 975270f2 Stavros Sachtouris
    content = json
87 975270f2 Stavros Sachtouris
    status = None
88 975270f2 Stavros Sachtouris
    status_code = 200
89 975270f2 Stavros Sachtouris
90 55faa0bc Stavros Sachtouris
rest_pkg = 'kamaki.clients.cyclades.CycladesRestClient'
91 975270f2 Stavros Sachtouris
cyclades_pkg = 'kamaki.clients.cyclades.CycladesClient'
92 975270f2 Stavros Sachtouris
93 975270f2 Stavros Sachtouris
94 3c50df2e Stavros Sachtouris
class CycladesRestClient(TestCase):
95 68fd1bda Stavros Sachtouris
96 68fd1bda Stavros Sachtouris
    """Set up a Cyclades thorough test"""
97 68fd1bda Stavros Sachtouris
    def setUp(self):
98 68fd1bda Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
99 68fd1bda Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
100 3c50df2e Stavros Sachtouris
        self.client = cyclades.CycladesRestClient(self.url, self.token)
101 68fd1bda Stavros Sachtouris
102 68fd1bda Stavros Sachtouris
    def tearDown(self):
103 68fd1bda Stavros Sachtouris
        FR.json = vm_recv
104 68fd1bda Stavros Sachtouris
105 68fd1bda Stavros Sachtouris
    @patch('%s.set_param' % rest_pkg)
106 68fd1bda Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
107 fc835c42 Stavros Sachtouris
    def test_servers_get(self, get, SP):
108 68fd1bda Stavros Sachtouris
        for args in product(
109 fc835c42 Stavros Sachtouris
                ('', 'vm_id'),
110 68fd1bda Stavros Sachtouris
                ('', 'cmd'),
111 68fd1bda Stavros Sachtouris
                (200, 204),
112 68fd1bda Stavros Sachtouris
                (None, '50m3-d473'),
113 68fd1bda Stavros Sachtouris
                ({}, {'k': 'v'})):
114 68fd1bda Stavros Sachtouris
            (srv_id, command, success, changes_since, kwargs) = args
115 fc835c42 Stavros Sachtouris
            self.client.servers_get(*args[:4], **kwargs)
116 68fd1bda Stavros Sachtouris
            srv_str = '/%s' % srv_id if srv_id else ''
117 68fd1bda Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
118 68fd1bda Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
119 fc835c42 Stavros Sachtouris
                '/servers%s%s' % (srv_str, cmd_str),
120 68fd1bda Stavros Sachtouris
                success=success,
121 68fd1bda Stavros Sachtouris
                **kwargs))
122 68fd1bda Stavros Sachtouris
            if changes_since:
123 68fd1bda Stavros Sachtouris
                self.assertEqual(
124 68fd1bda Stavros Sachtouris
                    SP.mock_calls[-1],
125 68fd1bda Stavros Sachtouris
                    call('changes-since', changes_since, changes_since))
126 68fd1bda Stavros Sachtouris
127 fc835c42 Stavros Sachtouris
    @patch('%s.get' % rest_pkg, return_value=FR())
128 fc835c42 Stavros Sachtouris
    def test_networks_get(self, get):
129 fc835c42 Stavros Sachtouris
        for args in product(
130 fc835c42 Stavros Sachtouris
                ('', 'net_id'),
131 fc835c42 Stavros Sachtouris
                ('', 'cmd'),
132 fc835c42 Stavros Sachtouris
                (200, 204),
133 fc835c42 Stavros Sachtouris
                ({}, {'k': 'v'})):
134 fc835c42 Stavros Sachtouris
            (srv_id, command, success, kwargs) = args
135 fc835c42 Stavros Sachtouris
            self.client.networks_get(*args[:3], **kwargs)
136 fc835c42 Stavros Sachtouris
            srv_str = '/%s' % srv_id if srv_id else ''
137 fc835c42 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
138 fc835c42 Stavros Sachtouris
            self.assertEqual(get.mock_calls[-1], call(
139 fc835c42 Stavros Sachtouris
                '/networks%s%s' % (srv_str, cmd_str),
140 fc835c42 Stavros Sachtouris
                success=success,
141 fc835c42 Stavros Sachtouris
                **kwargs))
142 fc835c42 Stavros Sachtouris
143 fc835c42 Stavros Sachtouris
    @patch('%s.delete' % rest_pkg, return_value=FR())
144 fc835c42 Stavros Sachtouris
    def test_networks_delete(self, delete):
145 fc835c42 Stavros Sachtouris
        for args in product(
146 fc835c42 Stavros Sachtouris
                ('', 'net_id'),
147 fc835c42 Stavros Sachtouris
                ('', 'cmd'),
148 fc835c42 Stavros Sachtouris
                (202, 204),
149 fc835c42 Stavros Sachtouris
                ({}, {'k': 'v'})):
150 fc835c42 Stavros Sachtouris
            (srv_id, command, success, kwargs) = args
151 fc835c42 Stavros Sachtouris
            self.client.networks_delete(*args[:3], **kwargs)
152 fc835c42 Stavros Sachtouris
            srv_str = '/%s' % srv_id if srv_id else ''
153 fc835c42 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
154 fc835c42 Stavros Sachtouris
            self.assertEqual(delete.mock_calls[-1], call(
155 fc835c42 Stavros Sachtouris
                '/networks%s%s' % (srv_str, cmd_str),
156 fc835c42 Stavros Sachtouris
                success=success,
157 fc835c42 Stavros Sachtouris
                **kwargs))
158 68fd1bda Stavros Sachtouris
159 50edcde7 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
160 50edcde7 Stavros Sachtouris
    @patch('%s.post' % rest_pkg, return_value=FR())
161 50edcde7 Stavros Sachtouris
    def test_networks_post(self, post, SH):
162 50edcde7 Stavros Sachtouris
        from json import dumps
163 50edcde7 Stavros Sachtouris
        for args in product(
164 50edcde7 Stavros Sachtouris
                ('', 'net_id'),
165 50edcde7 Stavros Sachtouris
                ('', 'cmd'),
166 50edcde7 Stavros Sachtouris
                (None, [dict(json="data"), dict(data="json")]),
167 50edcde7 Stavros Sachtouris
                (202, 204),
168 50edcde7 Stavros Sachtouris
                ({}, {'k': 'v'})):
169 50edcde7 Stavros Sachtouris
            (srv_id, command, json_data, success, kwargs) = args
170 50edcde7 Stavros Sachtouris
            self.client.networks_post(*args[:4], **kwargs)
171 50edcde7 Stavros Sachtouris
            vm_str = '/%s' % srv_id if srv_id else ''
172 50edcde7 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
173 50edcde7 Stavros Sachtouris
            if json_data:
174 50edcde7 Stavros Sachtouris
                json_data = dumps(json_data)
175 50edcde7 Stavros Sachtouris
                self.assertEqual(SH.mock_calls[-2:], [
176 50edcde7 Stavros Sachtouris
                    call('Content-Type', 'application/json'),
177 50edcde7 Stavros Sachtouris
                    call('Content-Length', len(json_data))])
178 50edcde7 Stavros Sachtouris
            self.assertEqual(post.mock_calls[-1], call(
179 50edcde7 Stavros Sachtouris
                '/networks%s%s' % (vm_str, cmd_str),
180 50edcde7 Stavros Sachtouris
                data=json_data, success=success,
181 50edcde7 Stavros Sachtouris
                **kwargs))
182 50edcde7 Stavros Sachtouris
183 cd5c8cc9 Stavros Sachtouris
    @patch('%s.set_header' % rest_pkg)
184 cd5c8cc9 Stavros Sachtouris
    @patch('%s.put' % rest_pkg, return_value=FR())
185 cd5c8cc9 Stavros Sachtouris
    def test_networks_put(self, put, SH):
186 cd5c8cc9 Stavros Sachtouris
        from json import dumps
187 cd5c8cc9 Stavros Sachtouris
        for args in product(
188 cd5c8cc9 Stavros Sachtouris
                ('', 'net_id'),
189 cd5c8cc9 Stavros Sachtouris
                ('', 'cmd'),
190 cd5c8cc9 Stavros Sachtouris
                (None, [dict(json="data"), dict(data="json")]),
191 cd5c8cc9 Stavros Sachtouris
                (202, 204),
192 cd5c8cc9 Stavros Sachtouris
                ({}, {'k': 'v'})):
193 cd5c8cc9 Stavros Sachtouris
            (srv_id, command, json_data, success, kwargs) = args
194 cd5c8cc9 Stavros Sachtouris
            self.client.networks_put(*args[:4], **kwargs)
195 cd5c8cc9 Stavros Sachtouris
            vm_str = '/%s' % srv_id if srv_id else ''
196 cd5c8cc9 Stavros Sachtouris
            cmd_str = '/%s' % command if command else ''
197 cd5c8cc9 Stavros Sachtouris
            if json_data:
198 cd5c8cc9 Stavros Sachtouris
                json_data = dumps(json_data)
199 cd5c8cc9 Stavros Sachtouris
                self.assertEqual(SH.mock_calls[-2:], [
200 cd5c8cc9 Stavros Sachtouris
                    call('Content-Type', 'application/json'),
201 cd5c8cc9 Stavros Sachtouris
                    call('Content-Length', len(json_data))])
202 cd5c8cc9 Stavros Sachtouris
            self.assertEqual(put.mock_calls[-1], call(
203 cd5c8cc9 Stavros Sachtouris
                '/networks%s%s' % (vm_str, cmd_str),
204 cd5c8cc9 Stavros Sachtouris
                data=json_data, success=success,
205 cd5c8cc9 Stavros Sachtouris
                **kwargs))
206 cd5c8cc9 Stavros Sachtouris
207 68fd1bda Stavros Sachtouris
208 3c50df2e Stavros Sachtouris
class CycladesClient(TestCase):
209 03493855 Stavros Sachtouris
210 257b931a Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
211 03493855 Stavros Sachtouris
        for k, v in d1.items():
212 03493855 Stavros Sachtouris
            self.assertTrue(k in d2)
213 03493855 Stavros Sachtouris
            if isinstance(v, dict):
214 257b931a Stavros Sachtouris
                self.assert_dicts_are_equal(v, d2[k])
215 03493855 Stavros Sachtouris
            else:
216 03493855 Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
217 03493855 Stavros Sachtouris
218 c1004a00 Stavros Sachtouris
    """Set up a Cyclades thorough test"""
219 c1004a00 Stavros Sachtouris
    def setUp(self):
220 03493855 Stavros Sachtouris
        self.url = 'http://cyclades.example.com'
221 03493855 Stavros Sachtouris
        self.token = 'cyc14d3s70k3n'
222 3c50df2e Stavros Sachtouris
        self.client = cyclades.CycladesClient(self.url, self.token)
223 c1004a00 Stavros Sachtouris
224 c1004a00 Stavros Sachtouris
    def tearDown(self):
225 975270f2 Stavros Sachtouris
        FR.status_code = 200
226 975270f2 Stavros Sachtouris
        FR.json = vm_recv
227 c1004a00 Stavros Sachtouris
228 545be6b7 Stavros Sachtouris
    @patch('%s.servers_get' % cyclades_pkg, return_value=FR())
229 545be6b7 Stavros Sachtouris
    def test_list_servers(self, SG):
230 975270f2 Stavros Sachtouris
        FR.json = vm_list
231 545be6b7 Stavros Sachtouris
        for detail, since in ((0, 0), (True, 0), (0, 'd473'), (True, 'd473')):
232 545be6b7 Stavros Sachtouris
            r = self.client.list_servers(detail=detail, changes_since=since)
233 545be6b7 Stavros Sachtouris
            self.assertEqual(SG.mock_calls[-1], call(
234 545be6b7 Stavros Sachtouris
                command='detail' if detail else '',
235 545be6b7 Stavros Sachtouris
                changes_since=since))
236 545be6b7 Stavros Sachtouris
            expected = vm_list['servers']['values']
237 545be6b7 Stavros Sachtouris
            for i, vm in enumerate(r):
238 545be6b7 Stavros Sachtouris
                self.assert_dicts_are_equal(vm, expected[i])
239 545be6b7 Stavros Sachtouris
            self.assertEqual(i + 1, len(expected))
240 c1004a00 Stavros Sachtouris
241 d841b964 Stavros Sachtouris
    @patch('%s.servers_post' % cyclades_pkg, return_value=FR())
242 d841b964 Stavros Sachtouris
    def test_shutdown_server(self, SP):
243 386d82a1 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
244 975270f2 Stavros Sachtouris
        self.client.shutdown_server(vm_id)
245 fb392083 Stavros Sachtouris
        SP.assert_called_once_with(
246 d841b964 Stavros Sachtouris
            vm_id, 'action',
247 fb392083 Stavros Sachtouris
            json_data=dict(shutdown=dict()), success=202)
248 975270f2 Stavros Sachtouris
249 cecad288 Stavros Sachtouris
    @patch('%s.servers_post' % cyclades_pkg, return_value=FR())
250 cecad288 Stavros Sachtouris
    def test_start_server(self, SP):
251 2c987e80 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
252 975270f2 Stavros Sachtouris
        self.client.start_server(vm_id)
253 fb392083 Stavros Sachtouris
        SP.assert_called_once_with(
254 cecad288 Stavros Sachtouris
            vm_id, 'action',
255 fb392083 Stavros Sachtouris
            json_data=dict(start=dict()), success=202)
256 975270f2 Stavros Sachtouris
257 c390cb98 Stavros Sachtouris
    @patch('%s.servers_post' % cyclades_pkg, return_value=FR())
258 c390cb98 Stavros Sachtouris
    def test_get_server_console(self, SP):
259 33ebcd22 Stavros Sachtouris
        cnsl = dict(console=dict(info1='i1', info2='i2', info3='i3'))
260 975270f2 Stavros Sachtouris
        FR.json = cnsl
261 33ebcd22 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
262 975270f2 Stavros Sachtouris
        r = self.client.get_server_console(vm_id)
263 fb392083 Stavros Sachtouris
        SP.assert_called_once_with(
264 c390cb98 Stavros Sachtouris
            vm_id, 'action',
265 fb392083 Stavros Sachtouris
            json_data=dict(console=dict(type='vnc')), success=200)
266 c390cb98 Stavros Sachtouris
        self.assert_dicts_are_equal(r, cnsl['console'])
267 c1004a00 Stavros Sachtouris
268 c1004a00 Stavros Sachtouris
    def test_get_firewall_profile(self):
269 7d768bc6 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
270 852d2713 Stavros Sachtouris
        v = firewalls['attachments']['values'][0]['firewallProfile']
271 7d768bc6 Stavros Sachtouris
        with patch.object(
272 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient, 'get_server_details',
273 852d2713 Stavros Sachtouris
                return_value=firewalls) as GSD:
274 7d768bc6 Stavros Sachtouris
            r = self.client.get_firewall_profile(vm_id)
275 fb392083 Stavros Sachtouris
            GSD.assert_called_once_with(vm_id)
276 7d768bc6 Stavros Sachtouris
            self.assertEqual(r, v)
277 852d2713 Stavros Sachtouris
        with patch.object(
278 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient, 'get_server_details',
279 852d2713 Stavros Sachtouris
                return_value=dict()):
280 7d768bc6 Stavros Sachtouris
            self.assertRaises(
281 975270f2 Stavros Sachtouris
                ClientError,
282 975270f2 Stavros Sachtouris
                self.client.get_firewall_profile,
283 7d768bc6 Stavros Sachtouris
                vm_id)
284 c1004a00 Stavros Sachtouris
285 153910c8 Stavros Sachtouris
    @patch('%s.servers_post' % cyclades_pkg, return_value=FR())
286 153910c8 Stavros Sachtouris
    def test_set_firewall_profile(self, SP):
287 278f2eb3 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
288 153910c8 Stavros Sachtouris
        v = firewalls['attachments']['values'][0]['firewallProfile']
289 975270f2 Stavros Sachtouris
        self.client.set_firewall_profile(vm_id, v)
290 fb392083 Stavros Sachtouris
        SP.assert_called_once_with(
291 153910c8 Stavros Sachtouris
            vm_id, 'action',
292 fb392083 Stavros Sachtouris
            json_data=dict(firewallProfile=dict(profile=v)), success=202)
293 975270f2 Stavros Sachtouris
294 f6c1319e Stavros Sachtouris
    @patch('%s.servers_get' % cyclades_pkg, return_value=FR())
295 f6c1319e Stavros Sachtouris
    def test_get_server_stats(self, SG):
296 27f04e4f Stavros Sachtouris
        vm_id = vm_recv['server']['id']
297 27f04e4f Stavros Sachtouris
        stats = dict(stat1='v1', stat2='v2', stat3='v3', stat4='v4')
298 975270f2 Stavros Sachtouris
        FR.json = dict(stats=stats)
299 975270f2 Stavros Sachtouris
        r = self.client.get_server_stats(vm_id)
300 fb392083 Stavros Sachtouris
        SG.assert_called_once_with(vm_id, 'stats')
301 975270f2 Stavros Sachtouris
        self.assert_dicts_are_equal(stats, r)
302 975270f2 Stavros Sachtouris
303 18a27c41 Stavros Sachtouris
    @patch('%s.networks_post' % cyclades_pkg, return_value=FR())
304 18a27c41 Stavros Sachtouris
    def test_create_network(self, NP):
305 975270f2 Stavros Sachtouris
        net_name = net_send['network']['name']
306 975270f2 Stavros Sachtouris
        FR.json = net_recv
307 975270f2 Stavros Sachtouris
        full_args = dict(
308 975270f2 Stavros Sachtouris
                cidr='192.168.0.0/24',
309 975270f2 Stavros Sachtouris
                gateway='192.168.0.1',
310 975270f2 Stavros Sachtouris
                type='MAC_FILTERED',
311 975270f2 Stavros Sachtouris
                dhcp=True)
312 975270f2 Stavros Sachtouris
        test_args = dict(full_args)
313 975270f2 Stavros Sachtouris
        test_args.update(dict(empty=None, full=None))
314 f6f81cd3 Stavros Sachtouris
        net_exp = dict(dhcp=False, name=net_name, type='MAC_FILTERED')
315 975270f2 Stavros Sachtouris
        for arg, val in test_args.items():
316 975270f2 Stavros Sachtouris
            kwargs = {} if arg == 'empty' else full_args if (
317 975270f2 Stavros Sachtouris
                arg == 'full') else {arg: val}
318 18a27c41 Stavros Sachtouris
            expected = dict(network=dict(net_exp))
319 18a27c41 Stavros Sachtouris
            expected['network'].update(kwargs)
320 975270f2 Stavros Sachtouris
            r = self.client.create_network(net_name, **kwargs)
321 27f04e4f Stavros Sachtouris
            self.assertEqual(
322 18a27c41 Stavros Sachtouris
                NP.mock_calls[-1],
323 18a27c41 Stavros Sachtouris
                call(json_data=expected, success=202))
324 975270f2 Stavros Sachtouris
            self.assert_dicts_are_equal(r, net_recv['network'])
325 c1004a00 Stavros Sachtouris
326 850d58c7 Stavros Sachtouris
    @patch('%s.networks_post' % cyclades_pkg, return_value=FR())
327 850d58c7 Stavros Sachtouris
    def test_connect_server(self, NP):
328 0e8a5f03 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
329 0e8a5f03 Stavros Sachtouris
        net_id = net_recv['network']['id']
330 975270f2 Stavros Sachtouris
        self.client.connect_server(vm_id, net_id)
331 fb392083 Stavros Sachtouris
        NP.assert_called_once_with(
332 850d58c7 Stavros Sachtouris
            net_id, 'action',
333 fb392083 Stavros Sachtouris
            json_data=dict(add=dict(serverRef=vm_id)))
334 975270f2 Stavros Sachtouris
335 975270f2 Stavros Sachtouris
    @patch('%s.networks_post' % cyclades_pkg, return_value=FR())
336 975270f2 Stavros Sachtouris
    def test_disconnect_server(self, NP):
337 b87ed277 Stavros Sachtouris
        net_id, vm_id = net_recv['network']['id'], vm_recv['server']['id']
338 9ced0bd8 Stavros Sachtouris
        nic_id = 'nic-%s-%s' % (net_id, vm_id)
339 9ced0bd8 Stavros Sachtouris
        vm_nics = [
340 9ced0bd8 Stavros Sachtouris
            dict(id=nic_id, network_id=net_id),
341 9ced0bd8 Stavros Sachtouris
            dict(id='another-nic-id', network_id='another-net-id'),
342 9ced0bd8 Stavros Sachtouris
            dict(id=nic_id * 2, network_id=net_id * 2)]
343 9ced0bd8 Stavros Sachtouris
        with patch.object(
344 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient,
345 9ced0bd8 Stavros Sachtouris
                'list_server_nics',
346 975270f2 Stavros Sachtouris
                return_value=vm_nics) as LSN:
347 975270f2 Stavros Sachtouris
            r = self.client.disconnect_server(vm_id, nic_id)
348 fb392083 Stavros Sachtouris
            LSN.assert_called_once_with(vm_id)
349 fb392083 Stavros Sachtouris
            NP.assert_called_once_with(
350 b87ed277 Stavros Sachtouris
                net_id, 'action',
351 fb392083 Stavros Sachtouris
                json_data=dict(remove=dict(attachment=nic_id)))
352 fb392083 Stavros Sachtouris
            self.assertEqual(r, 1)
353 0da4f84b Stavros Sachtouris
354 a5c8ec5d Stavros Sachtouris
    @patch('%s.servers_get' % cyclades_pkg, return_value=FR())
355 a5c8ec5d Stavros Sachtouris
    def test_list_server_nics(self, SG):
356 975270f2 Stavros Sachtouris
        vm_id = vm_recv['server']['id']
357 975270f2 Stavros Sachtouris
        nics = dict(addresses=dict(values=[dict(id='nic1'), dict(id='nic2')]))
358 975270f2 Stavros Sachtouris
        FR.json = nics
359 975270f2 Stavros Sachtouris
        r = self.client.list_server_nics(vm_id)
360 fb392083 Stavros Sachtouris
        SG.assert_called_once_with(vm_id, 'ips')
361 975270f2 Stavros Sachtouris
        expected = nics['addresses']['values']
362 975270f2 Stavros Sachtouris
        for i in range(len(r)):
363 975270f2 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], expected[i])
364 a5c8ec5d Stavros Sachtouris
        self.assertEqual(i + 1, len(r))
365 975270f2 Stavros Sachtouris
366 dce00f54 Stavros Sachtouris
    @patch('%s.networks_get' % cyclades_pkg, return_value=FR())
367 dce00f54 Stavros Sachtouris
    def test_list_networks(self, NG):
368 975270f2 Stavros Sachtouris
        FR.json = net_list
369 975270f2 Stavros Sachtouris
        expected = net_list['networks']['values']
370 dce00f54 Stavros Sachtouris
        for detail in ('', 'detail'):
371 dce00f54 Stavros Sachtouris
            r = self.client.list_networks(detail=True if detail else False)
372 dce00f54 Stavros Sachtouris
            self.assertEqual(NG.mock_calls[-1], call(command=detail))
373 dce00f54 Stavros Sachtouris
            for i, net in enumerate(expected):
374 dce00f54 Stavros Sachtouris
                self.assert_dicts_are_equal(r[i], net)
375 dce00f54 Stavros Sachtouris
            self.assertEqual(i + 1, len(r))
376 975270f2 Stavros Sachtouris
377 99d462c6 Stavros Sachtouris
    @patch('%s.networks_get' % cyclades_pkg, return_value=FR())
378 99d462c6 Stavros Sachtouris
    def test_list_network_nics(self, NG):
379 c6f8aeb4 Stavros Sachtouris
        net_id = net_recv['network']['id']
380 975270f2 Stavros Sachtouris
        FR.json = net_recv
381 975270f2 Stavros Sachtouris
        r = self.client.list_network_nics(net_id)
382 be7599cf Stavros Sachtouris
        NG.assert_called_once_with(network_id=net_id)
383 975270f2 Stavros Sachtouris
        expected = net_recv['network']['attachments']['values']
384 975270f2 Stavros Sachtouris
        for i in range(len(r)):
385 975270f2 Stavros Sachtouris
            self.assert_dicts_are_equal(r[i], expected[i])
386 975270f2 Stavros Sachtouris
387 975270f2 Stavros Sachtouris
    @patch('%s.networks_post' % cyclades_pkg, return_value=FR())
388 975270f2 Stavros Sachtouris
    def test_disconnect_network_nics(self, NP):
389 9794e66a Stavros Sachtouris
        net_id = net_recv['network']['id']
390 9794e66a Stavros Sachtouris
        nics = ['nic1', 'nic2', 'nic3']
391 9794e66a Stavros Sachtouris
        with patch.object(
392 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient,
393 9794e66a Stavros Sachtouris
                'list_network_nics',
394 be7599cf Stavros Sachtouris
                return_value=nics) as LNN:
395 975270f2 Stavros Sachtouris
            self.client.disconnect_network_nics(net_id)
396 be7599cf Stavros Sachtouris
            LNN.assert_called_once_with(net_id)
397 975270f2 Stavros Sachtouris
            for i in range(len(nics)):
398 975270f2 Stavros Sachtouris
                expected = call(net_id, 'action', json_data=dict(
399 975270f2 Stavros Sachtouris
                    remove=dict(attachment=nics[i])))
400 975270f2 Stavros Sachtouris
                self.assertEqual(expected, NP.mock_calls[i])
401 975270f2 Stavros Sachtouris
402 be7599cf Stavros Sachtouris
    @patch('%s.networks_get' % cyclades_pkg, return_value=FR())
403 5f4fcc1b Stavros Sachtouris
    def test_get_network_details(self, NG):
404 975270f2 Stavros Sachtouris
        FR.json = net_recv
405 65cc246b Stavros Sachtouris
        net_id = net_recv['network']['id']
406 975270f2 Stavros Sachtouris
        r = self.client.get_network_details(net_id)
407 5f4fcc1b Stavros Sachtouris
        NG.assert_called_once_with(network_id=net_id)
408 975270f2 Stavros Sachtouris
        self.assert_dicts_are_equal(r, net_recv['network'])
409 975270f2 Stavros Sachtouris
410 fb392083 Stavros Sachtouris
    @patch('%s.networks_put' % cyclades_pkg, return_value=FR())
411 fb392083 Stavros Sachtouris
    def test_update_network_name(self, NP):
412 06030a1b Stavros Sachtouris
        net_id = net_recv['network']['id']
413 06030a1b Stavros Sachtouris
        new_name = '%s_new' % net_id
414 975270f2 Stavros Sachtouris
        self.client.update_network_name(net_id, new_name)
415 fb392083 Stavros Sachtouris
        NP.assert_called_once_with(
416 fb392083 Stavros Sachtouris
            network_id=net_id,
417 fb392083 Stavros Sachtouris
            json_data=dict(network=dict(name=new_name)))
418 975270f2 Stavros Sachtouris
419 f15a4776 Stavros Sachtouris
    def test_delete_network(self):
420 c23f1dec Stavros Sachtouris
        net_id = net_recv['network']['id']
421 f15a4776 Stavros Sachtouris
        with patch.object(
422 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient, 'networks_delete',
423 f15a4776 Stavros Sachtouris
                return_value=FR()) as ND:
424 f15a4776 Stavros Sachtouris
            self.client.delete_network(net_id)
425 f15a4776 Stavros Sachtouris
            ND.assert_called_once_with(net_id)
426 f15a4776 Stavros Sachtouris
        with patch.object(
427 3c50df2e Stavros Sachtouris
                cyclades.CycladesClient, 'networks_delete',
428 f15a4776 Stavros Sachtouris
                side_effect=ClientError('A 421 Error', 421)):
429 f15a4776 Stavros Sachtouris
            try:
430 f15a4776 Stavros Sachtouris
                self.client.delete_network(421)
431 f15a4776 Stavros Sachtouris
            except ClientError as err:
432 f15a4776 Stavros Sachtouris
                self.assertEqual(err.status, 421)
433 f15a4776 Stavros Sachtouris
                self.assertEqual(err.details, [
434 f15a4776 Stavros Sachtouris
                    'Network may be still connected to at least one server'])
435 975270f2 Stavros Sachtouris
436 68fd1bda Stavros Sachtouris
437 85898ca4 Stavros Sachtouris
if __name__ == '__main__':
438 85898ca4 Stavros Sachtouris
    from sys import argv
439 85898ca4 Stavros Sachtouris
    from kamaki.clients.test import runTestCase
440 68fd1bda Stavros Sachtouris
    not_found = True
441 3c50df2e Stavros Sachtouris
    if not argv[1:] or argv[1] == 'CycladesClient':
442 68fd1bda Stavros Sachtouris
        not_found = False
443 3c50df2e Stavros Sachtouris
        runTestCase(CycladesClient, 'Cyclades Client', argv[2:])
444 3c50df2e Stavros Sachtouris
    if not argv[1:] or argv[1] == 'CycladesRestClient':
445 68fd1bda Stavros Sachtouris
        not_found = False
446 3c50df2e Stavros Sachtouris
        runTestCase(CycladesRestClient, 'CycladesRest Client', argv[2:])
447 68fd1bda Stavros Sachtouris
    if not_found:
448 68fd1bda Stavros Sachtouris
        print('TestCase %s not found' % argv[1])