feat(oci): support custom Compose workers and migration jobs

This commit is contained in:
Jonatan
2026-10-28 08:41:41 +01:00
parent b383fb9311
commit 3a0a7eaf14
44 changed files with 3267 additions and 110 deletions
+44
View File
@@ -0,0 +1,44 @@
"""Main readiness probes the same address the installation advertises."""
import copy
import ipaddress
from pathlib import Path
import sys
import unittest
from unittest.mock import patch
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / 'remote'))
import install_generic_stack as installer
SERVICE = {'vmid':4860, 'main':True, 'name':'app', 'ip':'10.77.6.30',
'healthcheck':{'type':'http','timeout_seconds':360,
'endpoint':{'scheme':'http','port':80,'path':'/'}}}
class MainFrontendReadiness(unittest.TestCase):
def test_probe_and_persistent_health_url_use_advertised_lan_not_backend_ip(self):
service=copy.deepcopy(SERVICE)
with patch.object(installer,'run',return_value='10.77.6.30\n172.30.249.70\n'), \
patch.object(installer,'wait_web') as web:
url=installer.wait_main_web(service,ipaddress.ip_network('10.77.6.0/24'))
self.assertEqual(url,'http://172.30.249.70:80/')
self.assertEqual(service['healthcheck']['url'],url)
self.assertEqual(service['ip'],'10.77.6.30')
web.assert_called_once_with(service,url)
def test_waits_for_dhcp_frontend_without_probing_private_host(self):
service=copy.deepcopy(SERVICE)
with patch.object(installer,'lan_access_urls',side_effect=[RuntimeError('not yet'),[{'url':'http://192.0.2.7:80/'}]]), \
patch.object(installer.time,'sleep') as sleep, patch.object(installer,'wait_web') as web:
url=installer.wait_main_web(service,ipaddress.ip_network('10.77.6.0/24'))
self.assertEqual(url,'http://192.0.2.7:80/')
sleep.assert_called_once_with(1)
web.assert_called_once_with(service,url)
def test_no_frontend_address_never_falls_back_to_private_probe(self):
service=copy.deepcopy(SERVICE)
with patch.object(installer.time,'monotonic',side_effect=[0,1,121]), \
patch.object(installer.time,'sleep'), \
patch.object(installer,'lan_access_urls',side_effect=RuntimeError('not yet')), \
patch.object(installer,'wait_web') as web, self.assertRaisesRegex(RuntimeError,'No LAN address'):
installer.wait_main_web(service,ipaddress.ip_network('10.77.6.0/24'))
web.assert_not_called()
if __name__=='__main__':unittest.main()