mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 11:46:35 +00:00
72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
"""Runtime-context helpers for the dev/CI compose stack."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
|
|
def _declared(name: str) -> bool | None:
|
|
"""Explicit capability declaration, or None when it is left to the default."""
|
|
raw = (os.environ.get(name) or "").strip()
|
|
if raw == "true":
|
|
return True
|
|
if raw == "false":
|
|
return False
|
|
return None
|
|
|
|
|
|
class Profile:
|
|
"""Runtime identity and the capability decisions derived from it."""
|
|
|
|
def is_ci(self) -> bool:
|
|
"""True when any standard CI signal is set."""
|
|
return (
|
|
os.environ.get("GITHUB_ACTIONS") == "true"
|
|
or os.environ.get("INFINITO_RUNNING_ON_GITHUB") == "true"
|
|
or os.environ.get("CI") == "true"
|
|
)
|
|
|
|
def runs_on_github(self) -> bool:
|
|
"""True on a real GitHub runner; act and generic CI are not that."""
|
|
return os.environ.get("INFINITO_RUNNING_ON_GITHUB") == "true"
|
|
|
|
def cache_stack_enabled(self) -> bool:
|
|
"""True iff the pull-through cache stack should be loaded."""
|
|
declared = _declared("INFINITO_CACHE_STACK")
|
|
return (not self.is_ci()) if declared is None else declared
|
|
|
|
def gpu_reservable(self) -> bool:
|
|
"""True iff the docker daemon registers an NVIDIA runtime."""
|
|
return (os.environ.get("INFINITO_GPU_COUNT") or "0").strip() not in ("", "0")
|
|
|
|
def image_mirror_enabled(self) -> bool:
|
|
"""True iff image references should be rewritten to the GHCR mirror."""
|
|
declared = _declared("INFINITO_GHCR_MIRROR")
|
|
return self.runs_on_github() if declared is None else declared
|
|
|
|
def docker_root_ephemeral(self) -> bool:
|
|
"""True iff the docker data root may be wiped when the stack goes down."""
|
|
return self.runs_on_github()
|
|
|
|
def instance(self) -> int:
|
|
"""Slot index of this checkout; 0 is the primary one.
|
|
|
|
Bookkeeping only: the compose layering below keys off the concrete
|
|
resources a worktree was handed, never off this number, so a stray
|
|
slot cannot make compose demand a value nobody set.
|
|
"""
|
|
raw = (os.environ.get("INFINITO_INSTANCE") or "0").strip()
|
|
return int(raw) if raw.isdigit() else 0
|
|
|
|
def shared_git_dir(self) -> str:
|
|
"""Path of the checkout's shared .git directory, empty when it owns one."""
|
|
return (os.environ.get("INFINITO_GIT_COMMON_DIR") or "").strip()
|
|
|
|
def shared_cache_network(self) -> str:
|
|
"""Docker network of a cache stack owned elsewhere, empty when unset."""
|
|
return (os.environ.get("INFINITO_CACHE_NETWORK") or "").strip()
|
|
|
|
def owns_cache_stack(self) -> bool:
|
|
"""True iff this instance runs the cache stack rather than sharing it."""
|
|
return self.cache_stack_enabled() and not self.shared_cache_network()
|