Support durable host-to-isolated workspace migration

This commit is contained in:
ms2k 2026-07-26 00:43:30 +09:00
commit 0dda65fc2e

View file

@ -153,7 +153,7 @@ class IgnoredWorkspaceContractTests(unittest.TestCase):
self.assertEqual(contract["mechanism"], "rootless-host-fuse-router")
self.assertEqual(contract["route_classes"], ["host", "isolated"])
def test_cross_route_namespace_operations_refuse_before_mutation(self) -> None:
def test_cross_route_namespace_operations_are_directionally_bounded(self) -> None:
transitions = {
transition["id"]: transition
for transition in load("contract.json")["transition_contracts"]
@ -166,6 +166,16 @@ class IgnoredWorkspaceContractTests(unittest.TestCase):
with self.subTest(transition_id=transition_id):
self.assertEqual(transitions[transition_id]["mutation"], "none")
self.assertEqual(transitions["cross-route-rename"]["result"], "EXDEV")
self.assertEqual(
transitions["qualified-host-to-isolated-rename"],
{
"id": "qualified-host-to-isolated-rename",
"operations": ["rename", "rename-noreplace"],
"result": "success",
"mutation": "durable-host-to-isolated-migration",
"copy": "host-to-isolated-only",
},
)
self.assertEqual(transitions["cross-route-hard-link"]["result"], "EXDEV")
self.assertEqual(transitions["rename-whiteout"]["result"], "EOPNOTSUPP")
@ -176,7 +186,7 @@ class IgnoredWorkspaceContractTests(unittest.TestCase):
for transition in transitions
if "copy" in transition and transition["copy"] != "none"
]
self.assertEqual(copying, [])
self.assertEqual(copying, ["qualified-host-to-isolated-rename"])
handle_transitions = {
transition["id"]: transition["open_handles"]
for transition in transitions
@ -214,6 +224,13 @@ class IgnoredWorkspaceContractTests(unittest.TestCase):
self.assertEqual(
transitions,
[
{
"id": "qualified-host-to-isolated-rename",
"operations": ["rename", "rename-noreplace"],
"result": "success",
"mutation": "durable-host-to-isolated-migration",
"copy": "host-to-isolated-only",
},
{
"id": "cross-route-rename",
"operations": ["rename", "rename-noreplace", "rename-exchange"],
@ -310,7 +327,10 @@ class IgnoredWorkspaceContractTests(unittest.TestCase):
"character-block-device-create",
}
self.assertTrue(required.issubset(operations))
self.assertEqual(operations["rename"]["cross_route"], "EXDEV")
self.assertEqual(
operations["rename"]["cross_route"],
"qualified-host-to-isolated-or-EXDEV",
)
self.assertEqual(operations["hard-link"]["cross_route"], "EXDEV")
self.assertEqual(operations["copy-file-range"]["cross_route"], "EXDEV")
self.assertEqual(operations["character-block-device-create"]["host"], "EPERM")