Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 27 additions & 20 deletions src/dstack/_internal/cli/commands/project.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import argparse
from typing import Any, Union

from requests import HTTPError
from rich.table import Table

import dstack.api.server
from dstack._internal.cli.commands import BaseCommand
from dstack._internal.cli.utils.common import confirm_ask, console
from dstack._internal.cli.utils.common import add_row_from_dict, confirm_ask, console
from dstack._internal.core.errors import ClientError, CLIError
from dstack._internal.core.services.configs import ConfigManager
from dstack._internal.utils.logging import get_logger
Expand Down Expand Up @@ -58,6 +59,10 @@ def _register(self):
# List subcommand
list_parser = subparsers.add_parser("list", help="List configured projects")
list_parser.set_defaults(subfunc=self._list)
for parser in [self._parser, list_parser]:
parser.add_argument(
"-v", "--verbose", action="store_true", help="Show more information"
)

# Set default subcommand
set_default_parser = subparsers.add_parser("set-default", help="Set default project")
Expand Down Expand Up @@ -122,30 +127,32 @@ def _list(self, args: argparse.Namespace):
table = Table(box=None)
table.add_column("PROJECT", style="bold", no_wrap=True)
table.add_column("URL", style="grey58")
table.add_column("USER", style="grey58")
if args.verbose:
table.add_column("USER", style="grey58")
table.add_column("DEFAULT", justify="center")

for project_config in config_manager.list_project_configs():
project_name = project_config.name
is_default = project_name == default_project.name if default_project else False

# Get username from API
try:
api_client = dstack.api.server.APIClient(
base_url=project_config.url, token=project_config.token
)
user_info = api_client.users.get_my_user()
username = user_info.username
except ClientError:
username = "(invalid token)"

table.add_row(
project_name,
project_config.url,
username,
"✓" if is_default else "",
style="bold" if is_default else None,
)
row: dict[Union[str, int], Any] = {
"PROJECT": project_name,
"URL": project_config.url,
"DEFAULT": "✓" if is_default else "",
}

if args.verbose:
# Get username from API
try:
api_client = dstack.api.server.APIClient(
base_url=project_config.url, token=project_config.token
)
user_info = api_client.users.get_my_user()
username = user_info.username
except ClientError:
username = "(invalid token)"
row["USER"] = username

add_row_from_dict(table, row, style="bold" if is_default else None)

console.print(table)

Expand Down
Loading