feat(deploy): reliability API routes, atomic releases, version single-source

This commit is contained in:
2026-08-22 15:20:39 -06:00
parent aba08e36c7
commit 1bb15de258
10 changed files with 586 additions and 40 deletions
+129
View File
@@ -11,6 +11,11 @@ def setUpModule():
__import__('importlib').reload(server)
class _Ctx(object):
def __init__(self, body=None):
self.body = body
class ReliabilityApiTest(unittest.TestCase):
def setUp(self):
self.runs = []
@@ -58,6 +63,130 @@ class ReliabilityApiTest(unittest.TestCase):
os.unlink(marker)
server.BOOT_MARKER = old
def test_profile_routes_registered(self):
handler, _ = server.ROUTER.dispatch('GET',
'/api/reliability/profiles')
self.assertEqual(handler, server.h_profiles_get)
handler, _ = server.ROUTER.dispatch('POST', '/api/reliability/profile')
self.assertEqual(handler, server.h_profile_save)
handler, _ = server.ROUTER.dispatch('POST', '/api/reliability/restore')
self.assertEqual(handler, server.h_profile_restore)
handler, _ = server.ROUTER.dispatch('GET', '/api/reliability/nope')
self.assertIsNone(handler)
def test_h_profiles_get_lists_profiles(self):
import mk8_profiles
old = mk8_profiles.list_profiles
mk8_profiles.list_profiles = lambda: ['a', 'b']
try:
status, data = server.h_profiles_get(None)
finally:
mk8_profiles.list_profiles = old
self.assertEqual(status, 200)
self.assertEqual(data, {'profiles': ['a', 'b']})
def test_h_profile_save_validates_saves_and_journals(self):
import mk8_events
import mk8_profiles
calls = {'snapshots': []}
events = []
old_snapshot, old_log = mk8_profiles.snapshot, mk8_events.log_event
def fake_snapshot(name):
if not all(c.isalnum() or c in '._-' for c in name) \
or name in ('.', '..') or len(name) > 64:
raise ValueError('invalid profile name')
calls['snapshots'].append(name)
return True
def fake_log(kind, **kw):
events.append((kind, kw))
mk8_profiles.snapshot = fake_snapshot
mk8_events.log_event = fake_log
try:
status, data = server.h_profile_save(_Ctx({'name': ' pre-x-1 '}))
self.assertEqual(status, 200)
self.assertEqual(data, {'ok': True})
self.assertEqual(calls['snapshots'], ['pre-x-1'])
self.assertEqual(events[-1][0], 'profile_save')
status, data = server.h_profile_save(_Ctx({'name': ' '}))
self.assertEqual(status, 400)
self.assertIn('error', data)
status, data = server.h_profile_save(_Ctx({'name': '../evil'}))
self.assertEqual(status, 400)
self.assertIn('error', data)
self.assertEqual(calls['snapshots'], ['pre-x-1'])
status, data = server.h_profile_save(_Ctx({}))
self.assertEqual(status, 400)
def failed_snapshot(name):
calls['snapshots'].append(name)
return False
mk8_profiles.snapshot = failed_snapshot
status, data = server.h_profile_save(_Ctx({'name': 'p2'}))
self.assertEqual(status, 502)
self.assertFalse(data['ok'])
self.assertEqual(events[-1][0], 'profile_save')
self.assertEqual(events[-1][1].get('sev'), 'warn')
finally:
mk8_profiles.snapshot = old_snapshot
mk8_events.log_event = old_log
def test_h_profile_restore_gated_reload_journal(self):
import mk8_gate
import mk8_events
import mk8_profiles
calls = {'gate': [], 'events': []}
olds = (mk8_gate.enter, mk8_profiles.restore, mk8_events.log_event)
def fake_enter(op):
calls['gate'].append(op)
return 'snap-1'
def fake_restore(name):
calls['restored'] = name
return {'ok': True, 'restored': ['wireless']}
def fake_log(kind, **kw):
calls['events'].append((kind, kw))
mk8_gate.enter = fake_enter
mk8_profiles.restore = fake_restore
mk8_events.log_event = fake_log
try:
status, result = server.h_profile_restore(_Ctx({'name': 'p1'}))
self.assertEqual(status, 200)
self.assertEqual(result, {'ok': True, 'restored': ['wireless']})
self.assertEqual(calls['gate'], ['restore_profile'])
self.assertEqual(calls['restored'], 'p1')
reloads = [r for r in self.runs if r[0][:2] == ['wifi', 'reload']]
self.assertEqual(len(reloads), 1)
self.assertEqual(calls['events'][-1][0], 'profile_restore')
status, result = server.h_profile_restore(
_Ctx({'name': 'missing'}))
def missing_restore(name):
calls['restored'] = name
return {'ok': False, 'restored': [], 'error': 'not found'}
mk8_profiles.restore = missing_restore
status, result = server.h_profile_restore(
_Ctx({'name': 'missing'}))
self.assertEqual(status, 502)
self.assertFalse(result['ok'])
self.assertEqual(calls['events'][-1][0], 'profile_restore')
self.assertEqual(calls['events'][-1][1].get('sev'), 'warn')
status, result = server.h_profile_restore(_Ctx({'name': ''}))
self.assertEqual(status, 400)
finally:
(mk8_gate.enter, mk8_profiles.restore,
mk8_events.log_event) = olds
if __name__ == '__main__':
unittest.main()