import importlib.util import sys import unittest from pathlib import Path _SCRIPT = Path(__file__).parents[1] / "scripts" / "preflight-deployment.py" _SPEC = importlib.util.spec_from_file_location("deployment_preflight", _SCRIPT) assert _SPEC is not None and _SPEC.loader is not None preflight = importlib.util.module_from_spec(_SPEC) sys.modules[_SPEC.name] = preflight _SPEC.loader.exec_module(preflight) class DeploymentPreflightTests(unittest.TestCase): def test_maps_nested_container_path_to_host_source(self): container = { "Mounts": [ {"Type": "bind", "Source": "/srv/data", "Destination": "/data"}, {"Type": "bind", "Source": "/srv/sync", "Destination": "/data/Sync"}, ] } mapping = preflight.map_path(container, "/data/Sync/routes/route-1") self.assertEqual(mapping.source, Path("/srv/sync/routes/route-1")) self.assertEqual(str(mapping.destination), "/data/Sync") def test_rejects_api_and_client_roots_from_different_host_paths(self): with self.assertRaisesRegex(preflight.CheckFailure, "host paths differ"): preflight.require_same_path( "Syncthing api_root/local_root", preflight.Mapping(Path("/srv/syncthing-config/routes"), Path("/var/syncthing")), preflight.Mapping(Path("/srv/sync/routes"), Path("/data/storage")), ) def test_rejects_unmounted_container_path(self): with self.assertRaisesRegex(preflight.CheckFailure, "not backed"): preflight.map_path({"Mounts": []}, "/missing") def test_maps_future_route_through_syncthing_override(self): config = { "api_root": "/var/syncthing", "local_root": "/data/sync", "local_path_overrides": { "/var/syncthing/routes": "/data/qb/.archive-control-routes", }, } self.assertEqual( preflight.route_local_path(config), "/data/qb/.archive-control-routes", ) if __name__ == "__main__": unittest.main()