fix(deploy): version device manager edge release contract
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user