blob: 24b8953ad8bf74627b9f360b8f585dc1ee2c3dd1 [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': {
24 'dns': {
25 'min': 2.0,
26 'avg': 4.0,
27 'max': 6.0,
28 'stddev': 1.0
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -070029 },
30 'iperf_server': {
31 'min': 1.0,
32 'avg': 3.0,
33 'max': 5.0,
34 'stddev': 1.0
Jeremy Ronquillof4200252021-02-13 16:11:04 -080035 }
Jeremy Ronquilloc7434622021-04-08 21:06:00 -070036 },
37 'iperf': {
38 'cluster': {
39 'downlink': 100.0,
40 'uplink': 10.0
41 }
Jeremy Ronquillof4200252021-02-13 16:11:04 -080042 }
43 },
Hyunsun Moon200eba52021-04-05 21:31:54 -070044 'signal_quality': {
45 'rsrq': 30,
46 'rsrp': 80
47 },
48 'last_update': time.time()
49}
50
51test_edge_status_only = {
Andy Baviere4591222021-07-07 12:44:19 -070052 'name': 'ace-menlo-rasp-pi',
Hyunsun Moon200eba52021-04-05 21:31:54 -070053 'status': {
54 'control_plane': 'connected',
55 'user_plane': 'connected'
56 },
Jeremy Ronquillof4200252021-02-13 16:11:04 -080057 'last_update': time.time()
58}
59
60test_edge_no_speedtest = {
Andy Baviere4591222021-07-07 12:44:19 -070061 'name': 'ace-menlo-rasp-pi',
Jeremy Ronquillof4200252021-02-13 16:11:04 -080062 'status': {
63 'control_plane': 'connected',
64 'user_plane': 'connected'
65 },
Hyunsun Moon200eba52021-04-05 21:31:54 -070066 'signal_quality': {
67 'rsrq': 30,
68 'rsrp': 80
69 },
70 'last_update': time.time()
71}
72
73test_edge_no_signal_quality = {
Andy Baviere4591222021-07-07 12:44:19 -070074 'name': 'ace-menlo-rasp-pi',
Hyunsun Moon200eba52021-04-05 21:31:54 -070075 'status': {
76 'control_plane': 'connected',
77 'user_plane': 'connected'
78 },
79 'speedtest': {
80 'ping': {
81 'dns': {
82 'min': 2.0,
83 'avg': 4.0,
84 'max': 6.0,
85 'stddev': 1.0
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -070086 },
87 'iperf_server': {
88 'min': 1.0,
89 'avg': 3.0,
90 'max': 5.0,
91 'stddev': 1.0
Hyunsun Moon200eba52021-04-05 21:31:54 -070092 }
Jeremy Ronquilloc7434622021-04-08 21:06:00 -070093 },
94 'iperf': {
95 'cluster': {
96 'downlink': 100.0,
97 'uplink': 10.0
98 }
Hyunsun Moon200eba52021-04-05 21:31:54 -070099 }
100 },
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700101 'last_update': time.time()
102}
Andy Bavier614af142020-08-07 14:49:56 -0700103
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700104test_edge_no_iperf = {
Andy Baviere4591222021-07-07 12:44:19 -0700105 'name': 'ace-menlo-rasp-pi',
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700106 'status': {
107 'control_plane': 'connected',
108 'user_plane': 'connected'
109 },
110 'speedtest': {
111 'ping': {
112 'dns': {
113 'min': 2.0,
114 'avg': 4.0,
115 'max': 6.0,
116 'stddev': 1.0
117 }
118 }
119 },
120 'signal_quality': {
121 'rsrq': 30,
122 'rsrp': 80
123 },
124 'last_update': time.time()
125}
126
Andy Bavier614af142020-08-07 14:49:56 -0700127
128class MyEvent:
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700129 def __init__ (self, location = "", description = "", summary = "", start = None, end = None, all_day = False):
Andy Bavier614af142020-08-07 14:49:56 -0700130 self.location = location
131 self.description = description
132 self.summary = summary
133 self.start = start
134 self.end = end
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700135 self.all_day = all_day
Andy Bavier614af142020-08-07 14:49:56 -0700136
137class MyEventNoLoc:
138 def __init__ (self, description = "", summary = ""):
139 self.description = description
140 self.summary = summary
141
142
143class TestEdgeMonitoringServer(unittest.TestCase):
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700144 def setUp(self):
145 self.app = ems.app.test_client()
Hyunsun Moon200eba52021-04-05 21:31:54 -0700146 self.emulated_time = time.mktime(time.strptime("2021-04-05 00:00:00", "%Y-%m-%d %H:%M:%S"))
147 self.time_method = time.time
148 time.time = self._get_time
149
150 def tearDown(self):
151 time.time = self.time_method
152
153 def _get_time(self):
154 return self.emulated_time
155
156 def _assert_status_metrics_exist(self, data):
Andy Baviere4591222021-07-07 12:44:19 -0700157 self.assertTrue('aetheredge_status_control_plane{name="ace-menlo-rasp-pi"} 2.0' in data)
158 self.assertTrue('aetheredge_status_user_plane{name="ace-menlo-rasp-pi"} 2.0' in data)
159 self.assertTrue('aetheredge_last_update{name="ace-menlo-rasp-pi"}' in data)
160 self.assertTrue('aetheredge_connect_test_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
161 self.assertTrue('aetheredge_ping_test_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
162 self.assertTrue('aetheredge_e2e_tests_ok{name="ace-menlo-rasp-pi"} 1.0' in data)
163 self.assertTrue('aetheredge_e2e_tests_down{name="ace-menlo-rasp-pi"} 0.0' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700164
165 def _assert_speedtest_metrics_exist(self, data):
Andy Baviere4591222021-07-07 12:44:19 -0700166 self.assertTrue('aetheredge_ping_dns_test_min{name="ace-menlo-rasp-pi"} 2.0' in data)
167 self.assertTrue('aetheredge_ping_dns_test_avg{name="ace-menlo-rasp-pi"} 4.0' in data)
168 self.assertTrue('aetheredge_ping_dns_test_max{name="ace-menlo-rasp-pi"} 6.0' in data)
169 self.assertTrue('aetheredge_ping_dns_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
170 self.assertTrue('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"} 1.0' in data)
171 self.assertTrue('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"} 3.0' in data)
172 self.assertTrue('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"} 5.0' in data)
173 self.assertTrue('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"} 1.0' in data)
174 self.assertTrue('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-rasp-pi"} 100.0' in data)
175 self.assertTrue('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-rasp-pi"} 10.0' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700176
177 def _assert_signal_quality_metrics_exist(self, data):
Andy Baviere4591222021-07-07 12:44:19 -0700178 self.assertTrue('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"} 30' in data)
179 self.assertTrue('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"} 80' in data)
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700180
Andy Bavier614af142020-08-07 14:49:56 -0700181 def test_match_location(self):
Andy Baviere4591222021-07-07 12:44:19 -0700182 event = MyEvent(location = "ace-menlo-rasp-pi-production")
183 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700184 event = MyEvent(location = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700185 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700186
187 def test_match_description(self):
Andy Baviere4591222021-07-07 12:44:19 -0700188 event = MyEvent(description = "ace-menlo-rasp-pi-production")
189 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700190 event = MyEvent(description = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700191 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700192
193 def test_match_summary(self):
Andy Baviere4591222021-07-07 12:44:19 -0700194 event = MyEvent(summary = "ace-menlo-rasp-pi-production")
195 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700196 event = MyEvent(summary = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700197 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700198
199 def test_no_match(self):
Andy Baviere4591222021-07-07 12:44:19 -0700200 event = MyEvent(summary = "ace-menlo-rasp-pi-production, (Compute)-MP-1-Aether Production")
Andy Bavier8a5c9872020-10-21 13:17:53 -0700201 self.assertFalse(ems.is_my_event(event, "ace-intel"))
Andy Bavier614af142020-08-07 14:49:56 -0700202 self.assertFalse(ems.is_my_event(event, "(Compute)-MP-1-Aether Staging"))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700203 self.assertFalse(ems.is_my_event(event, "ace-menlo"))
Andy Bavier614af142020-08-07 14:49:56 -0700204
205 def test_missing_field(self):
Andy Bavier8a5c9872020-10-21 13:17:53 -0700206 event = MyEventNoLoc(description = "(Compute)-MP-1-Aether Production")
Andy Baviere4591222021-07-07 12:44:19 -0700207 self.assertTrue(ems.is_my_event(event, "ace-menlo-rasp-pi"))
Andy Bavier614af142020-08-07 14:49:56 -0700208
209 def test_in_window(self):
210 events = []
211 now = datetime.datetime.now(pytz.utc)
212 events.append(MyEvent(location = "(Compute)-MP-1-Aether Production",
213 start = now - datetime.timedelta(hours=1),
214 end = now + datetime.timedelta(hours=1)))
Andy Baviere4591222021-07-07 12:44:19 -0700215 self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier8a5c9872020-10-21 13:17:53 -0700216 self.assertFalse(ems.in_maintenance_window(events, "ace-tucson", now))
Andy Bavier614af142020-08-07 14:49:56 -0700217
218 def test_not_in_window(self):
219 events = []
220 now = datetime.datetime.now(pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700221 events.append(MyEvent(location = "ace-menlo-rasp-pi-production",
Andy Bavier614af142020-08-07 14:49:56 -0700222 start = now + datetime.timedelta(hours=1),
223 end = now + datetime.timedelta(hours=2)))
Andy Baviere4591222021-07-07 12:44:19 -0700224 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier614af142020-08-07 14:49:56 -0700225
226 def test_no_events(self):
227 events = []
228 now = datetime.datetime.now(pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700229 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavier614af142020-08-07 14:49:56 -0700230
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700231 def test_all_day_events(self):
232 events = []
Andy Baviere4591222021-07-07 12:44:19 -0700233 events.append(MyEvent(location = "ace-menlo-rasp-pi-production",
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700234 start = datetime.datetime(2020, 9, 2, 0, 0),
235 end = datetime.datetime(2020, 9, 3, 0, 0),
236 all_day = True))
237
238 ems.process_all_day_events(events)
239
240 now = datetime.datetime(2020, 9, 2, 12, 0, tzinfo=pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700241 self.assertTrue(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700242
243 now = datetime.datetime(2020, 9, 3, 12, 0, tzinfo=pytz.utc)
Andy Baviere4591222021-07-07 12:44:19 -0700244 self.assertFalse(ems.in_maintenance_window(events, "ace-menlo-rasp-pi", now))
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700245
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700246 def test_get_edges(self):
247 response = self.app.get('/edges')
248 data = json.loads(response.get_data(as_text=True))
249 self.assertEqual(len(data['edges']), 1)
Andy Bavier8a5c9872020-10-21 13:17:53 -0700250 self.assertEqual(data['edges'][0]['name'], 'ace-example')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700251
Andy Bavierf872e9a2021-03-22 12:06:25 -0700252 def test_create_and_delete_edge_legacy(self):
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700253 response = self.app.post('/edges', json=test_edge)
254 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700255 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700256
257 response = self.app.get('/edges')
258 data = json.loads(response.get_data(as_text=True))
259 self.assertEqual(len(data['edges']), 2)
260
Andy Baviere47157d2020-12-11 14:13:12 -0700261 response = self.app.get('/edges/metrics')
262 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700263 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700264
265 self._assert_status_metrics_exist(data)
266 self._assert_speedtest_metrics_exist(data)
267 self._assert_signal_quality_metrics_exist(data)
Andy Baviere47157d2020-12-11 14:13:12 -0700268
Andy Baviere4591222021-07-07 12:44:19 -0700269 response = self.app.delete('/edges/ace-menlo-rasp-pi')
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700270 data = json.loads(response.get_data(as_text=True))
271 self.assertEqual(data['result'], True)
Andy Baviere47157d2020-12-11 14:13:12 -0700272
273 response = self.app.get('/edges/metrics')
274 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700275 # print(data)
Andy Baviere4591222021-07-07 12:44:19 -0700276 self.assertFalse('ace-menlo-rasp-pi' in data)
Hyunsun Moon5f237ec2020-09-29 14:45:52 -0700277
278 response = self.app.get('/edges')
279 data = json.loads(response.get_data(as_text=True))
280 self.assertEqual(len(data['edges']), 1)
Andy Bavierc41cf0c2020-09-02 14:49:21 -0700281
Andy Bavierf872e9a2021-03-22 12:06:25 -0700282 def test_create_and_delete_edge(self):
283 response = self.app.post('/testresults', json=test_edge)
284 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700285 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Andy Bavierf872e9a2021-03-22 12:06:25 -0700286
287 response = self.app.get('/edges')
288 data = json.loads(response.get_data(as_text=True))
289 self.assertEqual(len(data['edges']), 2)
290
291 response = self.app.get('/edges/metrics')
292 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700293 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700294
295 self._assert_status_metrics_exist(data)
296 self._assert_speedtest_metrics_exist(data)
297 self._assert_signal_quality_metrics_exist(data)
Andy Bavierf872e9a2021-03-22 12:06:25 -0700298
Andy Baviere4591222021-07-07 12:44:19 -0700299 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Andy Bavierf872e9a2021-03-22 12:06:25 -0700300 data = json.loads(response.get_data(as_text=True))
301 self.assertEqual(data['result'], True)
302
303 response = self.app.get('/edges/metrics')
304 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700305 # print(data)
Andy Baviere4591222021-07-07 12:44:19 -0700306 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavierf872e9a2021-03-22 12:06:25 -0700307
308 response = self.app.get('/edges')
309 data = json.loads(response.get_data(as_text=True))
310 self.assertEqual(len(data['edges']), 1)
Andy Bavier614af142020-08-07 14:49:56 -0700311
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800312 def test_create_and_delete_edge_speed_test(self):
313 response = self.app.post('/testresults', json=test_edge)
314 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700315 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800316
317 response = self.app.get('/edges/metrics')
318 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700319 # print(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800320
Hyunsun Moon200eba52021-04-05 21:31:54 -0700321 self._assert_speedtest_metrics_exist(data)
322
Andy Baviere4591222021-07-07 12:44:19 -0700323 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700324 data = json.loads(response.get_data(as_text=True))
325 self.assertEqual(data['result'], True)
326
327 def test_backwards_compatible_status_only(self):
328 response = self.app.post('/testresults', json=test_edge_status_only)
329 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700330 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700331
332 response = self.app.get('/edges/metrics')
333 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700334 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700335
Andy Baviere4591222021-07-07 12:44:19 -0700336 self.assertFalse('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"}' in data)
337 self.assertFalse('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"}' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700338
339 self._assert_status_metrics_exist(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800340
Andy Baviere4591222021-07-07 12:44:19 -0700341 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800342 data = json.loads(response.get_data(as_text=True))
343 self.assertEqual(data['result'], True)
344
345 def test_backwards_compatible_no_speedtest(self):
346 response = self.app.post('/testresults', json=test_edge_no_speedtest)
347 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700348 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800349
350 response = self.app.get('/edges/metrics')
351 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700352 # print(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800353
Andy Baviere4591222021-07-07 12:44:19 -0700354 self.assertFalse('aetheredge_ping_dns_test_min{name="ace-menlo-rasp-pi"}' in data)
355 self.assertFalse('aetheredge_ping_dns_test_avg{name="ace-menlo-rasp-pi"}' in data)
356 self.assertFalse('aetheredge_ping_dns_test_max{name="ace-menlo-rasp-pi"}' in data)
357 self.assertFalse('aetheredge_ping_dns_test_stddev{name="ace-menlo-rasp-pi"}' in data)
358 self.assertFalse('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"}' in data)
359 self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
360 self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"}' in data)
361 self.assertFalse('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
362 self.assertFalse('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-rasp-pi"}' in data)
363 self.assertFalse('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800364
Hyunsun Moon200eba52021-04-05 21:31:54 -0700365 self._assert_status_metrics_exist(data)
366 self._assert_signal_quality_metrics_exist(data)
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800367
Andy Baviere4591222021-07-07 12:44:19 -0700368 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquillof4200252021-02-13 16:11:04 -0800369 data = json.loads(response.get_data(as_text=True))
370 self.assertEqual(data['result'], True)
371
Hyunsun Moon200eba52021-04-05 21:31:54 -0700372 def test_backwards_compatible_no_signal_quality(self):
373 response = self.app.post('/testresults', json=test_edge_no_signal_quality)
374 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700375 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700376
377 response = self.app.get('/edges/metrics')
378 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700379 # print(data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700380
Andy Baviere4591222021-07-07 12:44:19 -0700381 self.assertFalse('aetheredge_signal_quality_rsrq{name="ace-menlo-rasp-pi"}' in data)
382 self.assertFalse('aetheredge_signal_quality_rsrp{name="ace-menlo-rasp-pi"}' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700383
384 self._assert_status_metrics_exist(data)
385 self._assert_speedtest_metrics_exist(data)
386
Andy Baviere4591222021-07-07 12:44:19 -0700387 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700388 data = json.loads(response.get_data(as_text=True))
389 self.assertEqual(data['result'], True)
390
391 def test_timeout_stale_result(self):
392 response = self.app.post('/testresults', json=test_edge)
393 data = json.loads(response.get_data(as_text=True))
Andy Bavier2d60fc52021-05-04 16:13:39 -0700394 # print(json.dumps(data, indent=2))
Hyunsun Moon200eba52021-04-05 21:31:54 -0700395
396 self.assertEqual(data['edge']['status']['control_plane'], 'connected')
397 self.assertEqual(data['edge']['status']['user_plane'], 'connected')
398 self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 4.0)
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700399 self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 3.0)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700400 self.assertTrue('signal_quality' in data['edge'])
401
402 self.emulated_time += (ems.NO_RESULT_THRESHOLD + 1)
403
Andy Baviere4591222021-07-07 12:44:19 -0700404 response = self.app.get('/edges/ace-menlo-rasp-pi')
Hyunsun Moon200eba52021-04-05 21:31:54 -0700405 data = json.loads(response.get_data(as_text=True))
Andy Bavier2d60fc52021-05-04 16:13:39 -0700406 # print(json.dumps(data, indent=2))
Hyunsun Moon200eba52021-04-05 21:31:54 -0700407
408 self.assertEqual(data['edge']['status']['control_plane'], 'no result')
409 self.assertEqual(data['edge']['status']['user_plane'], 'no result')
410 self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 0.0)
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700411 self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 0.0)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700412 self.assertFalse('signal_quality' in data['edge'])
413
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700414 def test_backwards_compatible_no_iperf(self):
415 response = self.app.post('/testresults', json=test_edge_no_iperf)
416 data = json.loads(response.get_data(as_text=True))
Andy Baviere4591222021-07-07 12:44:19 -0700417 self.assertEqual(data['edge']['name'], 'ace-menlo-rasp-pi')
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700418
419 response = self.app.get('/edges/metrics')
420 data = response.get_data(as_text=True)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700421 # print(data)
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700422
Andy Baviere4591222021-07-07 12:44:19 -0700423 self.assertFalse('aetheredge_iperf_cluster_downlink{name="ace-menlo-rasp-pi"}' in data)
424 self.assertFalse('aetheredge_iperf_cluster_uplink{name="ace-menlo-rasp-pi"}' in data)
425 self.assertFalse('aetheredge_ping_iperf_server_test_min{name="ace-menlo-rasp-pi"}' in data)
426 self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-rasp-pi"}' in data)
427 self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-rasp-pi"}' in data)
428 self.assertFalse('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-rasp-pi"}' in data)
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700429
Andy Baviere4591222021-07-07 12:44:19 -0700430 response = self.app.delete('/testresults/ace-menlo-rasp-pi')
Jeremy Ronquilloc7434622021-04-08 21:06:00 -0700431 data = json.loads(response.get_data(as_text=True))
432 self.assertEqual(data['result'], True)
433
Andy Bavier2d60fc52021-05-04 16:13:39 -0700434 def test_handle_invalid_schema(self):
435 response = self.app.post('/testresults', json="")
436 self.assertEqual(response.status_code, 400)
437
438 no_name = deepcopy(test_edge)
439 del no_name['name']
440 response = self.app.post('/testresults', json=no_name)
441 self.assertEqual(response.status_code, 400)
442 response = self.app.get('/edges/metrics')
443 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700444 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700445
446 no_status = deepcopy(test_edge)
447 del no_status['status']
448 response = self.app.post('/testresults', json=no_status)
449 self.assertEqual(response.status_code, 400)
450 response = self.app.get('/edges/metrics')
451 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700452 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700453
454 bad_status = deepcopy(test_edge)
455 bad_status['status']['control_plane'] = 1
456 response = self.app.post('/testresults', json=bad_status)
457 self.assertEqual(response.status_code, 400)
458 response = self.app.get('/edges/metrics')
459 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700460 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700461
462 bad_ping_result = deepcopy(test_edge)
463 bad_ping_result['speedtest']['ping']['dns']['min'] = "foo"
464 response = self.app.post('/testresults', json=bad_ping_result)
465 self.assertEqual(response.status_code, 400)
466 response = self.app.get('/edges/metrics')
467 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700468 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700469
470 bad_iperf_result = deepcopy(test_edge)
471 bad_iperf_result['speedtest']['iperf']['cluster']['uplink'] = "foo"
472 response = self.app.post('/testresults', json=bad_iperf_result)
473 self.assertEqual(response.status_code, 400)
474 response = self.app.get('/edges/metrics')
475 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700476 self.assertFalse('ace-menlo-rasp-pi' in data)
Andy Bavier2d60fc52021-05-04 16:13:39 -0700477
478 bad_signal_quality = deepcopy(test_edge)
479 del bad_signal_quality['signal_quality']['rsrq']
480 response = self.app.post('/testresults', json=bad_signal_quality)
481 self.assertEqual(response.status_code, 400)
482 response = self.app.get('/edges/metrics')
483 data = response.get_data(as_text=True)
Andy Baviere4591222021-07-07 12:44:19 -0700484 self.assertFalse('ace-menlo-rasp-pi' in data)
Hyunsun Moon200eba52021-04-05 21:31:54 -0700485
Andy Bavier614af142020-08-07 14:49:56 -0700486if __name__ == '__main__':
Andy Bavier55dc5872021-05-05 11:31:42 -0700487 import xmlrunner
488 with open('results.xml', 'wb') as output:
Jeremy Ronquillo6e352b72021-06-08 10:33:25 -0700489 unittest.main(testRunner=xmlrunner.XMLTestRunner(verbosity=2, output=output))