blob: a9c9bc17c542f886942837181fb86ee3714af19e [file] [log] [blame]
Zsolt Haraszti66862032016-11-28 14:28:39 -08001from random import randint
2from time import time, sleep
3
Zsolt Haraszti00d9a842016-11-23 11:18:23 -08004from google.protobuf.json_format import MessageToDict
Zsolt Haraszti66862032016-11-28 14:28:39 -08005from unittest import main
Zsolt Haraszti00d9a842016-11-23 11:18:23 -08006
Zsolt Haraszti66862032016-11-28 14:28:39 -08007from tests.itests.voltha.rest_base import RestBase
8from voltha.core.flow_decomposer import mk_simple_flow_mod, in_port, output
9from voltha.protos import openflow_13_pb2 as ofp
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080010
11
Zsolt Haraszti66862032016-11-28 14:28:39 -080012class GlobalRestCalls(RestBase):
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080013
14 # ~~~~~~~~~~~~~~~~~~~~~ GLOBAL TOP-LEVEL SERVICES~ ~~~~~~~~~~~~~~~~~~~~~~~~
15
16 def test_get_root(self):
17 res = self.get('/', expected_content_type='text/html')
18 self.assertGreaterEqual(res.find('swagger'), 0)
19
20 def test_get_schema(self):
21 res = self.get('/schema')
22 self.assertEqual(set(res.keys()), {'protos', 'swagger_from'})
23
24 def test_get_health(self):
25 res = self.get('/health')
26 self.assertEqual(res['state'], 'HEALTHY')
27
28 # ~~~~~~~~~~~~~~~~~~~~~ TOP LEVEL VOLTHA OPERATIONS ~~~~~~~~~~~~~~~~~~~~~~~
29
30 def test_get_voltha(self):
31 res = self.get('/api/v1')
32 self.assertEqual(res['version'], '0.9.0')
33
34 def test_list_voltha_instances(self):
35 res = self.get('/api/v1/instances')
36 self.assertEqual(len(res['items']), 1)
37
38 def test_get_voltha_instance(self):
39 res = self.get('/api/v1/instances/1')
40 self.assertEqual(res['version'], '0.9.0')
41
42 def test_list_logical_devices(self):
43 res = self.get('/api/v1/logical_devices')
44 self.assertGreaterEqual(len(res['items']), 1)
45
46 def test_get_logical_device(self):
47 res = self.get('/api/v1/logical_devices/simulated1')
Zsolt Haraszti66862032016-11-28 14:28:39 -080048 self.assertEqual(res['datapath_id'], '1')
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080049
50 def test_list_logical_device_ports(self):
51 res = self.get('/api/v1/logical_devices/simulated1/ports')
52 self.assertGreaterEqual(len(res['items']), 3)
53
54 def test_list_and_update_logical_device_flows(self):
55
56 # retrieve flow list
57 res = self.get('/api/v1/logical_devices/simulated1/flows')
58 len_before = len(res['items'])
59
60 # add some flows
Zsolt Haraszti66862032016-11-28 14:28:39 -080061 req = ofp.FlowTableUpdate(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080062 id='simulated1',
Zsolt Haraszti66862032016-11-28 14:28:39 -080063 flow_mod=mk_simple_flow_mod(
64 cookie=randint(1, 10000000000),
65 priority=len_before,
66 match_fields=[
67 in_port(129)
68 ],
69 actions=[
70 output(1)
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080071 ]
72 )
73 )
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080074 res = self.post('/api/v1/logical_devices/simulated1/flows',
Zsolt Haraszti66862032016-11-28 14:28:39 -080075 MessageToDict(req, preserving_proto_field_name=True),
76 expected_code=200)
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080077 # TODO check some stuff on res
78
79 res = self.get('/api/v1/logical_devices/simulated1/flows')
80 len_after = len(res['items'])
81 self.assertGreater(len_after, len_before)
82
83 def test_list_and_update_logical_device_flow_groups(self):
84
85 # retrieve flow list
86 res = self.get('/api/v1/logical_devices/simulated1/flow_groups')
87 len_before = len(res['items'])
88
89 # add some flows
Zsolt Haraszti66862032016-11-28 14:28:39 -080090 req = ofp.FlowGroupTableUpdate(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080091 id='simulated1',
Zsolt Haraszti66862032016-11-28 14:28:39 -080092 group_mod=ofp.ofp_group_mod(
93 command=ofp.OFPGC_ADD,
94 type=ofp.OFPGT_ALL,
95 group_id=len_before + 1,
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080096 buckets=[
Zsolt Haraszti66862032016-11-28 14:28:39 -080097 ofp.ofp_bucket(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -080098 actions=[
Zsolt Haraszti66862032016-11-28 14:28:39 -080099 ofp.ofp_action(
100 type=ofp.OFPAT_OUTPUT,
101 output=ofp.ofp_action_output(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800102 port=1
103 )
104 )
105 ]
106 )
107 ]
108 )
109 )
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800110 res = self.post('/api/v1/logical_devices/simulated1/flow_groups',
Zsolt Haraszti66862032016-11-28 14:28:39 -0800111 MessageToDict(req, preserving_proto_field_name=True),
112 expected_code=200)
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800113 # TODO check some stuff on res
114
115 res = self.get('/api/v1/logical_devices/simulated1/flow_groups')
116 len_after = len(res['items'])
117 self.assertGreater(len_after, len_before)
118
119 def test_list_devices(self):
120 res = self.get('/api/v1/devices')
121 self.assertGreaterEqual(len(res['items']), 2)
122
123 def test_get_device(self):
124 res = self.get('/api/v1/devices/simulated_olt_1')
125 # TODO test result
126
127 def test_list_device_ports(self):
128 res = self.get('/api/v1/devices/simulated_olt_1/ports')
129 self.assertGreaterEqual(len(res['items']), 2)
130
131 def test_list_device_flows(self):
Zsolt Haraszti66862032016-11-28 14:28:39 -0800132 # pump some flows into the logical device
133 self.test_list_and_update_logical_device_flows()
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800134 res = self.get('/api/v1/devices/simulated_olt_1/flows')
Zsolt Haraszti66862032016-11-28 14:28:39 -0800135 self.assertGreaterEqual(len(res['items']), 1)
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800136
137 def test_list_device_flow_groups(self):
138 res = self.get('/api/v1/devices/simulated_olt_1/flow_groups')
139 self.assertGreaterEqual(len(res['items']), 0)
140
141 def test_list_device_types(self):
142 res = self.get('/api/v1/device_types')
143 self.assertGreaterEqual(len(res['items']), 2)
144
145 def test_get_device_type(self):
146 res = self.get('/api/v1/device_types/simulated_olt')
147 # TODO test the result
148
149 def test_list_device_groups(self):
150 res = self.get('/api/v1/device_groups')
151 self.assertGreaterEqual(len(res['items']), 1)
152
153 def test_get_device_group(self):
154 res = self.get('/api/v1/device_groups/1')
155 # TODO test the result
156
Zsolt Haraszti66862032016-11-28 14:28:39 -0800157
158class TestLocalRestCalls(RestBase):
159
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800160 # ~~~~~~~~~~~~~~~~~~ VOLTHA INSTANCE LEVEL OPERATIONS ~~~~~~~~~~~~~~~~~~~~~
161
162 def test_get_local(self):
163 self.assertEqual(self.get('/api/v1/local')['version'], '0.9.0')
164
165 def test_get_local_health(self):
166 d = self.get('/api/v1/local/health')
167 self.assertEqual(d['state'], 'HEALTHY')
168
169 def test_list_local_adapters(self):
170 self.assertGreaterEqual(
171 len(self.get('/api/v1/local/adapters')['items']), 1)
172
173 def test_list_local_logical_devices(self):
174 self.assertGreaterEqual(
175 len(self.get('/api/v1/local/logical_devices')['items']), 1)
176
177 def test_get_local_logical_device(self):
178 res = self.get('/api/v1/local/logical_devices/simulated1')
Zsolt Haraszti66862032016-11-28 14:28:39 -0800179 self.assertEqual(res['datapath_id'], '1')
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800180
181 def test_list_local_logical_device_ports(self):
182 res = self.get('/api/v1/local/logical_devices/simulated1/ports')
183 self.assertGreaterEqual(len(res['items']), 3)
184
185 def test_list_and_update_local_logical_device_flows(self):
186
187 # retrieve flow list
188 res = self.get('/api/v1/local/logical_devices/simulated1/flows')
189 len_before = len(res['items'])
190
Zsolt Haraszti66862032016-11-28 14:28:39 -0800191 t0 = time()
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800192 # add some flows
Zsolt Haraszti66862032016-11-28 14:28:39 -0800193 for _ in xrange(10):
194 req = ofp.FlowTableUpdate(
195 id='simulated1',
196 flow_mod=mk_simple_flow_mod(
197 cookie=randint(1, 10000000000),
198 priority=randint(1, 10000), # to make it unique
199 match_fields=[
200 in_port(129)
201 ],
202 actions=[
203 output(1)
204 ]
205 )
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800206 )
Zsolt Haraszti66862032016-11-28 14:28:39 -0800207 self.post('/api/v1/local/logical_devices/simulated1/flows',
208 MessageToDict(req, preserving_proto_field_name=True),
209 expected_code=200)
210 print time() - t0
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800211
212 res = self.get('/api/v1/local/logical_devices/simulated1/flows')
213 len_after = len(res['items'])
214 self.assertGreater(len_after, len_before)
215
216 def test_list_and_update_local_logical_device_flow_groups(self):
217
218 # retrieve flow list
219 res = self.get('/api/v1/local/logical_devices/simulated1/flow_groups')
220 len_before = len(res['items'])
221
222 # add some flows
Zsolt Haraszti66862032016-11-28 14:28:39 -0800223 req = ofp.FlowGroupTableUpdate(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800224 id='simulated1',
Zsolt Haraszti66862032016-11-28 14:28:39 -0800225 group_mod=ofp.ofp_group_mod(
226 command=ofp.OFPGC_ADD,
227 type=ofp.OFPGT_ALL,
228 group_id=len_before + 1,
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800229 buckets=[
Zsolt Haraszti66862032016-11-28 14:28:39 -0800230 ofp.ofp_bucket(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800231 actions=[
Zsolt Haraszti66862032016-11-28 14:28:39 -0800232 ofp.ofp_action(
233 type=ofp.OFPAT_OUTPUT,
234 output=ofp.ofp_action_output(
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800235 port=1
236 )
237 )
238 ]
239 )
240 ]
241 )
242 )
243
244 res = self.post('/api/v1/local/logical_devices/simulated1/flow_groups',
Zsolt Haraszti66862032016-11-28 14:28:39 -0800245 MessageToDict(req, preserving_proto_field_name=True),
246 expected_code=200)
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800247 # TODO check some stuff on res
248
249 res = self.get('/api/v1/local/logical_devices/simulated1/flow_groups')
250 len_after = len(res['items'])
251 self.assertGreater(len_after, len_before)
252
253 def test_list_local_devices(self):
254 res = self.get('/api/v1/local/devices')
255 self.assertGreaterEqual(len(res['items']), 2)
256
257 def test_get_local_device(self):
258 res = self.get('/api/v1/local/devices/simulated_olt_1')
259 # TODO test result
260
261 def test_list_local_device_ports(self):
262 res = self.get('/api/v1/local/devices/simulated_olt_1/ports')
263 self.assertGreaterEqual(len(res['items']), 2)
264
265 def test_list_local_device_flows(self):
266 res = self.get('/api/v1/local/devices/simulated_olt_1/flows')
267 self.assertGreaterEqual(len(res['items']), 0)
268
269 def test_list_local_device_flow_groups(self):
270 res = self.get('/api/v1/local/devices/simulated_olt_1/flow_groups')
271 self.assertGreaterEqual(len(res['items']), 0)
272
273 def test_list_local_device_types(self):
274 res = self.get('/api/v1/local/device_types')
275 self.assertGreaterEqual(len(res['items']), 2)
276
277 def test_get_local_device_type(self):
278 res = self.get('/api/v1/local/device_types/simulated_olt')
279 # TODO test the result
280
281 def test_list_local_device_groups(self):
282 res = self.get('/api/v1/local/device_groups')
283 self.assertGreaterEqual(len(res['items']), 1)
284
285 def test_get_local_device_group(self):
286 res = self.get('/api/v1/local/device_groups/1')
287 # TODO test the result
288
289
Zsolt Haraszti66862032016-11-28 14:28:39 -0800290class TestGlobalNegativeCases(RestBase):
291
292 # ~~~~~~~~~~~~~~~~~~~~~~~~~~ NEGATIVE TEST CASES ~~~~~~~~~~~~~~~~~~~~~~~~~~
293
294 def test_invalid_url(self):
295 self.get('/some_invalid_url', expected_code=404)
296
297 def test_instance_not_found(self):
298 self.get('/api/v1/instances/nay', expected_code=404)
299
300 def test_logical_device_not_found(self):
301 self.get('/api/v1/logical_devices/nay', expected_code=404)
302
303 def test_device_not_found(self):
304 self.get('/api/v1/devices/nay', expected_code=404)
305
306 # TODO add more negative cases
307
308
Zsolt Haraszti00d9a842016-11-23 11:18:23 -0800309if __name__ == '__main__':
310 main()