blob: 146bfcadede2e848803868b40b8735793a3d5849 [file] [log] [blame]
Andy Bavier614af142020-08-07 14:49:56 -07001#!/usr/bin/env python
2
3# Copyright 2020-present Open Networking Foundation
4#
Hyunsun Moon200eba52021-04-05 21:31:54 -07005# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
Andy Bavier614af142020-08-07 14:49:56 -07006
7import unittest
8import edge_monitoring_server as ems
9import datetime
10import pytz
Hyunsun Moon5f237ec2020-09-29 14:45:52 -070011import json
12import time
Andy Bavier2d60fc52021-05-04 16:13:39 -070013from copy import deepcopy
Hyunsun Moon5f237ec2020-09-29 14:45:52 -070014
15
16test_edge = {
Andy Baviere4591222021-07-07 12:44:19 -070017 'name': 'ace-menlo-rasp-pi',
Hyunsun Moon5f237ec2020-09-29 14:45:52 -070018 'status': {
19 'control_plane': 'connected',
20 'user_plane': 'connected'
21 },
Jeremy Ronquillof4200252021-02-13 16:11:04 -080022 'speedtest': {
23 'ping': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -070024 'dry_run': {
25 'transmitted': 3,
26 'received': 2,
27 'median': 5.0,
28 'min': 1.0,
29 'avg': 5.0,
30 'max': 9.0,
31 'stddev': 1.0
32 },
Jeremy Ronquillof4200252021-02-13 16:11:04 -080033 'dns': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -070034 'transmitted': 10,
35 'received': 9,
36 'median': 4.0,
Jeremy Ronquillof4200252021-02-13 16:11:04 -080037 'min': 2.0,
38 'avg': 4.0,
39 'max': 6.0,
40 'stddev': 1.0
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -070041 },
42 'iperf_server': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -070043 'transmitted': 10,
44 'received': 10,
45 'median': 3.0,
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -070046 'min': 1.0,
47 'avg': 3.0,
48 'max': 5.0,
49 'stddev': 1.0
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -070050 },
51 'management_server': {
52 'transmitted': 10,
53 'received': 8,
54 'median': 6.0,
55 'min': 2.0,
56 'avg': 6.0,
57 'max': 10.0,
58 'stddev': 1.0
Jeremy Ronquillof4200252021-02-13 16:11:04 -080059 }
Jeremy Ronquilloc7434622021-04-08 21:06:00 -070060 },
61 'iperf': {
62 'cluster': {
63 'downlink': 100.0,
64 'uplink': 10.0
65 }
Jeremy Ronquillof4200252021-02-13 16:11:04 -080066 }
67 },
Hyunsun Moon200eba52021-04-05 21:31:54 -070068 'signal_quality': {
69 'rsrq': 30,
70 'rsrp': 80
71 },
72 'last_update': time.time()
73}
74
75test_edge_status_only = {
Andy Baviere4591222021-07-07 12:44:19 -070076 'name': 'ace-menlo-rasp-pi',
Hyunsun Moon200eba52021-04-05 21:31:54 -070077 'status': {
78 'control_plane': 'connected',
79 'user_plane': 'connected'
80 },
Jeremy Ronquillof4200252021-02-13 16:11:04 -080081 'last_update': time.time()
82}
83
84test_edge_no_speedtest = {
Andy Baviere4591222021-07-07 12:44:19 -070085 'name': 'ace-menlo-rasp-pi',
Jeremy Ronquillof4200252021-02-13 16:11:04 -080086 'status': {
87 'control_plane': 'connected',
88 'user_plane': 'connected'
89 },
Hyunsun Moon200eba52021-04-05 21:31:54 -070090 'signal_quality': {
91 'rsrq': 30,
92 'rsrp': 80
93 },
94 'last_update': time.time()
95}
96
97test_edge_no_signal_quality = {
Andy Baviere4591222021-07-07 12:44:19 -070098 'name': 'ace-menlo-rasp-pi',
Hyunsun Moon200eba52021-04-05 21:31:54 -070099 'status': {
100 'control_plane': 'connected',
101 'user_plane': 'connected'
102 },
103 'speedtest': {
104 'ping': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700105 'dry_run': {
106 'transmitted': 3,
107 'received': 2,
108 'median': 5.0,
109 'min': 1.0,
110 'avg': 5.0,
111 'max': 9.0,
112 'stddev': 1.0
113 },
Hyunsun Moon200eba52021-04-05 21:31:54 -0700114 'dns': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700115 'transmitted': 10,
116 'received': 9,
117 'median': 4.0,
Hyunsun Moon200eba52021-04-05 21:31:54 -0700118 'min': 2.0,
119 'avg': 4.0,
120 'max': 6.0,
121 'stddev': 1.0
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700122 },
123 'iperf_server': {
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700124 'transmitted': 10,
125 'received': 10,
126 'median': 3.0,
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700127 'min': 1.0,
128 'avg': 3.0,
129 'max': 5.0,
130 'stddev': 1.0
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700131 },
132 'management_server': {
133 'transmitted': 10,
134 'received': 8,
135 'median': 6.0,
136 'min': 2.0,
137 'avg': 6.0,
138 'max': 10.0,
139 'stddev': 1.0
Hyunsun Moon200eba52021-04-05 21:31:54 -0700140 }
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700141 },
142 'iperf': {
143 'cluster': {
144 'downlink': 100.0,
145 'uplink': 10.0
146 }
Hyunsun Moon200eba52021-04-05 21:31:54 -0700147 }
148 },
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700149 'last_update': time.time()
150}
Andy Bavier614af142020-08-07 14:49:56 -0700151
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700152test_edge_no_iperf = {
Andy Baviere4591222021-07-07 12:44:19 -0700153 'name': 'ace-menlo-rasp-pi',
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700154 'status': {
155 'control_plane': 'connected',
156 'user_plane': 'connected'
157 },
158 'speedtest': {
159 'ping': {
160 'dns': {
161 'min': 2.0,
162 'avg': 4.0,
163 'max': 6.0,
164 'stddev': 1.0
165 }
166 }
167 },
168 'signal_quality': {
169 'rsrq': 30,
170 'rsrp': 80
171 },
172 'last_update': time.time()
173}
174
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700175test_edge_pre_0_7_0 = {
176 'name': 'ace-menlo-rasp-pi',
177 'status': {
178 'control_plane': 'connected',
179 'user_plane': 'connected'
180 },
181 'speedtest': {
182 'ping': {
183 'dns': {
184 'min': 2.0,
185 'avg': 4.0,
186 'max': 6.0,
187 'stddev': 1.0
188 },
189 'iperf_server': {
190 'min': 1.0,
191 'avg': 3.0,
192 'max': 5.0,
193 'stddev': 1.0
194 }
195 },
196 'iperf': {
197 'cluster': {
198 'downlink': 100.0,
199 'uplink': 10.0
200 }
201 }
202 },
203 'signal_quality': {
204 'rsrq': 30,
205 'rsrp': 80
206 },
207 'last_update': time.time()
208}
209
210test_edge_dns_iperf = {
211 'name': 'ace-menlo-rasp-pi',
212 'status': {
213 'control_plane': 'connected',
214 'user_plane': 'connected'
215 },
216 'speedtest': {
217 'ping': {
218 'dns': {
219 'transmitted': 10,
220 'received': 9,
221 'median': 4.0,
222 'min': 2.0,
223 'avg': 4.0,
224 'max': 6.0,
225 'stddev': 1.0
226 },
227 'iperf_server': {
228 'transmitted': 10,
229 'received': 10,
230 'median': 3.0,
231 'min': 1.0,
232 'avg': 3.0,
233 'max': 5.0,
234 'stddev': 1.0
235 }
236 },
237 'iperf': {
238 'cluster': {
239 'downlink': 100.0,
240 'uplink': 10.0
241 }
242 }
243 },
244 'signal_quality': {
245 'rsrq': 30,
246 'rsrp': 80
247 },
248 'last_update': time.time()
249}
250
251test_edge_basic_ping_stats = {
252 'name': 'ace-menlo-rasp-pi',
253 'status': {
254 'control_plane': 'connected',
255 'user_plane': 'connected'
256 },
257 'speedtest': {
258 'ping': {
259 'dry_run': {
260 'min': 1.0,
261 'avg': 5.0,
262 'max': 9.0,
263 'stddev': 1.0
264 },
265 'dns': {
266 'min': 2.0,
267 'avg': 4.0,
268 'max': 6.0,
269 'stddev': 1.0
270 },
271 'iperf_server': {
272 'min': 1.0,
273 'avg': 3.0,
274 'max': 5.0,
275 'stddev': 1.0
276 },
277 'management_server': {
278 'min': 2.0,
279 'avg': 6.0,
280 'max': 10.0,
281 'stddev': 1.0
282 }
283 },
284 'iperf': {
285 'cluster': {
286 'downlink': 100.0,
287 'uplink': 10.0
288 }
289 }
290 },
291 'signal_quality': {
292 'rsrq': 30,
293 'rsrp': 80
294 },
295 'last_update': time.time()
296}
Andy Bavier614af142020-08-07 14:49:56 -0700297
298class MyEvent:
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700299 def __init__ (self, location = "", description = "", summary = "", start = None, end = None, all_day = False):
Andy Bavier614af142020-08-07 14:49:56 -0700300 self.location = location
301 self.description = description
302 self.summary = summary
303 self.start = start
304 self.end = end
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700305 self.all_day = all_day
Andy Bavier614af142020-08-07 14:49:56 -0700306
307class MyEventNoLoc:
308 def __init__ (self, description = "", summary = ""):
309 self.description = description
310 self.summary = summary
311
312
313class TestEdgeMonitoringServer(unittest.TestCase):
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700314 def setUp(self):
315 self.app = ems.app.test_client()
Hyunsun Moon200eba52021-04-05 21:31:54 -0700316 self.emulated_time = time.mktime(time.strptime("2021-04-05 00:00:00", "%Y-%m-%d %H:%M:%S"))
317 self.time_method = time.time
318 time.time = self._get_time
319
320 def tearDown(self):
321 time.time = self.time_method
322
323 def _get_time(self):
324 return self.emulated_time
325
326 def _assert_status_metrics_exist(self, data):
Andy Baviere4591222021-07-07 12:44:19 -0700327 self.assertTrue('aetheredge_status_control_plane{name="ace-menlo-rasp-pi"} 2.0' in data)
328 self.assertTrue('aetheredge_status_user_plane{name="ace-menlo-rasp-pi"} 2.0' in data)
329 self.assertTrue('aetheredge_last_update{name="ace-menlo-rasp-pi"}' in data)
330 self.assertTrue('aetheredge_connect_test_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
331 self.assertTrue('aetheredge_ping_test_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
332 self.assertTrue('aetheredge_e2e_tests_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
333 self.assertTrue('aetheredge_e2e_tests_down{name="ace-menlo-rasp-pi"} 0.0' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700334
335 def _assert_speedtest_metrics_exist(self, data):
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700336 self.assertTrue('aetheredge_ping_dry_run_test_transmitted{name="ace-menlo-rasp-pi"} 3' in data)
337 self.assertTrue('aetheredge_ping_dry_run_test_received{name="ace-menlo-rasp-pi"} 2' in data)
338 self.assertTrue('aetheredge_ping_dry_run_test_median{name="ace-menlo-rasp-pi"} 5.0' in data)
339 self.assertTrue('aetheredge_ping_dry_run_test_min{name="ace-menlo-rasp-pi"} 1.0' in data)
340 self.assertTrue('aetheredge_ping_dry_run_test_avg{name="ace-menlo-rasp-pi"} 5.0' in data)
341 self.assertTrue('aetheredge_ping_dry_run_test_max{name="ace-menlo-rasp-pi"} 9.0' in data)
342 self.assertTrue('aetheredge_ping_dry_run_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
343
344 self.assertTrue('aetheredge_ping_dns_test_transmitted{name="ace-menlo-rasp-pi"} 10' in data)
345 self.assertTrue('aetheredge_ping_dns_test_received{name="ace-menlo-rasp-pi"} 9' in data)
346 self.assertTrue('aetheredge_ping_dns_test_median{name="ace-menlo-rasp-pi"} 4.0' in data)
Andy Baviere4591222021-07-07 12:44:19 -0700347 self.assertTrue('aetheredge_ping_dns_test_min{name="ace-menlo-rasp-pi"} 2.0' in data)
348 self.assertTrue('aetheredge_ping_dns_test_avg{name="ace-menlo-rasp-pi"} 4.0' in data)
349 self.assertTrue('aetheredge_ping_dns_test_max{name="ace-menlo-rasp-pi"} 6.0' in data)
350 self.assertTrue('aetheredge_ping_dns_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700351
352 self.assertTrue('aetheredge_ping_iperf_server_test_transmitted{name="ace-menlo-rasp-pi"} 10' in data)
353 self.assertTrue('aetheredge_ping_iperf_server_test_received{name="ace-menlo-rasp-pi"} 10' in data)
354 self.assertTrue('aetheredge_ping_iperf_server_test_median{name="ace-menlo-rasp-pi"} 3.0' in data)
Andy Baviere4591222021-07-07 12:44:19 -0700355 self.assertTrue('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"} 1.0' in data)
356 self.assertTrue('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"} 3.0' in data)
357 self.assertTrue('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"} 5.0' in data)
358 self.assertTrue('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700359
360 self.assertTrue('aetheredge_ping_management_server_test_transmitted{name="ace-menlo-rasp-pi"} 10' in data)
361 self.assertTrue('aetheredge_ping_management_server_test_received{name="ace-menlo-rasp-pi"} 8' in data)
362 self.assertTrue('aetheredge_ping_management_server_test_median{name="ace-menlo-rasp-pi"} 6.0' in data)
363 self.assertTrue('aetheredge_ping_management_server_test_min{name="ace-menlo-rasp-pi"} 2.0' in data)
364 self.assertTrue('aetheredge_ping_management_server_test_avg{name="ace-menlo-rasp-pi"} 6.0' in data)
365 self.assertTrue('aetheredge_ping_management_server_test_max{name="ace-menlo-rasp-pi"} 10.0' in data)
366 self.assertTrue('aetheredge_ping_management_server_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
367
Andy Baviere4591222021-07-07 12:44:19 -0700368 self.assertTrue('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-rasp-pi"} 100.0' in data)
369 self.assertTrue('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-rasp-pi"} 10.0' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700370
371 def _assert_signal_quality_metrics_exist(self, data):
Andy Baviere4591222021-07-07 12:44:19 -0700372 self.assertTrue('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"} 30' in data)
373 self.assertTrue('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"} 80' in data)
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700374
Andy Bavier614af142020-08-07 14:49:56 -0700375 def test_match_location(self):
Andy Baviere4591222021-07-07 12:44:19 -0700376 event = MyEvent(location = "ace-menlo-rasp-pi-production")
377 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700378 event = MyEvent(location = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700379 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700380
381 def test_match_description(self):
Andy Baviere4591222021-07-07 12:44:19 -0700382 event = MyEvent(description = "ace-menlo-rasp-pi-production")
383 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700384 event = MyEvent(description = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700385 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700386
387 def test_match_summary(self):
Andy Baviere4591222021-07-07 12:44:19 -0700388 event = MyEvent(summary = "ace-menlo-rasp-pi-production")
389 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700390 event = MyEvent(summary = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700391 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700392
393 def test_no_match(self):
Andy Baviere4591222021-07-07 12:44:19 -0700394 event = MyEvent(summary = "ace-menlo-rasp-pi-production, (Compute)-MP-1-Aether Production")
Andy Bavier8a5c9872020-10-21 13:17:53 -0700395 self.assertFalse(ems.is_my_event(event, "ace-intel"))
Andy Bavier614af142020-08-07 14:49:56 -0700396 self.assertFalse(ems.is_my_event(event, "(Compute)-MP-1-Aether Staging"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700397 self.assertFalse(ems.is_my_event(event, "ace-menlo"))
Andy Bavier614af142020-08-07 14:49:56 -0700398
399 def test_missing_field(self):
Andy Bavier8a5c9872020-10-21 13:17:53 -0700400 event = MyEventNoLoc(description = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700401 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700402
403 def test_in_window(self):
404 events = []
405 now = datetime.datetime.now(pytz.utc)
406 events.append(MyEvent(location = "(Compute)-MP-1-Aether Production",
407 start = now - datetime.timedelta(hours=1),
408 end = now + datetime.timedelta(hours=1)))
Andy Baviere4591222021-07-07 12:44:19 -0700409 self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700410 self.assertFalse(ems.in_maintenance_window(events, "ace-tucson", now))
Andy Bavier614af142020-08-07 14:49:56 -0700411
412 def test_not_in_window(self):
413 events = []
414 now = datetime.datetime.now(pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700415 events.append(MyEvent(location = "ace-menlo-rasp-pi-production",
Andy Bavier614af142020-08-07 14:49:56 -0700416 start = now + datetime.timedelta(hours=1),
417 end = now + datetime.timedelta(hours=2)))
Andy Baviere4591222021-07-07 12:44:19 -0700418 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier614af142020-08-07 14:49:56 -0700419
420 def test_no_events(self):
421 events = []
422 now = datetime.datetime.now(pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700423 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier614af142020-08-07 14:49:56 -0700424
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700425 def test_all_day_events(self):
426 events = []
Andy Baviere4591222021-07-07 12:44:19 -0700427 events.append(MyEvent(location = "ace-menlo-rasp-pi-production",
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700428 start = datetime.datetime(2020, 9, 2, 0, 0),
429 end = datetime.datetime(2020, 9, 3, 0, 0),
430 all_day = True))
431
432 ems.process_all_day_events(events)
433
434 now = datetime.datetime(2020, 9, 2, 12, 0, tzinfo=pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700435 self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700436
437 now = datetime.datetime(2020, 9, 3, 12, 0, tzinfo=pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700438 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700439
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700440 def test_get_edges(self):
441 response = self.app.get('/edges')
442 data = json.loads(response.get_data(as_text=True))
443 self.assertEqual(len(data['edges']), 1)
Andy Bavier8a5c9872020-10-21 13:17:53 -0700444 self.assertEqual(data['edges'][0]['name'], 'ace-example')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700445
Andy Bavierf872e9a2021-03-22 12:06:25 -0700446 def test_create_and_delete_edge_legacy(self):
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700447 response = self.app.post('/edges', json=test_edge)
448 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700449 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700450
451 response = self.app.get('/edges')
452 data = json.loads(response.get_data(as_text=True))
453 self.assertEqual(len(data['edges']), 2)
454
Andy Baviere47157d2020-12-11 14:13:12 -0700455 response = self.app.get('/edges/metrics')
456 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700457 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700458
459 self._assert_status_metrics_exist(data)
460 self._assert_speedtest_metrics_exist(data)
461 self._assert_signal_quality_metrics_exist(data)
Andy Baviere47157d2020-12-11 14:13:12 -0700462
Andy Baviere4591222021-07-07 12:44:19 -0700463 response = self.app.delete('/edges/ace-menlo-rasp-pi')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700464 data = json.loads(response.get_data(as_text=True))
465 self.assertEqual(data['result'], True)
Andy Baviere47157d2020-12-11 14:13:12 -0700466
467 response = self.app.get('/edges/metrics')
468 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700469 # print(data)
Andy Baviere4591222021-07-07 12:44:19 -0700470 self.assertFalse('ace-menlo-rasp-pi' in data)
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700471
472 response = self.app.get('/edges')
473 data = json.loads(response.get_data(as_text=True))
474 self.assertEqual(len(data['edges']), 1)
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700475
Andy Bavierf872e9a2021-03-22 12:06:25 -0700476 def test_create_and_delete_edge(self):
477 response = self.app.post('/testresults', json=test_edge)
478 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700479 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Andy Bavierf872e9a2021-03-22 12:06:25 -0700480
481 response = self.app.get('/edges')
482 data = json.loads(response.get_data(as_text=True))
483 self.assertEqual(len(data['edges']), 2)
484
485 response = self.app.get('/edges/metrics')
486 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700487 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700488
489 self._assert_status_metrics_exist(data)
490 self._assert_speedtest_metrics_exist(data)
491 self._assert_signal_quality_metrics_exist(data)
Andy Bavierf872e9a2021-03-22 12:06:25 -0700492
Andy Baviere4591222021-07-07 12:44:19 -0700493 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Andy Bavierf872e9a2021-03-22 12:06:25 -0700494 data = json.loads(response.get_data(as_text=True))
495 self.assertEqual(data['result'], True)
496
497 response = self.app.get('/edges/metrics')
498 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700499 # print(data)
Andy Baviere4591222021-07-07 12:44:19 -0700500 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavierf872e9a2021-03-22 12:06:25 -0700501
502 response = self.app.get('/edges')
503 data = json.loads(response.get_data(as_text=True))
504 self.assertEqual(len(data['edges']), 1)
Andy Bavier614af142020-08-07 14:49:56 -0700505
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800506 def test_create_and_delete_edge_speed_test(self):
507 response = self.app.post('/testresults', json=test_edge)
508 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700509 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800510
511 response = self.app.get('/edges/metrics')
512 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700513 # print(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800514
Hyunsun Moon200eba52021-04-05 21:31:54 -0700515 self._assert_speedtest_metrics_exist(data)
516
Andy Baviere4591222021-07-07 12:44:19 -0700517 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700518 data = json.loads(response.get_data(as_text=True))
519 self.assertEqual(data['result'], True)
520
521 def test_backwards_compatible_status_only(self):
522 response = self.app.post('/testresults', json=test_edge_status_only)
523 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700524 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700525
526 response = self.app.get('/edges/metrics')
527 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700528 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700529
Andy Baviere4591222021-07-07 12:44:19 -0700530 self.assertFalse('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"}' in data)
531 self.assertFalse('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"}' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700532
533 self._assert_status_metrics_exist(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800534
Andy Baviere4591222021-07-07 12:44:19 -0700535 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800536 data = json.loads(response.get_data(as_text=True))
537 self.assertEqual(data['result'], True)
538
539 def test_backwards_compatible_no_speedtest(self):
540 response = self.app.post('/testresults', json=test_edge_no_speedtest)
541 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700542 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800543
544 response = self.app.get('/edges/metrics')
545 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700546 # print(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800547
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700548 self.assertFalse('aetheredge_ping_dry_run_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
549 self.assertFalse('aetheredge_ping_dry_run_test_received{name="ace-menlo-rasp-pi"}' in data)
550 self.assertFalse('aetheredge_ping_dry_run_test_median{name="ace-menlo-rasp-pi"}' in data)
551 self.assertFalse('aetheredge_ping_dry_run_test_min{name="ace-menlo-rasp-pi"}' in data)
552 self.assertFalse('aetheredge_ping_dry_run_test_avg{name="ace-menlo-rasp-pi"}' in data)
553 self.assertFalse('aetheredge_ping_dry_run_test_max{name="ace-menlo-rasp-pi"}' in data)
554 self.assertFalse('aetheredge_ping_dry_run_test_stddev{name="ace-menlo-rasp-pi"}' in data)
555
556 self.assertFalse('aetheredge_ping_dns_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
557 self.assertFalse('aetheredge_ping_dns_test_received{name="ace-menlo-rasp-pi"}' in data)
558 self.assertFalse('aetheredge_ping_dns_test_median{name="ace-menlo-rasp-pi"}' in data)
Andy Baviere4591222021-07-07 12:44:19 -0700559 self.assertFalse('aetheredge_ping_dns_test_min{name="ace-menlo-rasp-pi"}' in data)
560 self.assertFalse('aetheredge_ping_dns_test_avg{name="ace-menlo-rasp-pi"}' in data)
561 self.assertFalse('aetheredge_ping_dns_test_max{name="ace-menlo-rasp-pi"}' in data)
562 self.assertFalse('aetheredge_ping_dns_test_stddev{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700563
564 self.assertFalse('aetheredge_ping_iperf_server_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
565 self.assertFalse('aetheredge_ping_iperf_server_test_received{name="ace-menlo-rasp-pi"}' in data)
566 self.assertFalse('aetheredge_ping_iperf_server_test_median{name="ace-menlo-rasp-pi"}' in data)
Andy Baviere4591222021-07-07 12:44:19 -0700567 self.assertFalse('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"}' in data)
568 self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
569 self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"}' in data)
570 self.assertFalse('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700571
572 self.assertFalse('aetheredge_ping_management_server_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
573 self.assertFalse('aetheredge_ping_management_server_test_received{name="ace-menlo-rasp-pi"}' in data)
574 self.assertFalse('aetheredge_ping_management_server_test_median{name="ace-menlo-rasp-pi"}' in data)
575 self.assertFalse('aetheredge_ping_management_server_test_min{name="ace-menlo-rasp-pi"}' in data)
576 self.assertFalse('aetheredge_ping_management_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
577 self.assertFalse('aetheredge_ping_management_server_test_max{name="ace-menlo-rasp-pi"}' in data)
578 self.assertFalse('aetheredge_ping_management_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
579
Andy Baviere4591222021-07-07 12:44:19 -0700580 self.assertFalse('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-rasp-pi"}' in data)
581 self.assertFalse('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800582
Hyunsun Moon200eba52021-04-05 21:31:54 -0700583 self._assert_status_metrics_exist(data)
584 self._assert_signal_quality_metrics_exist(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800585
Andy Baviere4591222021-07-07 12:44:19 -0700586 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800587 data = json.loads(response.get_data(as_text=True))
588 self.assertEqual(data['result'], True)
589
Hyunsun Moon200eba52021-04-05 21:31:54 -0700590 def test_backwards_compatible_no_signal_quality(self):
591 response = self.app.post('/testresults', json=test_edge_no_signal_quality)
592 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700593 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700594
595 response = self.app.get('/edges/metrics')
596 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700597 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700598
Andy Baviere4591222021-07-07 12:44:19 -0700599 self.assertFalse('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"}' in data)
600 self.assertFalse('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"}' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700601
602 self._assert_status_metrics_exist(data)
603 self._assert_speedtest_metrics_exist(data)
604
Andy Baviere4591222021-07-07 12:44:19 -0700605 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700606 data = json.loads(response.get_data(as_text=True))
607 self.assertEqual(data['result'], True)
608
609 def test_timeout_stale_result(self):
610 response = self.app.post('/testresults', json=test_edge)
611 data = json.loads(response.get_data(as_text=True))
Andy Bavier2d60fc52021-05-04 16:13:39 -0700612 # print(json.dumps(data, indent=2))
Hyunsun Moon200eba52021-04-05 21:31:54 -0700613
614 self.assertEqual(data['edge']['status']['control_plane'], 'connected')
615 self.assertEqual(data['edge']['status']['user_plane'], 'connected')
616 self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 4.0)
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700617 self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 3.0)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700618 self.assertTrue('signal_quality' in data['edge'])
619
620 self.emulated_time += (ems.NO_RESULT_THRESHOLD + 1)
621
Andy Baviere4591222021-07-07 12:44:19 -0700622 response = self.app.get('/edges/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700623 data = json.loads(response.get_data(as_text=True))
Andy Bavier2d60fc52021-05-04 16:13:39 -0700624 # print(json.dumps(data, indent=2))
Hyunsun Moon200eba52021-04-05 21:31:54 -0700625
626 self.assertEqual(data['edge']['status']['control_plane'], 'no result')
627 self.assertEqual(data['edge']['status']['user_plane'], 'no result')
628 self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 0.0)
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700629 self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 0.0)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700630 self.assertFalse('signal_quality' in data['edge'])
631
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700632 def test_backwards_compatible_no_iperf(self):
633 response = self.app.post('/testresults', json=test_edge_no_iperf)
634 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700635 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700636
637 response = self.app.get('/edges/metrics')
638 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700639 # print(data)
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700640
Andy Baviere4591222021-07-07 12:44:19 -0700641 self.assertFalse('aetheredge_iperf_cluster_downlink{name="ace-menlo-rasp-pi"}' in data)
642 self.assertFalse('aetheredge_iperf_cluster_uplink{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700643 self.assertFalse('aetheredge_ping_iperf_server_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
644 self.assertFalse('aetheredge_ping_iperf_server_test_received{name="ace-menlo-rasp-pi"}' in data)
645 self.assertFalse('aetheredge_ping_iperf_server_test_median{name="ace-menlo-rasp-pi"}' in data)
Andy Baviere4591222021-07-07 12:44:19 -0700646 self.assertFalse('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"}' in data)
647 self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
648 self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"}' in data)
649 self.assertFalse('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700650
Andy Baviere4591222021-07-07 12:44:19 -0700651 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700652 data = json.loads(response.get_data(as_text=True))
653 self.assertEqual(data['result'], True)
654
Jeremy Ronquilloe0a8b422021-11-02 12:49:15 -0700655 def test_backwards_compatible_pre_0_7_0(self):
656 response = self.app.post('/testresults', json=test_edge_pre_0_7_0)
657 data = json.loads(response.get_data(as_text=True))
658 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
659
660 response = self.app.get('/edges/metrics')
661 data = response.get_data(as_text=True)
662 # print(data)
663
664 self.assertFalse('aetheredge_ping_dry_run_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
665 self.assertFalse('aetheredge_ping_dry_run_test_received{name="ace-menlo-rasp-pi"}' in data)
666 self.assertFalse('aetheredge_ping_dry_run_test_median{name="ace-menlo-rasp-pi"}' in data)
667 self.assertFalse('aetheredge_ping_dry_run_test_min{name="ace-menlo-rasp-pi"}' in data)
668 self.assertFalse('aetheredge_ping_dry_run_test_avg{name="ace-menlo-rasp-pi"}' in data)
669 self.assertFalse('aetheredge_ping_dry_run_test_max{name="ace-menlo-rasp-pi"}' in data)
670 self.assertFalse('aetheredge_ping_dry_run_test_stddev{name="ace-menlo-rasp-pi"}' in data)
671
672 self.assertFalse('aetheredge_ping_management_server_test_transmitted{name="ace-menlo-rasp-pi"}' in data)
673 self.assertFalse('aetheredge_ping_management_server_test_received{name="ace-menlo-rasp-pi"}' in data)
674 self.assertFalse('aetheredge_ping_management_server_test_median{name="ace-menlo-rasp-pi"}' in data)
675 self.assertFalse('aetheredge_ping_management_server_test_min{name="ace-menlo-rasp-pi"}' in data)
676 self.assertFalse('aetheredge_ping_management_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
677 self.assertFalse('aetheredge_ping_management_server_test_max{name="ace-menlo-rasp-pi"}' in data)
678 self.assertFalse('aetheredge_ping_management_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
679
680 self.assertFalse('aetheredge_ping_dns_test_transmitted{name="ace-menlo-rasp-pi"} 10' in data)
681 self.assertFalse('aetheredge_ping_dns_test_received{name="ace-menlo-rasp-pi"} 9' in data)
682 self.assertFalse('aetheredge_ping_dns_test_median{name="ace-menlo-rasp-pi"} 4.0' in data)
683
684 self.assertFalse('aetheredge_ping_iperf_server_test_transmitted{name="ace-menlo-rasp-pi"} 10' in data)
685 self.assertFalse('aetheredge_ping_iperf_server_test_received{name="ace-menlo-rasp-pi"} 10' in data)
686 self.assertFalse('aetheredge_ping_iperf_server_test_median{name="ace-menlo-rasp-pi"} 3.0' in data)
687
688 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
689 data = json.loads(response.get_data(as_text=True))
690 self.assertEqual(data['result'], True)
691
Andy Bavier2d60fc52021-05-04 16:13:39 -0700692 def test_handle_invalid_schema(self):
693 response = self.app.post('/testresults', json="")
694 self.assertEqual(response.status_code, 400)
695
696 no_name = deepcopy(test_edge)
697 del no_name['name']
698 response = self.app.post('/testresults', json=no_name)
699 self.assertEqual(response.status_code, 400)
700 response = self.app.get('/edges/metrics')
701 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700702 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700703
704 no_status = deepcopy(test_edge)
705 del no_status['status']
706 response = self.app.post('/testresults', json=no_status)
707 self.assertEqual(response.status_code, 400)
708 response = self.app.get('/edges/metrics')
709 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700710 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700711
712 bad_status = deepcopy(test_edge)
713 bad_status['status']['control_plane'] = 1
714 response = self.app.post('/testresults', json=bad_status)
715 self.assertEqual(response.status_code, 400)
716 response = self.app.get('/edges/metrics')
717 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700718 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700719
720 bad_ping_result = deepcopy(test_edge)
721 bad_ping_result['speedtest']['ping']['dns']['min'] = "foo"
722 response = self.app.post('/testresults', json=bad_ping_result)
723 self.assertEqual(response.status_code, 400)
724 response = self.app.get('/edges/metrics')
725 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700726 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700727
728 bad_iperf_result = deepcopy(test_edge)
729 bad_iperf_result['speedtest']['iperf']['cluster']['uplink'] = "foo"
730 response = self.app.post('/testresults', json=bad_iperf_result)
731 self.assertEqual(response.status_code, 400)
732 response = self.app.get('/edges/metrics')
733 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700734 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700735
736 bad_signal_quality = deepcopy(test_edge)
737 del bad_signal_quality['signal_quality']['rsrq']
738 response = self.app.post('/testresults', json=bad_signal_quality)
739 self.assertEqual(response.status_code, 400)
740 response = self.app.get('/edges/metrics')
741 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700742 self.assertFalse('ace-menlo-rasp-pi' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700743
Andy Bavier614af142020-08-07 14:49:56 -0700744if __name__ == '__main__':
Andy Bavier55dc5872021-05-05 11:31:42 -0700745 import xmlrunner
746 with open('results.xml', 'wb') as output:
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700747 unittest.main(testRunner=xmlrunner.XMLTestRunner(verbosity=2, output=output))