From 319a7da5dca4cd08621f75688820e925d3550e4d Mon Sep 17 00:00:00 2001 From: Jvst Me Date: Mon, 8 Jun 2026 12:41:38 +0200 Subject: [PATCH] [chore]: Move `format_backend()` to common utils --- src/dstack/_internal/cli/utils/common.py | 12 ++++++++++++ src/dstack/_internal/cli/utils/fleet.py | 22 ++++++++-------------- src/dstack/_internal/cli/utils/gateway.py | 9 +++++++-- src/dstack/_internal/cli/utils/run.py | 18 +++--------------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/dstack/_internal/cli/utils/common.py b/src/dstack/_internal/cli/utils/common.py index bf837e161..b437a3c2c 100644 --- a/src/dstack/_internal/cli/utils/common.py +++ b/src/dstack/_internal/cli/utils/common.py @@ -12,6 +12,7 @@ from dstack._internal import settings from dstack._internal.cli.utils.rich import DstackRichHandler from dstack._internal.core.errors import CLIError, DstackError +from dstack._internal.core.models.backends.base import BackendType from dstack._internal.core.models.instances import InstanceAvailability from dstack._internal.utils.common import get_dstack_dir, parse_since @@ -162,3 +163,14 @@ def format_instance_availability(v: InstanceAvailability) -> str: if v in (InstanceAvailability.UNKNOWN, InstanceAvailability.AVAILABLE): return "" return v.value.replace("_", " ").lower() + + +def format_backend(backend: Optional[BackendType], region: Optional[str]) -> str: + if backend is None: + return "-" + backend_str = backend.value + if backend == BackendType.REMOTE: + backend_str = "ssh" + if region: + backend_str += f" ({region})" + return backend_str diff --git a/src/dstack/_internal/cli/utils/fleet.py b/src/dstack/_internal/cli/utils/fleet.py index 75f6b5016..ccb240085 100644 --- a/src/dstack/_internal/cli/utils/fleet.py +++ b/src/dstack/_internal/cli/utils/fleet.py @@ -2,7 +2,12 @@ from rich.table import Table -from dstack._internal.cli.utils.common import add_row_from_dict, console, format_entity_reference +from dstack._internal.cli.utils.common import ( + add_row_from_dict, + console, + format_backend, + format_entity_reference, +) from dstack._internal.core.models.backends.base import BackendType from dstack._internal.core.models.fleets import Fleet, FleetNodesSpec, FleetStatus from dstack._internal.core.models.instances import Instance, InstanceStatus @@ -93,9 +98,9 @@ def get_fleets_table( # Format backend with region (and AZ in verbose mode) if verbose and instance.availability_zone: # In verbose mode, show AZ instead of region (AZ is more specific) - backend_with_region = _format_backend(instance.backend, instance.availability_zone) + backend_with_region = format_backend(instance.backend, instance.availability_zone) else: - backend_with_region = _format_backend(instance.backend, instance.region) + backend_with_region = format_backend(instance.backend, instance.region) # Get spot info from instance resources (not applicable to SSH) if is_ssh_instance: @@ -248,17 +253,6 @@ def _format_instance_status(instance: Instance) -> str: return f"[{status_style}]{status_text}{health_suffix}[/]" -def _format_backend(backend: Optional[BackendType], region: Optional[str]) -> str: - if backend is None: - return "-" - backend_str = backend.value - if backend == BackendType.REMOTE: - backend_str = "ssh" - if region: - backend_str += f" ({region})" - return backend_str - - def _format_price(price: Optional[float]) -> str: if price is None: return "-" diff --git a/src/dstack/_internal/cli/utils/gateway.py b/src/dstack/_internal/cli/utils/gateway.py index 897e1e712..560532621 100644 --- a/src/dstack/_internal/cli/utils/gateway.py +++ b/src/dstack/_internal/cli/utils/gateway.py @@ -3,7 +3,12 @@ from rich.table import Table from dstack._internal.cli.models.gateways import GatewayCommandOutput -from dstack._internal.cli.utils.common import add_row_from_dict, console, format_entity_reference +from dstack._internal.cli.utils.common import ( + add_row_from_dict, + console, + format_backend, + format_entity_reference, +) from dstack._internal.core.errors import ResourceNotExistsError from dstack._internal.core.models.common import EntityReference from dstack._internal.core.models.gateways import Gateway @@ -92,7 +97,7 @@ def get_gateways_table( ) row = { "NAME": name, - "BACKEND": f"{gateway.configuration.backend.value} ({gateway.configuration.region})", + "BACKEND": format_backend(gateway.configuration.backend, gateway.configuration.region), "HOSTNAME": gateway.hostname, "DOMAIN": domain, "DEFAULT": "✓" if gateway.default else "", diff --git a/src/dstack/_internal/cli/utils/run.py b/src/dstack/_internal/cli/utils/run.py index acbcb1474..42f6388ab 100644 --- a/src/dstack/_internal/cli/utils/run.py +++ b/src/dstack/_internal/cli/utils/run.py @@ -12,9 +12,9 @@ NO_OFFERS_WARNING, add_row_from_dict, console, + format_backend, format_instance_availability, ) -from dstack._internal.core.models.backends.base import BackendType from dstack._internal.core.models.configurations import DevEnvironmentConfiguration from dstack._internal.core.models.instances import ( InstanceOfferWithAvailability, @@ -187,12 +187,9 @@ def th(s: str) -> str: instance = offer.instance.name if offer.total_blocks > 1: instance += f" ({offer.blocks}/{offer.total_blocks})" - offer_backend = offer.backend.replace("remote", "ssh") - if offer.region: - offer_backend = f"{offer_backend} ({offer.region})" offers.add_row( f"{i}", - offer_backend, + format_backend(offer.backend, offer.region), r.pretty_format(include_spot=True), instance, f"${offer.price:.4f}".rstrip("0").rstrip("."), @@ -415,15 +412,6 @@ def _format_price(price: float, is_spot: bool) -> str: return price_str -def _format_backend(backend_type: BackendType, region: str) -> str: - backend_str = backend_type.value - if backend_type == BackendType.REMOTE: - backend_str = "ssh" - if not region: - return backend_str - return f"{backend_str} ({region})" - - def _format_instance_type( instance_type: InstanceType, shared_offer: Optional[InstanceOfferWithAvailability], @@ -563,7 +551,7 @@ def get_job_sort_key(job: Job) -> tuple: resources = instance_type.resources job_row.update( { - "BACKEND": _format_backend(jpd.backend, jpd.region), + "BACKEND": format_backend(jpd.backend, jpd.region), "RESOURCES": resources.pretty_format(include_spot=False), "GPU": resources.pretty_format(gpu_only=True, include_spot=False), "INSTANCE TYPE": _format_instance_type(