Skip to content
1 change: 0 additions & 1 deletion python/lightning_sdk/api/logs_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ def format(self, *, timestamps: bool = False, prefix: Optional[str] = None) -> s

return " ".join(parts)


def to_json_dict(self, source: Optional[str] = None) -> "Dict[str, Optional[str]]":
"""Render the entry as a JSON-serializable object; ``source`` labels the replica/rank."""
return {
Expand Down
14 changes: 12 additions & 2 deletions python/lightning_sdk/cli/api_key/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,22 @@

def register_commands(group: click.Group) -> None:
"""Register API key commands with the given group."""
from lightning_sdk.cli.api_key.common import ORG_OPTION_HELP
from lightning_sdk.cli.api_key.create import create_api_key
from lightning_sdk.cli.api_key.delete import delete_api_key
from lightning_sdk.cli.api_key.delete import resolve_api_key_delete
from lightning_sdk.cli.api_key.get import get_api_key
from lightning_sdk.cli.api_key.list import list_api_keys
from lightning_sdk.cli.utils.delete import register_delete_command

group.add_command(get_api_key)
group.add_command(create_api_key)
group.add_command(list_api_keys)
group.add_command(delete_api_key)
register_delete_command(
group,
label="API key",
help="Delete an org-scoped API key.",
identifier="key_id",
context_option="org",
context_help=ORG_OPTION_HELP,
resolve_delete=resolve_api_key_delete,
)
24 changes: 11 additions & 13 deletions python/lightning_sdk/cli/api_key/delete.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
"""Delete an org-scoped API key."""
"""API-key deletion resolver."""

from functools import partial
from typing import Optional

import rich_click as click

from lightning_sdk.api.api_key_api import ApiKeyApi
from lightning_sdk.cli.api_key.common import ORG_OPTION_HELP, resolve_org
from lightning_sdk.cli.utils.logging import LightningCommand
from lightning_sdk.cli.api_key.common import resolve_org
from lightning_sdk.cli.utils.delete import DeleteAction


@click.command("delete", cls=LightningCommand)
@click.argument("key_id")
@click.option("--org", help=ORG_OPTION_HELP)
def delete_api_key(key_id: str, org: Optional[str]) -> None:
"""Delete an org-scoped API key."""
organization = resolve_org(org)
def resolve_api_key_delete(
key_id: str,
org_name: Optional[str],
) -> DeleteAction:
"""Resolve an API key and return its bound deletion action."""
organization = resolve_org(org_name)
api = ApiKeyApi()
api.delete(organization.id, key_id)
click.echo(f"Deleted API key {key_id}.")
return partial(api.delete, organization.id, key_id)
15 changes: 13 additions & 2 deletions python/lightning_sdk/cli/container/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,23 @@

def register_commands(group: click.Group) -> None:
"""Register container commands with the given group."""
from lightning_sdk.cli.container.delete import delete_container
from lightning_sdk.cli.container.delete import resolve_container_delete
from lightning_sdk.cli.container.download import download_container
from lightning_sdk.cli.container.list import list_containers
from lightning_sdk.cli.container.upload import upload_container
from lightning_sdk.cli.utils.delete import register_delete_command

group.add_command(list_containers, name="list")
group.add_command(upload_container, name="upload")
group.add_command(download_container, name="download")
group.add_command(delete_container, name="delete")
register_delete_command(
group,
label="Container",
help="Delete the docker container NAME.",
context_help=(
"The teamspace to delete the container from. "
"Should be specified as {owner}/{name}. "
"Defaults to the configured teamspace."
),
resolve_delete=resolve_container_delete,
)
44 changes: 25 additions & 19 deletions python/lightning_sdk/cli/container/delete.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
"""Container delete command."""
"""Container deletion resolver."""

from typing import Optional

import rich_click as click
from lightning_sdk.cli.legacy.exceptions import StudioCliError
from lightning_sdk.cli.utils.delete import DeleteAction
from lightning_sdk.cli.utils.resource_resolution import resolve_teamspace
from lightning_sdk.lit_container import LitContainer

from lightning_sdk.cli.legacy.delete import container as _delete_container
from lightning_sdk.cli.utils.logging import LightningCommand

def resolve_container_delete(
name: str,
teamspace: Optional[str],
) -> DeleteAction:
"""Resolve a container deletion and return its bound action."""
resolved_teamspace = resolve_teamspace(teamspace)
api = LitContainer()

@click.command("delete", cls=LightningCommand)
@click.argument("name")
@click.option(
"--teamspace",
default=None,
help=(
"The teamspace to delete the container from. "
"Should be specified as {owner}/{name}. "
"Defaults to the configured teamspace."
),
)
@click.option("--json", "as_json", is_flag=True, default=False, help="Output as JSON.")
def delete_container(name: str, teamspace: Optional[str] = None, as_json: bool = False) -> None:
"""Delete the docker container NAME."""
_delete_container.callback(name=name, teamspace=teamspace, as_json=as_json)
def delete() -> None:
try:
api.delete_container(
name,
resolved_teamspace.name,
resolved_teamspace.owner.name,
)
except Exception as ex:
raise StudioCliError(
f"Could not delete container {name} from project {resolved_teamspace.name}: {ex}"
) from None

return delete
11 changes: 9 additions & 2 deletions python/lightning_sdk/cli/deployment/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,24 @@
def register_commands(group: click.Group) -> None:
"""Register deployment commands with the given group."""
from lightning_sdk.cli.deployment.create import create_deployment
from lightning_sdk.cli.deployment.delete import delete_deployment
from lightning_sdk.cli.deployment.delete import resolve_deployment_delete
from lightning_sdk.cli.deployment.inspect import inspect_deployment
from lightning_sdk.cli.deployment.list import list_deployments
from lightning_sdk.cli.deployment.logs import deployment_logs
from lightning_sdk.cli.deployment.reload_weights import reload_weights
from lightning_sdk.cli.deployment.update import update_deployment
from lightning_sdk.cli.utils.delete import register_delete_command

group.add_command(create_deployment, name="create")
group.add_command(list_deployments, name="list")
group.add_command(inspect_deployment, name="inspect")
group.add_command(update_deployment, name="update")
group.add_command(delete_deployment, name="delete")
register_delete_command(
group,
label="Deployment",
help="Delete a deployment.",
context_help="Override default teamspace (format: owner/teamspace).",
resolve_delete=resolve_deployment_delete,
)
group.add_command(deployment_logs, name="logs")
group.add_command(reload_weights, name="reload-weights")
30 changes: 9 additions & 21 deletions python/lightning_sdk/cli/deployment/delete.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,20 @@
"""Deployment delete command."""
"""Deployment deletion resolver."""

from functools import partial
from typing import Optional

import rich_click as click

from lightning_sdk.api.deployment_api import DeploymentApi
from lightning_sdk.cli.deployment.common import resolve_deployment
from lightning_sdk.cli.utils.json_output import echo_json
from lightning_sdk.cli.utils.logging import LightningCommand
from lightning_sdk.cli.utils.delete import DeleteAction
from lightning_sdk.cli.utils.teamspace_option import resolve_teamspace


@click.command("delete", cls=LightningCommand)
@click.argument("name")
@click.option("--teamspace", help="Override default teamspace (format: owner/teamspace).")
@click.option("--yes", "-y", is_flag=True, default=False, help="Do not prompt for confirmation.")
@click.option("--json", "as_json", is_flag=True, default=False, help="Output as JSON.")
def delete_deployment(name: str, teamspace: Optional[str] = None, yes: bool = False, as_json: bool = False) -> None:
"""Delete a deployment."""
if not yes:
raise click.UsageError("Deleting a deployment requires --yes.")

def resolve_deployment_delete(
name: str,
teamspace: Optional[str],
) -> DeleteAction:
"""Resolve a deployment and return its bound deletion action."""
resolved_teamspace = resolve_teamspace(teamspace)
api = DeploymentApi()
deployment = resolve_deployment(api, resolved_teamspace.id, name)

api.delete_deployment(deployment)
if as_json:
echo_json({"name": deployment.name, "deleted": True})
return
click.echo(f"Deleted deployment {deployment.name}.")
return partial(api.delete_deployment, deployment)
11 changes: 9 additions & 2 deletions python/lightning_sdk/cli/job/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,25 @@

def register_commands(group: click.Group) -> None:
"""Register job commands with the given group."""
from lightning_sdk.cli.job.delete import delete_job
from lightning_sdk.cli.job.inspect import inspect_job
from lightning_sdk.cli.job.list import list_jobs
from lightning_sdk.cli.job.logs import logs_job
from lightning_sdk.cli.job.run import run_job
from lightning_sdk.cli.job.ssh import ssh_job
from lightning_sdk.cli.job.stop import stop_job
from lightning_sdk.cli.utils.delete import register_delete_command
from lightning_sdk.job import Job

group.add_command(run_job, name="run")
group.add_command(list_jobs, name="list")
group.add_command(inspect_job, name="inspect")
group.add_command(logs_job, name="logs")
group.add_command(ssh_job, name="ssh")
group.add_command(stop_job, name="stop")
group.add_command(delete_job, name="delete")
register_delete_command(
group,
Job,
label="Job",
help="Delete a job.",
context_help="Override default teamspace (format: owner/teamspace).",
)
33 changes: 0 additions & 33 deletions python/lightning_sdk/cli/job/delete.py

This file was deleted.

11 changes: 9 additions & 2 deletions python/lightning_sdk/cli/mmt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,25 @@

def register_commands(group: click.Group) -> None:
"""Register MMT commands with the given group."""
from lightning_sdk.cli.mmt.delete import delete_mmt
from lightning_sdk.cli.mmt.inspect import inspect_mmt
from lightning_sdk.cli.mmt.list import list_mmts
from lightning_sdk.cli.mmt.logs import logs_mmt
from lightning_sdk.cli.mmt.run import run_mmt
from lightning_sdk.cli.mmt.ssh import ssh_mmt
from lightning_sdk.cli.mmt.stop import stop_mmt
from lightning_sdk.cli.utils.delete import register_delete_command
from lightning_sdk.mmt import MMT

group.add_command(run_mmt, name="run")
group.add_command(list_mmts, name="list")
group.add_command(inspect_mmt, name="inspect")
group.add_command(logs_mmt, name="logs")
group.add_command(ssh_mmt, name="ssh")
group.add_command(stop_mmt, name="stop")
group.add_command(delete_mmt, name="delete")
register_delete_command(
group,
MMT,
label="Multi-machine job",
help="Delete a multi-machine job.",
context_help="Override default teamspace (format: owner/teamspace).",
)
33 changes: 0 additions & 33 deletions python/lightning_sdk/cli/mmt/delete.py

This file was deleted.

37 changes: 33 additions & 4 deletions python/lightning_sdk/cli/sandbox/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,38 @@ def register_commands(group: click.Group) -> None:
connect_sandbox,
create_sandbox,
create_snapshot,
delete_sandbox,
delete_snapshot,
get_snapshot,
list_sandbox_commands,
list_sandboxes,
list_snapshots,
logs_sandbox_command,
resolve_sandbox_delete,
resolve_snapshot_delete,
run_sandbox_command,
start_sandbox,
stop_sandbox,
update_sandbox,
)
from lightning_sdk.cli.utils.delete import register_delete_command

group.add_command(list_sandboxes, name="list")
group.add_command(create_sandbox, name="create")
group.add_command(update_sandbox, name="update")
group.add_command(delete_sandbox, name="delete")
register_delete_command(
group,
label="Sandbox",
help="""Delete a sandbox.

Example:
$ sandbox delete sbx-42

Sandbox deleted
""",
identifier="sandbox_id",
context_option="api_key",
context_help="Sandbox API key.",
resolve_delete=resolve_sandbox_delete,
)
group.add_command(stop_sandbox, name="stop")
group.add_command(start_sandbox, name="start")
group.add_command(connect_sandbox, name="connect")
Expand All @@ -54,6 +69,20 @@ def register_commands(group: click.Group) -> None:
snapshot.add_command(list_snapshots, name="list")
snapshot.add_command(get_snapshot, name="get")
snapshot.add_command(create_snapshot, name="create")
snapshot.add_command(delete_snapshot, name="delete")
register_delete_command(
snapshot,
label="Snapshot",
help="""Delete a sandbox snapshot.

Example:
$ sandbox snapshot delete snap-42

Snapshot deleted
""",
identifier="snapshot_id",
context_option="api_key",
context_help="Sandbox API key.",
resolve_delete=resolve_snapshot_delete,
)
group.add_command(snapshot, name="snapshot")
group.add_command(list_sandbox_commands, name="commands")
Loading
Loading