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)