fix(deploy): version device manager edge release contract

This commit is contained in:
Codex
2026-08-11 20:43:07 +03:00
parent 724e745628
commit 0f44cca27d
5 changed files with 283 additions and 59 deletions
@@ -69,6 +69,27 @@ def device_manager_release_descriptor(
predecessor_kind="reconciliation",
predecessor_patch="device-manager-reconciliation-unit-001",
predecessor_sha="a" * 64,
):
return {
"schemaVersion": "nodedc.device-plane.device-manager-release.v2",
"releaseId": release_id,
"action": action,
"predecessor": {
"kind": predecessor_kind,
"patchId": predecessor_patch,
"artifactSha256": predecessor_sha,
},
**RUNNER.expected_device_plane_manager_release_v2_boundaries(),
}
def device_manager_release_v1_descriptor(
release_id="device-manager-release-v1-unit-001",
*,
action="upgrade",
predecessor_kind="release",
predecessor_patch="device-manager-release-v1-unit-000",
predecessor_sha="a" * 64,
):
return {
"schemaVersion": "nodedc.device-plane.device-manager-release.v1",
@@ -79,7 +100,7 @@ def device_manager_release_descriptor(
"patchId": predecessor_patch,
"artifactSha256": predecessor_sha,
},
**RUNNER.expected_device_plane_manager_release_boundaries(),
**RUNNER.expected_device_plane_manager_release_v1_boundaries(),
}
@@ -164,7 +185,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
manifest, entries, names, result = self.assert_deterministic_artifact(
"build-device-manager-control-plane-artifact.mjs",
"device-manager-control-plane-unit-001",
RUNNER.DEVICE_PLANE_MANAGER_CONTROL_PLANE_ENTRIES,
RUNNER.DEVICE_PLANE_MANAGER_RELEASE_V2_ENTRIES,
)
self.assertEqual(manifest["component"], "device-plane")
self.assertEqual(
@@ -205,6 +226,58 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
self.assertEqual(checks[0]["expected_json"]["managementApi"], "enabled")
self.assertEqual(checks[0]["expected_json"]["discoveryIngest"], "enabled")
def test_release_v2_keeps_release_v1_predecessor_contract_immutable(self):
predecessor = device_manager_release_v1_descriptor(
release_id="device-manager-release-20260811-010",
)
candidate = device_manager_release_descriptor(
release_id="device-manager-release-20260811-012",
action="upgrade",
predecessor_kind="release",
predecessor_patch="device-manager-release-20260811-010",
predecessor_sha="d" * 64,
)
self.assertIs(
RUNNER.validate_device_plane_manager_release_descriptor(
predecessor,
schema_version=(
"nodedc.device-plane.device-manager-release.v1"
),
boundaries=(
RUNNER.expected_device_plane_manager_release_v1_boundaries()
),
expected_release_id="device-manager-release-20260811-010",
),
predecessor,
)
self.assertIs(
RUNNER.validate_device_plane_manager_release_descriptor(
candidate,
schema_version=(
"nodedc.device-plane.device-manager-release.v2"
),
boundaries=(
RUNNER.expected_device_plane_manager_release_v2_boundaries()
),
expected_release_id="device-manager-release-20260811-012",
),
candidate,
)
with self.assertRaisesRegex(
RUNNER.DeployError,
r"schema=.*release\.v2 missing=edgeChannel,edgeChannelEgress,"
r"edgeChannelIdentity extra=none",
):
RUNNER.validate_device_plane_manager_release_descriptor(
predecessor,
schema_version=(
"nodedc.device-plane.device-manager-release.v2"
),
boundaries=(
RUNNER.expected_device_plane_manager_release_v2_boundaries()
),
)
def test_public_route_artifact_is_last_and_proxy_only(self):
manifest, entries, _names, result = self.assert_deterministic_artifact(
"build-platform-device-manager-route-artifact.mjs",
@@ -239,7 +312,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
):
RUNNER.prepare_component_runtime(
"device-plane",
RUNNER.DEVICE_PLANE_MANAGER_CONTROL_PLANE_ENTRIES,
RUNNER.DEVICE_PLANE_MANAGER_RELEASE_V2_ENTRIES,
)
self.assertEqual(
[call.args[0] for call in ensure.call_args_list],
@@ -254,7 +327,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
ensure_edge_identity.assert_called_once_with()
def test_apply_gate_checks_exact_services_core_contract_and_runtime_boundary(self):
entries = RUNNER.DEVICE_PLANE_MANAGER_CONTROL_PLANE_ENTRIES
entries = RUNNER.DEVICE_PLANE_MANAGER_RELEASE_V2_ENTRIES
services = ("device-control-core", "device-manager")
with (
mock.patch.object(
@@ -341,7 +414,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
),
mock.patch.object(
RUNNER,
"validate_device_plane_manager_control_plane_payload",
"validate_device_plane_manager_release_payload",
return_value=descriptor,
) as payload,
mock.patch.object(
@@ -441,7 +514,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
artifact_bytes = b"arbitrary-reviewed-device-manager-release"
artifact.write_bytes(artifact_bytes)
artifact_sha = hashlib.sha256(artifact_bytes).hexdigest()
predecessor_descriptor = device_manager_release_descriptor(
predecessor_descriptor = device_manager_release_v1_descriptor(
release_id=predecessor_patch,
)
candidate_descriptor = device_manager_release_descriptor(
@@ -483,7 +556,7 @@ class DeviceManagerControlPlaneArtifactsTest(unittest.TestCase):
),
mock.patch.object(
RUNNER,
"validate_device_plane_manager_control_plane_payload",
"validate_device_plane_manager_release_payload",
side_effect=(
candidate_descriptor,
predecessor_descriptor,