Source code for gyoza.cli.commands.worker
"""Worker sub-commands for the gyoza CLI."""
import os
import uuid
import typer
# Importing gyoza.worker here would reach docker.from_env() at import time, and
# this module is loaded by every gyoza command — including the server, which has
# no docker socket. Keep worker imports inside start().
app = typer.Typer(help="Manage gyoza workers.")
[docs]
def start(
worker_id: str | None = typer.Option(
None,
"--worker-id",
envvar="GYOZA_WORKER_ID",
help="Unique identifier for this worker. Defaults to worker-<uuid>.",
),
working_directory: str = typer.Option(
"/tmp/gyoza/",
"--working-directory",
envvar="GYOZA_WORKING_DIRECTORY",
help="Directory used to stage op run data.",
),
heartbeat_interval: int = typer.Option(
10,
"--heartbeat-interval",
envvar="GYOZA_HEARTBEAT_INTERVAL",
help="Seconds between heartbeat ticks.",
),
mounts: str = typer.Option(
"",
"--mounts",
envvar="GYOZA_MOUNTS",
help=(
"Comma-separated host:container[:ro|:rw] paths mounted into every "
"op container."
),
),
container_env: str = typer.Option(
"",
"--container-env",
envvar="GYOZA_CONTAINER_ENV",
help="Comma-separated KEY=VALUE pairs set on every op container.",
),
) -> None:
"""Start the worker heartbeat and execution loop."""
os.environ["GYOZA_WORKER_ID"] = worker_id or f"worker-{uuid.uuid4()}"
os.environ["GYOZA_WORKING_DIRECTORY"] = working_directory
os.environ["GYOZA_HEARTBEAT_INTERVAL"] = str(heartbeat_interval)
os.environ["GYOZA_MOUNTS"] = mounts
os.environ["GYOZA_CONTAINER_ENV"] = container_env
from gyoza.worker import runner, shared_runtime # noqa: PLC0415
shared_runtime.validate()
runner.start()
app.command("start")(start)