Skip to content
Merged
Show file tree
Hide file tree
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
65 changes: 0 additions & 65 deletions src/dstack/_internal/core/backends/__init__.py
Original file line number Diff line number Diff line change
@@ -1,65 +0,0 @@
from dstack._internal.core.backends.base.compute import (
ComputeWithCreateInstanceSupport,
ComputeWithGatewaySupport,
ComputeWithMultinodeSupport,
ComputeWithPlacementGroupSupport,
ComputeWithPrivateGatewaySupport,
ComputeWithReservationSupport,
ComputeWithVolumeSupport,
)
from dstack._internal.core.backends.base.configurator import Configurator
from dstack._internal.core.backends.configurators import list_available_configurator_classes
from dstack._internal.core.backends.local.compute import LocalCompute
from dstack._internal.core.models.backends.base import BackendType
from dstack._internal.settings import LOCAL_BACKEND_ENABLED


def _get_backends_with_compute_feature(
configurator_classes: list[type[Configurator]],
compute_feature_class: type,
) -> list[BackendType]:
backend_types_and_computes = [
(configurator_class.TYPE, configurator_class.BACKEND_CLASS.COMPUTE_CLASS)
for configurator_class in configurator_classes
]
if LOCAL_BACKEND_ENABLED:
backend_types_and_computes.append((BackendType.LOCAL, LocalCompute))
backend_types = []
for backend_type, compute_class in backend_types_and_computes:
if issubclass(compute_class, compute_feature_class):
backend_types.append(backend_type)
return backend_types


_configurator_classes = list_available_configurator_classes()


# The following backend lists do not include unavailable backends (i.e. backends missing deps).
BACKENDS_WITH_CREATE_INSTANCE_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithCreateInstanceSupport,
)
BACKENDS_WITH_MULTINODE_SUPPORT = [BackendType.REMOTE] + _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithMultinodeSupport,
)
BACKENDS_WITH_PLACEMENT_GROUPS_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithPlacementGroupSupport,
)
BACKENDS_WITH_RESERVATION_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithReservationSupport,
)
BACKENDS_WITH_GATEWAY_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithGatewaySupport,
)
BACKENDS_WITH_PRIVATE_GATEWAY_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithPrivateGatewaySupport,
)
BACKENDS_WITH_VOLUMES_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithVolumeSupport,
)
64 changes: 64 additions & 0 deletions src/dstack/_internal/core/backends/features.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from dstack._internal.core.backends.base.compute import (
ComputeWithCreateInstanceSupport,
ComputeWithGatewaySupport,
ComputeWithMultinodeSupport,
ComputeWithPlacementGroupSupport,
ComputeWithPrivateGatewaySupport,
ComputeWithReservationSupport,
ComputeWithVolumeSupport,
)
from dstack._internal.core.backends.base.configurator import Configurator
from dstack._internal.core.backends.configurators import list_available_configurator_classes
from dstack._internal.core.backends.local.compute import LocalCompute
from dstack._internal.core.models.backends.base import BackendType
from dstack._internal.settings import LOCAL_BACKEND_ENABLED

_configurator_classes = list_available_configurator_classes()


def _get_backends_with_compute_feature(
configurator_classes: list[type[Configurator]],
compute_feature_class: type,
) -> list[BackendType]:
backend_types_and_computes = [
(configurator_class.TYPE, configurator_class.BACKEND_CLASS.COMPUTE_CLASS)
for configurator_class in configurator_classes
]
if LOCAL_BACKEND_ENABLED:
backend_types_and_computes.append((BackendType.LOCAL, LocalCompute))
backend_types = []
for backend_type, compute_class in backend_types_and_computes:
if issubclass(compute_class, compute_feature_class):
backend_types.append(backend_type)
return backend_types


# The following backend lists do not include unavailable backends (i.e. backends missing deps).
BACKENDS_WITH_CREATE_INSTANCE_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithCreateInstanceSupport,
)
BACKENDS_WITH_MULTINODE_SUPPORT = [BackendType.REMOTE] + _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithMultinodeSupport,
)
BACKENDS_WITH_PLACEMENT_GROUPS_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithPlacementGroupSupport,
)
BACKENDS_WITH_RESERVATION_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithReservationSupport,
)
BACKENDS_WITH_GATEWAY_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithGatewaySupport,
)
BACKENDS_WITH_PRIVATE_GATEWAY_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithPrivateGatewaySupport,
)
BACKENDS_WITH_VOLUMES_SUPPORT = _get_backends_with_compute_feature(
configurator_classes=_configurator_classes,
compute_feature_class=ComputeWithVolumeSupport,
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@
from sqlalchemy.orm import joinedload, lazyload

from dstack._internal import settings
from dstack._internal.core.backends import (
BACKENDS_WITH_CREATE_INSTANCE_SUPPORT,
BACKENDS_WITH_PLACEMENT_GROUPS_SUPPORT,
)
from dstack._internal.core.backends.base.compute import (
ComputeWithCreateInstanceSupport,
ComputeWithPlacementGroupSupport,
Expand All @@ -27,6 +23,10 @@
get_shim_env,
get_shim_pre_start_commands,
)
from dstack._internal.core.backends.features import (
BACKENDS_WITH_CREATE_INSTANCE_SUPPORT,
BACKENDS_WITH_PLACEMENT_GROUPS_SUPPORT,
)
from dstack._internal.core.backends.remote.provisioning import (
detect_cpu_arch,
get_host_info,
Expand Down
2 changes: 1 addition & 1 deletion src/dstack/_internal/server/services/fleets.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload, selectinload

from dstack._internal.core.backends import BACKENDS_WITH_CREATE_INSTANCE_SUPPORT
from dstack._internal.core.backends.base.backend import Backend
from dstack._internal.core.backends.features import BACKENDS_WITH_CREATE_INSTANCE_SUPPORT
from dstack._internal.core.errors import (
ForbiddenError,
ResourceExistsError,
Expand Down
8 changes: 4 additions & 4 deletions src/dstack/_internal/server/services/gateways/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@
from sqlalchemy.orm import selectinload

import dstack._internal.utils.random_names as random_names
from dstack._internal.core.backends import (
BACKENDS_WITH_GATEWAY_SUPPORT,
BACKENDS_WITH_PRIVATE_GATEWAY_SUPPORT,
)
from dstack._internal.core.backends.base.compute import (
Compute,
ComputeWithGatewaySupport,
get_dstack_gateway_wheel,
get_dstack_runner_version,
)
from dstack._internal.core.backends.features import (
BACKENDS_WITH_GATEWAY_SUPPORT,
BACKENDS_WITH_PRIVATE_GATEWAY_SUPPORT,
)
from dstack._internal.core.errors import (
GatewayError,
ResourceNotExistsError,
Expand Down
2 changes: 1 addition & 1 deletion src/dstack/_internal/server/services/instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload

from dstack._internal.core.backends import BACKENDS_WITH_MULTINODE_SUPPORT
from dstack._internal.core.backends.base.offers import (
offer_to_catalog_item,
requirements_to_query_filter,
)
from dstack._internal.core.backends.features import BACKENDS_WITH_MULTINODE_SUPPORT
from dstack._internal.core.models.backends.base import BackendType
from dstack._internal.core.models.envs import Env
from dstack._internal.core.models.instances import (
Expand Down
6 changes: 3 additions & 3 deletions src/dstack/_internal/server/services/offers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import gpuhunt

from dstack._internal.core.backends import (
from dstack._internal.core.backends.base.backend import Backend
from dstack._internal.core.backends.base.compute import ComputeWithPlacementGroupSupport
from dstack._internal.core.backends.features import (
BACKENDS_WITH_CREATE_INSTANCE_SUPPORT,
BACKENDS_WITH_MULTINODE_SUPPORT,
BACKENDS_WITH_RESERVATION_SUPPORT,
)
from dstack._internal.core.backends.base.backend import Backend
from dstack._internal.core.backends.base.compute import ComputeWithPlacementGroupSupport
from dstack._internal.core.models.backends.base import BackendType
from dstack._internal.core.models.instances import (
InstanceOfferWithAvailability,
Expand Down
2 changes: 1 addition & 1 deletion src/dstack/_internal/server/services/volumes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload, selectinload

from dstack._internal.core.backends import BACKENDS_WITH_VOLUMES_SUPPORT
from dstack._internal.core.backends.base.compute import ComputeWithVolumeSupport
from dstack._internal.core.backends.features import BACKENDS_WITH_VOLUMES_SUPPORT
from dstack._internal.core.errors import (
BackendNotAvailable,
ResourceExistsError,
Expand Down
Loading