57 lines
2.2 KiB
Python
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}")
|