|
# retoor <retoor@molodetz.nl>
|
|
|
|
from .spec import Action, Param
|
|
|
|
|
|
def arg(name: str, description: str, required: bool = False, kind: str = "string") -> Param:
|
|
return Param(name=name, location="body", description=description, required=required, type=kind)
|
|
|
|
|
|
SLUG = arg("project_slug", "Project slug or uid that owns the container resources.", required=True)
|
|
|
|
CONTAINER_ACTIONS: tuple[Action, ...] = (
|
|
Action(
|
|
name="container_list_dockerfiles",
|
|
method="LOCAL", path="", handler="container", requires_admin=True, read_only=True,
|
|
summary="List the Dockerfiles, builds, and instances of a project",
|
|
params=(SLUG,),
|
|
),
|
|
Action(
|
|
name="container_create_dockerfile",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Create a Dockerfile in a project and queue its first build",
|
|
description="With no content a lean python-slim default builds in seconds and serves /app on port 8000 (long-lived, ingress-ready). Pass full content for anything else; for browser automation start from python-slim and add 'pip install playwright && playwright install --with-deps chromium'.",
|
|
params=(
|
|
SLUG,
|
|
arg("name", "Image name, lowercase letters/digits/.-_ (max 63 chars).", required=True),
|
|
arg("description", "Optional description."),
|
|
arg("tags", "Optional comma separated tags."),
|
|
arg("content", "Optional full Dockerfile content."),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_update_dockerfile",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Replace a Dockerfile's content, creating a new immutable version and queueing a build",
|
|
params=(
|
|
SLUG,
|
|
arg("dockerfile", "Dockerfile name, slug, or uid.", required=True),
|
|
arg("content", "New Dockerfile content.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_build",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Rebuild the current version of a Dockerfile",
|
|
params=(SLUG, arg("dockerfile", "Dockerfile name, slug, or uid.", required=True)),
|
|
),
|
|
Action(
|
|
name="container_build_status",
|
|
method="LOCAL", path="", handler="container", requires_admin=True, read_only=True,
|
|
summary="Get a build's status and recent log tail",
|
|
params=(SLUG, arg("build_uid", "Build uid.", required=True)),
|
|
),
|
|
Action(
|
|
name="container_list_instances",
|
|
method="LOCAL", path="", handler="container", requires_admin=True, read_only=True,
|
|
summary="List a project's container instances and their status",
|
|
params=(SLUG,),
|
|
),
|
|
Action(
|
|
name="container_create_instance",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Create and start a container instance from a Dockerfile's latest successful build",
|
|
params=(
|
|
SLUG,
|
|
arg("dockerfile", "Dockerfile name, slug, or uid.", required=True),
|
|
arg("name", "Instance name.", required=True),
|
|
arg("boot_command", "Optional command to run on boot, e.g. 'python app.py'."),
|
|
arg("restart_policy", "never, always, on-failure, or unless-stopped."),
|
|
arg("env", "Optional env vars as KEY=VALUE lines."),
|
|
arg("ports", "Port maps per line or comma separated. Use a bare container port (e.g. '8899') to auto-assign a unique host port above 20000, or 'host:container' to pin one."),
|
|
arg("cpu_limit", "Optional CPU limit, e.g. 1 or 1.5."),
|
|
arg("mem_limit", "Optional memory limit, e.g. 512m or 1g."),
|
|
arg("autostart", "Start immediately ('true' or 'false', default true)."),
|
|
arg("ingress_slug", "Optional public ingress slug; the service is then reachable at /p/<slug>."),
|
|
arg("ingress_port", "Container port to publish at /p/<slug> (must be one of the mapped ports).", kind="integer"),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_instance_action",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Control an instance: start, stop, restart, pause, resume, delete, or sync",
|
|
description="sync imports the container /app workspace back into the project files.",
|
|
params=(
|
|
SLUG,
|
|
arg("instance", "Instance name, slug, or uid.", required=True),
|
|
arg("action", "start, stop, restart, pause, resume, delete, or sync.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_logs",
|
|
method="LOCAL", path="", handler="container", requires_admin=True, read_only=True,
|
|
summary="Read the recent logs of a running instance",
|
|
params=(
|
|
SLUG,
|
|
arg("instance", "Instance name, slug, or uid.", required=True),
|
|
arg("tail", "Number of log lines (default 200).", kind="integer"),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_exec",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Run a one-shot command inside a running instance and return its output",
|
|
params=(
|
|
SLUG,
|
|
arg("instance", "Instance name, slug, or uid.", required=True),
|
|
arg("command", "Command to run, e.g. 'pip list'.", required=True),
|
|
),
|
|
),
|
|
Action(
|
|
name="container_stats",
|
|
method="LOCAL", path="", handler="container", requires_admin=True, read_only=True,
|
|
summary="Get aggregated resource and runtime statistics for an instance",
|
|
params=(SLUG, arg("instance", "Instance name, slug, or uid.", required=True)),
|
|
),
|
|
Action(
|
|
name="container_schedule",
|
|
method="LOCAL", path="", handler="container", requires_admin=True,
|
|
summary="Schedule a start or stop of an instance (cron, interval, or one-time)",
|
|
params=(
|
|
SLUG,
|
|
arg("instance", "Instance name, slug, or uid.", required=True),
|
|
arg("action", "start or stop.", required=True),
|
|
arg("kind", "once, interval, or cron.", required=True),
|
|
arg("cron", "Cron expression for kind=cron, e.g. '0 2 * * *'."),
|
|
arg("run_at", "ISO time for kind=once, e.g. 2026-06-15T02:00:00."),
|
|
arg("every_seconds", "Interval seconds for kind=interval.", kind="integer"),
|
|
),
|
|
),
|
|
)
|