Tussilago/control_plane/management/commands/create_test_deployment.py
2026-04-27 20:43:26 +02:00

57 lines
2.2 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
from control_plane.local_test_deployment import create_test_deployment
from control_plane.local_test_deployment import provision_test_deployment
from control_plane.local_test_deployment import queue_test_deployment_provisioning
if TYPE_CHECKING:
from argparse import ArgumentParser
class Command(BaseCommand):
"""Create a randomized local test deployment and optionally wait for readiness."""
help = "Create a randomized tenant and provision a local test deployment inline by default."
def add_arguments(self, parser: ArgumentParser) -> None:
"""Register CLI flags for local test deployment orchestration."""
parser.add_argument(
"--no-wait",
action="store_true",
help="Queue provisioning asynchronously and return immediately without running it inline.",
)
def handle(self, *_args: str, **options: bool | float) -> None:
"""Create a randomized local test deployment and optionally wait for readiness.
Raises:
CommandError: If the deployment fails or never becomes ready.
"""
created = create_test_deployment()
self.stdout.write(f"tenant_slug={created.tenant.slug}")
self.stdout.write(f"site_slug={created.hosted_site.slug}")
self.stdout.write(f"deployment_id={created.deployment.id}")
self.stdout.write(f"sentinel_url={created.sentinel_url}")
if options["no_wait"]:
try:
task_id = queue_test_deployment_provisioning(str(created.deployment.id))
except RuntimeError as error:
raise CommandError(str(error)) from error
self.stdout.write(f"celery_task_id={task_id}")
self.stdout.write("status=queued")
return
self.stdout.write("execution_mode=inline")
try:
deployment = provision_test_deployment(str(created.deployment.id))
except (RuntimeError, TimeoutError, ValueError) as error:
raise CommandError(str(error)) from error
self.stdout.write(f"status={deployment.status}")