fix(reliability): converge runtime on uplink revert; bound health endpoint cost (I3,I4)
This commit is contained in:
@@ -31,6 +31,51 @@ class EventsTest(unittest.TestCase):
|
||||
self.assertEqual(c['restarts'], 1)
|
||||
self.assertEqual(c['guard_fixes'], 1)
|
||||
|
||||
def test_snapshot_bounded_and_counts(self):
|
||||
# Deterministic window: 3 restarts (oldest, outside the scan window),
|
||||
# then 40 ticks, then 1 boot LAST so the newest-first window of 30
|
||||
# includes it.
|
||||
for _ in range(3):
|
||||
mk8_events.log_event('restart', msg='old')
|
||||
for i in range(40):
|
||||
mk8_events.log_event('tick', msg='t%d' % i)
|
||||
mk8_events.log_event('boot', msg='final boot')
|
||||
snap = mk8_events.snapshot(event_limit=5, scan=30)
|
||||
self.assertLessEqual(len(snap['events']), 5)
|
||||
ev = snap['events']
|
||||
tss = [r.get('ts', 0) for r in ev]
|
||||
self.assertEqual(tss, sorted(tss, reverse=True), 'must be newest-first')
|
||||
self.assertEqual(ev[0]['kind'], 'boot')
|
||||
rel = snap['reliability']
|
||||
self.assertEqual(rel['boots'], 1,
|
||||
'boot is inside the scanned window')
|
||||
self.assertEqual(rel['restarts'], 0,
|
||||
'counters must cover only the bounded window')
|
||||
self.assertEqual(rel['unexpected_boots'], 0)
|
||||
# Full-journal counters() stays available and unbounded for callers
|
||||
# that want it.
|
||||
self.assertEqual(mk8_events.counters()['restarts'], 3)
|
||||
|
||||
def test_snapshot_spans_rotation(self):
|
||||
mk8_events.MAX_BYTES = 200
|
||||
for i in range(8):
|
||||
mk8_events.log_event('tick', msg='x' * 20)
|
||||
if i == 3:
|
||||
mk8_events.log_event('rollback', sev='warn', msg='mid')
|
||||
rotated = [i for i in range(1, mk8_events.KEEP + 1)
|
||||
if os.path.exists(mk8_events.EVENTS_PATH + '.%d' % i)]
|
||||
self.assertGreaterEqual(len(rotated) + 1, 2,
|
||||
'journal must actually rotate here')
|
||||
snap = mk8_events.snapshot(event_limit=100, scan=1000)
|
||||
# Snapshot must span every rotated generation read_events sees.
|
||||
self.assertEqual(len(snap['events']),
|
||||
len(mk8_events.read_events(limit=1000)))
|
||||
tss = [r.get('ts', 0) for r in snap['events']]
|
||||
self.assertEqual(tss, sorted(tss, reverse=True))
|
||||
kinds = {r['kind'] for r in snap['events']}
|
||||
self.assertEqual(kinds, {'tick', 'rollback'})
|
||||
self.assertEqual(snap['reliability']['rollbacks'], 1)
|
||||
|
||||
def test_rotation_keeps_recent(self):
|
||||
mk8_events.MAX_BYTES = 200
|
||||
for i in range(20):
|
||||
|
||||
@@ -157,6 +157,19 @@ class RfPlanTest(unittest.TestCase):
|
||||
self.assertEqual(len(self.sleeps), 5)
|
||||
self.assertIn('uci set wireless.wlan1up.disabled=1', self.cmds)
|
||||
self.assertEqual(self.resumed, 1)
|
||||
# Revert must converge runtime like the idle branch: a wifi reload
|
||||
# after the STA disable, with hop resumed only after the reload.
|
||||
cmds = self.cmds
|
||||
reloads = [i for i, c in enumerate(cmds) if c == 'wifi reload']
|
||||
self.assertEqual(len(reloads), 2, cmds)
|
||||
disable_set = cmds.index('uci set wireless.wlan1up.disabled=1')
|
||||
last_commit = len(cmds) - 1 - cmds[::-1].index('uci commit wireless')
|
||||
resume_idx = self.seq.index('resume')
|
||||
self.assertLess(disable_set, last_commit)
|
||||
self.assertLess(last_commit, reloads[-1])
|
||||
self.assertLess(reloads[-1], resume_idx)
|
||||
# cmds[i] maps 1:1 onto self.runs[i]; revert reload must be gated.
|
||||
self.assertEqual(self.runs[reloads[-1]], (['wifi', 'reload'], 60))
|
||||
|
||||
def test_set_role_uplink_requires_ssid(self):
|
||||
result = mk8_rfplan.set_role('uplink')
|
||||
|
||||
Reference in New Issue
Block a user