Skip to content

Commit 4d980b7

Browse files
feat(runtime-v2): Wave 4 — remove transitional paths, backend conformance, proof-carrying recovery, transport parity
- vz-l56: Replace boot_shared_vm/create_in_stack with sandbox-scoped ContainerRuntime trait methods - vz-td9: Add 14 new RuntimeBackend trait methods with default stubs + conformance test suite (59 tests) - vz-v2n.3: Add reconcile_audit_log table with proof-carrying recovery and fault-injection tests (498 tests) - vz-axl: Add cross-transport parity tests (OpenAPI ↔ gRPC) and proto consistency validation (57 tests) Closes: vz-l56, vz-td9, vz-v2n.3, vz-v2n.3.1, vz-v2n.3.2, vz-v2n.3.3, vz-v2n.2.3, vz-axl Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3398916 commit 4d980b7

11 files changed

Lines changed: 2402 additions & 265 deletions

File tree

.beads/issues.jsonl

Lines changed: 27 additions & 27 deletions
Large diffs are not rendered by default.

crates/vz-agent-proto/src/lib.rs

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,4 +389,171 @@ mod tests {
389389
let _ = NetworkSetupResponse {};
390390
let _ = NetworkTeardownResponse {};
391391
}
392+
393+
// ── Runtime V2 proto-contract consistency tests ──────────────
394+
395+
#[test]
396+
fn runtime_v2_services_cover_all_entity_types() {
397+
use crate::runtime_v2::*;
398+
399+
// Verify key request message types exist by constructing defaults.
400+
let _ = CreateSandboxRequest::default();
401+
let _ = OpenLeaseRequest::default();
402+
let _ = CreateContainerRequest::default();
403+
let _ = CreateExecutionRequest::default();
404+
let _ = CreateCheckpointRequest::default();
405+
let _ = StartBuildRequest::default();
406+
let _ = ListEventsRequest::default();
407+
let _ = GetCapabilitiesRequest::default();
408+
409+
// Verify response types.
410+
let _ = SandboxResponse::default();
411+
let _ = LeaseResponse::default();
412+
let _ = ContainerResponse::default();
413+
let _ = ExecutionResponse::default();
414+
let _ = CheckpointResponse::default();
415+
let _ = BuildResponse::default();
416+
let _ = ListEventsResponse::default();
417+
let _ = GetCapabilitiesResponse::default();
418+
419+
// Verify payload types used in responses.
420+
let _ = SandboxPayload::default();
421+
let _ = LeasePayload::default();
422+
let _ = ContainerPayload::default();
423+
let _ = ExecutionPayload::default();
424+
let _ = CheckpointPayload::default();
425+
let _ = BuildPayload::default();
426+
427+
// Verify list responses.
428+
let _ = ListSandboxesResponse::default();
429+
let _ = ListLeasesResponse::default();
430+
let _ = ListContainersResponse::default();
431+
let _ = ListExecutionsResponse::default();
432+
let _ = ListCheckpointsResponse::default();
433+
let _ = ListBuildsResponse::default();
434+
435+
// Verify streaming types.
436+
let _ = ExecOutputEvent::default();
437+
let _ = BuildEvent::default();
438+
let _ = RuntimeEvent::default();
439+
}
440+
441+
#[test]
442+
fn runtime_v2_request_metadata_fields() {
443+
use crate::runtime_v2::RequestMetadata;
444+
let meta = RequestMetadata {
445+
request_id: "req-123".into(),
446+
idempotency_key: "idem-456".into(),
447+
trace_id: "trace-789".into(),
448+
};
449+
assert_eq!(meta.request_id, "req-123");
450+
assert_eq!(meta.idempotency_key, "idem-456");
451+
assert_eq!(meta.trace_id, "trace-789");
452+
}
453+
454+
#[test]
455+
fn runtime_v2_error_detail_fields() {
456+
use crate::runtime_v2::ErrorDetail;
457+
let err = ErrorDetail {
458+
code: "not_found".into(),
459+
message: "sandbox not found".into(),
460+
request_id: "req-abc".into(),
461+
};
462+
assert_eq!(err.code, "not_found");
463+
assert_eq!(err.message, "sandbox not found");
464+
assert_eq!(err.request_id, "req-abc");
465+
}
466+
467+
#[test]
468+
fn runtime_v2_all_rpc_request_types_have_metadata() {
469+
use crate::runtime_v2::*;
470+
471+
// Every mutation/query request should have an optional metadata field.
472+
// Constructing defaults ensures the field exists (it will be None).
473+
let create_sandbox = CreateSandboxRequest::default();
474+
assert!(create_sandbox.metadata.is_none());
475+
476+
let open_lease = OpenLeaseRequest::default();
477+
assert!(open_lease.metadata.is_none());
478+
479+
let create_container = CreateContainerRequest::default();
480+
assert!(create_container.metadata.is_none());
481+
482+
let create_execution = CreateExecutionRequest::default();
483+
assert!(create_execution.metadata.is_none());
484+
485+
let create_checkpoint = CreateCheckpointRequest::default();
486+
assert!(create_checkpoint.metadata.is_none());
487+
488+
let start_build = StartBuildRequest::default();
489+
assert!(start_build.metadata.is_none());
490+
491+
let list_events = ListEventsRequest::default();
492+
assert!(list_events.metadata.is_none());
493+
494+
let get_caps = GetCapabilitiesRequest::default();
495+
assert!(get_caps.metadata.is_none());
496+
497+
// GET/single-entity requests.
498+
let get_sandbox = GetSandboxRequest::default();
499+
assert!(get_sandbox.metadata.is_none());
500+
501+
let get_lease = GetLeaseRequest::default();
502+
assert!(get_lease.metadata.is_none());
503+
504+
let get_container = GetContainerRequest::default();
505+
assert!(get_container.metadata.is_none());
506+
507+
let get_execution = GetExecutionRequest::default();
508+
assert!(get_execution.metadata.is_none());
509+
510+
let get_checkpoint = GetCheckpointRequest::default();
511+
assert!(get_checkpoint.metadata.is_none());
512+
513+
let get_build = GetBuildRequest::default();
514+
assert!(get_build.metadata.is_none());
515+
}
516+
517+
#[test]
518+
fn runtime_v2_sandbox_payload_round_trip() {
519+
use crate::runtime_v2::SandboxPayload;
520+
let payload = SandboxPayload {
521+
sandbox_id: "sbx-test".into(),
522+
backend: "macos_vz".into(),
523+
state: "ready".into(),
524+
cpus: 4,
525+
memory_mb: 2048,
526+
created_at: 1700000000,
527+
updated_at: 1700000100,
528+
labels: [("env".to_string(), "staging".to_string())]
529+
.into_iter()
530+
.collect(),
531+
};
532+
let encoded = payload.encode_to_vec();
533+
let decoded = SandboxPayload::decode(encoded.as_slice()).unwrap();
534+
assert_eq!(decoded.sandbox_id, "sbx-test");
535+
assert_eq!(decoded.backend, "macos_vz");
536+
assert_eq!(decoded.cpus, 4);
537+
assert_eq!(decoded.memory_mb, 2048);
538+
assert_eq!(decoded.labels.get("env").unwrap(), "staging");
539+
}
540+
541+
#[test]
542+
fn runtime_v2_checkpoint_payload_round_trip() {
543+
use crate::runtime_v2::CheckpointPayload;
544+
let payload = CheckpointPayload {
545+
checkpoint_id: "ckpt-test".into(),
546+
sandbox_id: "sbx-test".into(),
547+
parent_checkpoint_id: "ckpt-parent".into(),
548+
checkpoint_class: "fs_quick".into(),
549+
state: "ready".into(),
550+
compatibility_fingerprint: "kernel-6.1-arm64".into(),
551+
created_at: 1700000000,
552+
};
553+
let encoded = payload.encode_to_vec();
554+
let decoded = CheckpointPayload::decode(encoded.as_slice()).unwrap();
555+
assert_eq!(decoded.checkpoint_id, "ckpt-test");
556+
assert_eq!(decoded.compatibility_fingerprint, "kernel-6.1-arm64");
557+
assert_eq!(decoded.parent_checkpoint_id, "ckpt-parent");
558+
}
392559
}

0 commit comments

Comments
 (0)