root / kamaki / clients / cyclades / test.py @ 89a1c636
History | View | Annotate | Download (9.1 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 | 77d1b504 | Stavros Sachtouris | from json import dumps |
38 | 03493855 | Stavros Sachtouris | |
39 | 3c50df2e | Stavros Sachtouris | from kamaki.clients import ClientError, cyclades |
40 | 03493855 | Stavros Sachtouris | |
41 | 03493855 | Stavros Sachtouris | img_ref = "1m4g3-r3f3r3nc3"
|
42 | 03493855 | Stavros Sachtouris | vm_name = "my new VM"
|
43 | 03493855 | Stavros Sachtouris | fid = 42
|
44 | 03493855 | Stavros Sachtouris | vm_recv = dict(server=dict( |
45 | 03493855 | Stavros Sachtouris | status="BUILD",
|
46 | 03493855 | Stavros Sachtouris | updated="2013-03-01T10:04:00.637152+00:00",
|
47 | 03493855 | Stavros Sachtouris | hostId="",
|
48 | 5e194c99 | Stavros Sachtouris | name=vm_name, |
49 | 5e194c99 | Stavros Sachtouris | imageRef=img_ref, |
50 | 03493855 | Stavros Sachtouris | created="2013-03-01T10:04:00.087324+00:00",
|
51 | 03493855 | Stavros Sachtouris | flavorRef=fid, |
52 | 03493855 | Stavros Sachtouris | adminPass="n0n3sh@11p@55",
|
53 | 03493855 | Stavros Sachtouris | suspended=False,
|
54 | 03493855 | Stavros Sachtouris | progress=0,
|
55 | 03493855 | Stavros Sachtouris | id=31173,
|
56 | bcef3ac9 | Stavros Sachtouris | metadata=dict(os="debian", users="root"))) |
57 | bcef3ac9 | Stavros Sachtouris | vm_list = dict(servers=[
|
58 | 257b931a | Stavros Sachtouris | dict(name='n1', id=1), |
59 | bcef3ac9 | Stavros Sachtouris | dict(name='n2', id=2)]) |
60 | e6ec9ea6 | Stavros Sachtouris | net_send = dict(network=dict(dhcp=False, name='someNet')) |
61 | e6ec9ea6 | Stavros Sachtouris | net_recv = dict(network=dict( |
62 | e6ec9ea6 | Stavros Sachtouris | status="PENDING",
|
63 | e6ec9ea6 | Stavros Sachtouris | updated="2013-03-05T15:04:51.758780+00:00",
|
64 | e6ec9ea6 | Stavros Sachtouris | name="someNet",
|
65 | e6ec9ea6 | Stavros Sachtouris | created="2013-03-05T15:04:51.758728+00:00",
|
66 | e6ec9ea6 | Stavros Sachtouris | cidr6=None,
|
67 | e6ec9ea6 | Stavros Sachtouris | id="2130",
|
68 | e6ec9ea6 | Stavros Sachtouris | gateway6=None,
|
69 | e6ec9ea6 | Stavros Sachtouris | public=False,
|
70 | e6ec9ea6 | Stavros Sachtouris | dhcp=False,
|
71 | e6ec9ea6 | Stavros Sachtouris | cidr="192.168.1.0/24",
|
72 | e6ec9ea6 | Stavros Sachtouris | type="MAC_FILTERED",
|
73 | e6ec9ea6 | Stavros Sachtouris | gateway=None,
|
74 | bcef3ac9 | Stavros Sachtouris | attachments=[dict(name='att1'), dict(name='att2')])) |
75 | bcef3ac9 | Stavros Sachtouris | net_list = dict(networks=[
|
76 | 0da4f84b | Stavros Sachtouris | dict(id=1, name='n1'), |
77 | 0da4f84b | Stavros Sachtouris | dict(id=2, name='n2'), |
78 | bcef3ac9 | Stavros Sachtouris | dict(id=3, name='n3')]) |
79 | bcef3ac9 | Stavros Sachtouris | firewalls = dict(attachments=[
|
80 | bcef3ac9 | Stavros Sachtouris | dict(firewallProfile='50m3_pr0f1L3', otherStuff='57uff')]) |
81 | 03493855 | Stavros Sachtouris | |
82 | 03493855 | Stavros Sachtouris | |
83 | 975270f2 | Stavros Sachtouris | class FR(object): |
84 | 975270f2 | Stavros Sachtouris | """FR stands for Fake Response"""
|
85 | 975270f2 | Stavros Sachtouris | json = vm_recv |
86 | 975270f2 | Stavros Sachtouris | headers = {} |
87 | 975270f2 | Stavros Sachtouris | content = json |
88 | 975270f2 | Stavros Sachtouris | status = None
|
89 | 975270f2 | Stavros Sachtouris | status_code = 200
|
90 | 975270f2 | Stavros Sachtouris | |
91 | 55faa0bc | Stavros Sachtouris | rest_pkg = 'kamaki.clients.cyclades.CycladesRestClient'
|
92 | 975270f2 | Stavros Sachtouris | cyclades_pkg = 'kamaki.clients.cyclades.CycladesClient'
|
93 | 975270f2 | Stavros Sachtouris | |
94 | 975270f2 | Stavros Sachtouris | |
95 | 3c50df2e | Stavros Sachtouris | class CycladesRestClient(TestCase): |
96 | 68fd1bda | Stavros Sachtouris | |
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 | 7a3c66e1 | Stavros Sachtouris | @patch('kamaki.clients.Client.get', return_value='ret') |
103 | 7a3c66e1 | Stavros Sachtouris | def test_servers_stats_get(self, get): |
104 | 7a3c66e1 | Stavros Sachtouris | server_id = 'server id'
|
105 | 7a3c66e1 | Stavros Sachtouris | self.assertEqual(self.client.servers_stats_get(server_id), 'ret') |
106 | 7a3c66e1 | Stavros Sachtouris | get.assert_called_once_with( |
107 | 7a3c66e1 | Stavros Sachtouris | '/servers/%s/stats' % server_id, success=200) |
108 | 77d1b504 | Stavros Sachtouris | |
109 | b45834eb | Stavros Sachtouris | @patch('kamaki.clients.Client.get', return_value='ret') |
110 | b45834eb | Stavros Sachtouris | def test_servers_diagnostics_get(self, get): |
111 | b45834eb | Stavros Sachtouris | server_id = 'server id'
|
112 | b45834eb | Stavros Sachtouris | self.assertEqual(
|
113 | b45834eb | Stavros Sachtouris | self.client.servers_diagnostics_get(server_id), 'ret') |
114 | b45834eb | Stavros Sachtouris | get.assert_called_once_with( |
115 | b45834eb | Stavros Sachtouris | '/servers/%s/diagnostics' % server_id, success=200) |
116 | b45834eb | Stavros Sachtouris | |
117 | 68fd1bda | Stavros Sachtouris | |
118 | e864cd9e | Stavros Sachtouris | class CycladesNetworkClient(TestCase): |
119 | e864cd9e | Stavros Sachtouris | |
120 | e864cd9e | Stavros Sachtouris | """Set up a ComputesRest thorough test"""
|
121 | e864cd9e | Stavros Sachtouris | def setUp(self): |
122 | e864cd9e | Stavros Sachtouris | self.url = 'http://network.example.com' |
123 | e864cd9e | Stavros Sachtouris | self.token = 'n2tw0rk70k3n' |
124 | e864cd9e | Stavros Sachtouris | self.client = cyclades.CycladesNetworkClient(self.url, self.token) |
125 | e864cd9e | Stavros Sachtouris | |
126 | e864cd9e | Stavros Sachtouris | def tearDown(self): |
127 | e864cd9e | Stavros Sachtouris | FR.json = vm_recv |
128 | e864cd9e | Stavros Sachtouris | del self.client |
129 | e864cd9e | Stavros Sachtouris | |
130 | 0e27687b | Stavros Sachtouris | @patch('kamaki.clients.Client.get', return_value=FR) |
131 | 0e27687b | Stavros Sachtouris | def test_list_networks(self, get): |
132 | 0e27687b | Stavros Sachtouris | FR.json = dict(networks='ret val') |
133 | 0e27687b | Stavros Sachtouris | for detail in (True, None): |
134 | 0e27687b | Stavros Sachtouris | self.assertEqual(self.client.list_networks(detail), 'ret val') |
135 | 0e27687b | Stavros Sachtouris | path = '/networks/detail' if detail else '/networks' |
136 | 0e27687b | Stavros Sachtouris | self.assertEqual(get.mock_calls[-1], call(path, success=200)) |
137 | 0e27687b | Stavros Sachtouris | |
138 | e864cd9e | Stavros Sachtouris | @patch(
|
139 | 0e27687b | Stavros Sachtouris | 'kamaki.clients.network.rest_api.NetworkRestClient.networks_post',
|
140 | e864cd9e | Stavros Sachtouris | return_value=FR()) |
141 | e864cd9e | Stavros Sachtouris | def test_create_network(self, networks_post): |
142 | e864cd9e | Stavros Sachtouris | for name, shared in product((None, 'net name'), (None, True)): |
143 | e864cd9e | Stavros Sachtouris | FR.json = dict(network='ret val') |
144 | e864cd9e | Stavros Sachtouris | type = 'net type'
|
145 | e864cd9e | Stavros Sachtouris | self.assertEqual(
|
146 | e864cd9e | Stavros Sachtouris | self.client.create_network(type, name=name, shared=shared), |
147 | e864cd9e | Stavros Sachtouris | 'ret val')
|
148 | e864cd9e | Stavros Sachtouris | req = dict(type=type, admin_state_up=True) |
149 | e864cd9e | Stavros Sachtouris | if name:
|
150 | e864cd9e | Stavros Sachtouris | req['name'] = name
|
151 | e864cd9e | Stavros Sachtouris | if shared:
|
152 | e864cd9e | Stavros Sachtouris | req['shared'] = shared
|
153 | e864cd9e | Stavros Sachtouris | expargs = dict(json_data=dict(network=req), success=201) |
154 | e864cd9e | Stavros Sachtouris | self.assertEqual(networks_post.mock_calls[-1], call(**expargs)) |
155 | e864cd9e | Stavros Sachtouris | |
156 | ccdd1b82 | Stavros Sachtouris | @patch(
|
157 | ccdd1b82 | Stavros Sachtouris | 'kamaki.clients.network.rest_api.NetworkRestClient.ports_post',
|
158 | ccdd1b82 | Stavros Sachtouris | return_value=FR) |
159 | ccdd1b82 | Stavros Sachtouris | def test_create_port(self, ports_post): |
160 | ccdd1b82 | Stavros Sachtouris | network_id, device_id, FR.json = 'netid', 'devid', dict(port='ret v') |
161 | b7d79306 | Stavros Sachtouris | for name, sec_grp, fixed_ips in product( |
162 | b7d79306 | Stavros Sachtouris | ('port name', None), |
163 | b7d79306 | Stavros Sachtouris | ([1, 2, 3], None), |
164 | b7d79306 | Stavros Sachtouris | ( |
165 | 7a3c66e1 | Stavros Sachtouris | [dict(subnet_id='sid', ip_address='ipa')], |
166 | 7a3c66e1 | Stavros Sachtouris | [dict(subnet_id='sid')], [dict(ip_address='ipa')], |
167 | b7d79306 | Stavros Sachtouris | None)):
|
168 | b7d79306 | Stavros Sachtouris | |
169 | b7d79306 | Stavros Sachtouris | if fixed_ips:
|
170 | 7a3c66e1 | Stavros Sachtouris | diff = set(['ip_address', ]).difference(fixed_ips[0]) |
171 | b7d79306 | Stavros Sachtouris | if diff:
|
172 | b7d79306 | Stavros Sachtouris | self.assertRaises(
|
173 | b7d79306 | Stavros Sachtouris | ValueError, self.client.create_port, |
174 | b7d79306 | Stavros Sachtouris | network_id, device_id, |
175 | b7d79306 | Stavros Sachtouris | name=name, |
176 | b7d79306 | Stavros Sachtouris | security_groups=sec_grp, |
177 | b7d79306 | Stavros Sachtouris | fixed_ips=fixed_ips) |
178 | b7d79306 | Stavros Sachtouris | continue
|
179 | ccdd1b82 | Stavros Sachtouris | self.assertEqual(
|
180 | ccdd1b82 | Stavros Sachtouris | self.client.create_port(
|
181 | 737995ed | Stavros Sachtouris | network_id, device_id, |
182 | b7d79306 | Stavros Sachtouris | name=name, security_groups=sec_grp, fixed_ips=fixed_ips), |
183 | ccdd1b82 | Stavros Sachtouris | 'ret v')
|
184 | ccdd1b82 | Stavros Sachtouris | req = dict(network_id=network_id, device_id=device_id)
|
185 | 737995ed | Stavros Sachtouris | if sec_grp:
|
186 | 737995ed | Stavros Sachtouris | req['security_groups'] = sec_grp
|
187 | 737995ed | Stavros Sachtouris | if name:
|
188 | 737995ed | Stavros Sachtouris | req['name'] = name
|
189 | b7d79306 | Stavros Sachtouris | if fixed_ips:
|
190 | b7d79306 | Stavros Sachtouris | req['fixed_ips'] = fixed_ips
|
191 | ccdd1b82 | Stavros Sachtouris | expargs = dict(json_data=dict(port=req), success=201) |
192 | ccdd1b82 | Stavros Sachtouris | self.assertEqual(ports_post.mock_calls[-1], call(**expargs)) |
193 | ccdd1b82 | Stavros Sachtouris | |
194 | e864cd9e | Stavros Sachtouris | |
195 | 3c50df2e | Stavros Sachtouris | class CycladesClient(TestCase): |
196 | 03493855 | Stavros Sachtouris | |
197 | 257b931a | Stavros Sachtouris | def assert_dicts_are_equal(self, d1, d2): |
198 | 03493855 | Stavros Sachtouris | for k, v in d1.items(): |
199 | 03493855 | Stavros Sachtouris | self.assertTrue(k in d2) |
200 | 03493855 | Stavros Sachtouris | if isinstance(v, dict): |
201 | 257b931a | Stavros Sachtouris | self.assert_dicts_are_equal(v, d2[k])
|
202 | 03493855 | Stavros Sachtouris | else:
|
203 | 03493855 | Stavros Sachtouris | self.assertEqual(unicode(v), unicode(d2[k])) |
204 | 03493855 | Stavros Sachtouris | |
205 | c1004a00 | Stavros Sachtouris | """Set up a Cyclades thorough test"""
|
206 | c1004a00 | Stavros Sachtouris | def setUp(self): |
207 | 03493855 | Stavros Sachtouris | self.url = 'http://cyclades.example.com' |
208 | 03493855 | Stavros Sachtouris | self.token = 'cyc14d3s70k3n' |
209 | 3c50df2e | Stavros Sachtouris | self.client = cyclades.CycladesClient(self.url, self.token) |
210 | c1004a00 | Stavros Sachtouris | |
211 | c1004a00 | Stavros Sachtouris | def tearDown(self): |
212 | 975270f2 | Stavros Sachtouris | FR.status_code = 200
|
213 | 975270f2 | Stavros Sachtouris | FR.json = vm_recv |
214 | c1004a00 | Stavros Sachtouris | |
215 | 6290b789 | Stavros Sachtouris | @patch('%s.servers_action_post' % cyclades_pkg, return_value=FR()) |
216 | d841b964 | Stavros Sachtouris | def test_shutdown_server(self, SP): |
217 | 386d82a1 | Stavros Sachtouris | vm_id = vm_recv['server']['id'] |
218 | 975270f2 | Stavros Sachtouris | self.client.shutdown_server(vm_id)
|
219 | fb392083 | Stavros Sachtouris | SP.assert_called_once_with( |
220 | 6290b789 | Stavros Sachtouris | vm_id, json_data=dict(shutdown=dict()), success=202) |
221 | 975270f2 | Stavros Sachtouris | |
222 | 6290b789 | Stavros Sachtouris | @patch('%s.servers_action_post' % cyclades_pkg, return_value=FR()) |
223 | cecad288 | Stavros Sachtouris | def test_start_server(self, SP): |
224 | 2c987e80 | Stavros Sachtouris | vm_id = vm_recv['server']['id'] |
225 | 975270f2 | Stavros Sachtouris | self.client.start_server(vm_id)
|
226 | fb392083 | Stavros Sachtouris | SP.assert_called_once_with( |
227 | 6290b789 | Stavros Sachtouris | vm_id, json_data=dict(start=dict()), success=202) |
228 | 975270f2 | Stavros Sachtouris | |
229 | 6290b789 | Stavros Sachtouris | @patch('%s.servers_action_post' % cyclades_pkg, return_value=FR()) |
230 | c390cb98 | Stavros Sachtouris | def test_get_server_console(self, SP): |
231 | 33ebcd22 | Stavros Sachtouris | cnsl = dict(console=dict(info1='i1', info2='i2', info3='i3')) |
232 | 975270f2 | Stavros Sachtouris | FR.json = cnsl |
233 | 33ebcd22 | Stavros Sachtouris | vm_id = vm_recv['server']['id'] |
234 | 975270f2 | Stavros Sachtouris | r = self.client.get_server_console(vm_id)
|
235 | fb392083 | Stavros Sachtouris | SP.assert_called_once_with( |
236 | 6290b789 | Stavros Sachtouris | vm_id, json_data=dict(console=dict(type='vnc')), success=200) |
237 | c390cb98 | Stavros Sachtouris | self.assert_dicts_are_equal(r, cnsl['console']) |
238 | c1004a00 | Stavros Sachtouris | |
239 | 68fd1bda | Stavros Sachtouris | |
240 | 85898ca4 | Stavros Sachtouris | if __name__ == '__main__': |
241 | 85898ca4 | Stavros Sachtouris | from sys import argv |
242 | 85898ca4 | Stavros Sachtouris | from kamaki.clients.test import runTestCase |
243 | 68fd1bda | Stavros Sachtouris | not_found = True
|
244 | 3c50df2e | Stavros Sachtouris | if not argv[1:] or argv[1] == 'CycladesClient': |
245 | 68fd1bda | Stavros Sachtouris | not_found = False
|
246 | e864cd9e | Stavros Sachtouris | runTestCase(CycladesNetworkClient, 'Cyclades Client', argv[2:]) |
247 | e864cd9e | Stavros Sachtouris | if not argv[1:] or argv[1] == 'CycladesNetworkClient': |
248 | e864cd9e | Stavros Sachtouris | not_found = False
|
249 | e864cd9e | Stavros Sachtouris | runTestCase(CycladesNetworkClient, 'CycladesNetwork Client', argv[2:]) |
250 | 3c50df2e | Stavros Sachtouris | if not argv[1:] or argv[1] == 'CycladesRestClient': |
251 | 68fd1bda | Stavros Sachtouris | not_found = False
|
252 | 3c50df2e | Stavros Sachtouris | runTestCase(CycladesRestClient, 'CycladesRest Client', argv[2:]) |
253 | 68fd1bda | Stavros Sachtouris | if not_found:
|
254 | 68fd1bda | Stavros Sachtouris | print('TestCase %s not found' % argv[1]) |