Refactor public API around environments
This commit is contained in:
parent
57dae52cc2
commit
5d5243df23
41 changed files with 1301 additions and 459 deletions
|
|
@ -1,4 +1,4 @@
|
|||
"""Bundled runtime resolver and diagnostics."""
|
||||
"""Embedded runtime resolver and diagnostics."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ def resolve_runtime_paths(
|
|||
platform: str = DEFAULT_PLATFORM,
|
||||
verify_checksums: bool = True,
|
||||
) -> RuntimePaths:
|
||||
"""Resolve and validate bundled runtime assets."""
|
||||
"""Resolve and validate embedded runtime assets."""
|
||||
bundle_parent = Path(os.environ.get("PYRO_RUNTIME_BUNDLE_DIR", _default_bundle_parent()))
|
||||
bundle_root = bundle_parent / platform
|
||||
manifest_path = bundle_root / "manifest.json"
|
||||
|
|
@ -102,7 +102,7 @@ def resolve_runtime_paths(
|
|||
guest_agent_path = bundle_root / raw_agent_path
|
||||
artifacts_dir = bundle_root / "profiles"
|
||||
|
||||
required_paths = [firecracker_bin, jailer_bin, artifacts_dir]
|
||||
required_paths = [firecracker_bin, jailer_bin]
|
||||
if guest_agent_path is not None:
|
||||
required_paths.append(guest_agent_path)
|
||||
|
||||
|
|
@ -139,30 +139,6 @@ def resolve_runtime_paths(
|
|||
f"runtime checksum mismatch for {full_path}; "
|
||||
f"expected {raw_hash}, got {actual}"
|
||||
)
|
||||
profiles = manifest.get("profiles")
|
||||
if not isinstance(profiles, dict):
|
||||
raise RuntimeError("runtime manifest is missing `profiles`")
|
||||
for profile_name, profile_spec in profiles.items():
|
||||
if not isinstance(profile_spec, dict):
|
||||
raise RuntimeError(f"profile manifest entry for {profile_name!r} is malformed")
|
||||
for kind in ("kernel", "rootfs"):
|
||||
spec = profile_spec.get(kind)
|
||||
if not isinstance(spec, dict):
|
||||
raise RuntimeError(f"profile {profile_name!r} is missing {kind} spec")
|
||||
raw_path = spec.get("path")
|
||||
raw_hash = spec.get("sha256")
|
||||
if not isinstance(raw_path, str) or not isinstance(raw_hash, str):
|
||||
raise RuntimeError(f"profile {profile_name!r} {kind} spec is malformed")
|
||||
full_path = bundle_root / raw_path
|
||||
if not full_path.exists():
|
||||
raise RuntimeError(f"profile asset missing: {full_path}")
|
||||
actual = _sha256(full_path)
|
||||
if actual != raw_hash:
|
||||
raise RuntimeError(
|
||||
f"profile checksum mismatch for {full_path}; "
|
||||
f"expected {raw_hash}, got {actual}"
|
||||
)
|
||||
|
||||
return RuntimePaths(
|
||||
bundle_root=bundle_root,
|
||||
manifest_path=manifest_path,
|
||||
|
|
@ -241,9 +217,9 @@ def doctor_report(*, platform: str = DEFAULT_PLATFORM) -> dict[str, Any]:
|
|||
return report
|
||||
|
||||
capabilities = runtime_capabilities(paths)
|
||||
from pyro_mcp.vm_environments import EnvironmentStore
|
||||
|
||||
profiles = paths.manifest.get("profiles", {})
|
||||
profile_names = sorted(profiles.keys()) if isinstance(profiles, dict) else []
|
||||
environment_store = EnvironmentStore(runtime_paths=paths)
|
||||
report["runtime_ok"] = True
|
||||
report["runtime"] = {
|
||||
"bundle_root": str(paths.bundle_root),
|
||||
|
|
@ -252,16 +228,19 @@ def doctor_report(*, platform: str = DEFAULT_PLATFORM) -> dict[str, Any]:
|
|||
"jailer_bin": str(paths.jailer_bin),
|
||||
"guest_agent_path": str(paths.guest_agent_path) if paths.guest_agent_path else None,
|
||||
"artifacts_dir": str(paths.artifacts_dir),
|
||||
"artifacts_present": paths.artifacts_dir.exists(),
|
||||
"notice_path": str(paths.notice_path),
|
||||
"bundle_version": paths.manifest.get("bundle_version"),
|
||||
"component_versions": paths.manifest.get("component_versions", {}),
|
||||
"profiles": profile_names,
|
||||
"capabilities": {
|
||||
"supports_vm_boot": capabilities.supports_vm_boot,
|
||||
"supports_guest_exec": capabilities.supports_guest_exec,
|
||||
"supports_guest_network": capabilities.supports_guest_network,
|
||||
"reason": capabilities.reason,
|
||||
},
|
||||
"catalog_version": environment_store.catalog_version,
|
||||
"cache_dir": str(environment_store.cache_dir),
|
||||
"environments": environment_store.list_environments(),
|
||||
}
|
||||
if not report["kvm"]["exists"]:
|
||||
report["issues"] = ["/dev/kvm is not available on this host"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue