diff --git a/cycleops/setups.py b/cycleops/setups.py index e44f99e..d064f42 100644 --- a/cycleops/setups.py +++ b/cycleops/setups.py @@ -219,6 +219,9 @@ def destroy( setup_identifier: str = typer.Argument( ..., help="The ID or name of the setup. Names take precedence." ), + wait: Optional[bool] = typer.Option( + default=False, help="Wait for the destroy job to complete" + ), ) -> None: """ Destroy the setup with the specified given ID or name. @@ -226,13 +229,41 @@ def destroy( try: setup = get_setup(setup_identifier) - setup_client.destroy(setup["id"]) + job = setup_client.destroy(setup["id"]) display_success_message(f"Setup {setup['id']} has been queued for destruction") except Exception as error: display_error_message(error) raise typer.Abort() + destruction_scheduled_message = ( + f"Setup {setup_identifier} has been queued for destruction" + ) + + if not wait: + display_success_message(destruction_scheduled_message) + return + + print(f"{destruction_scheduled_message}\n") + + try: + display_job_logs(job["id"]) + except websockets.exceptions.ConnectionClosed: + job = job_client.retrieve(job["id"]) + + match job["status"]: + case "Initialized": + display_success_message( + f"Setup {setup_identifier} has been destroyed successfully" + ) + case "Failed": + display_error_message( + f"Setup {setup_identifier} could not be destroyed" + ) + case _: + print(f"Setup {setup_identifier} is in status {job['status']}") + return + def get_setup(setup_identifier: str) -> Optional[Dict[str, Any]]: """