dstack 0.18.43__py3-none-any.whl → 0.19.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dstack might be problematic. Click here for more details.
- dstack/_internal/cli/commands/gateway.py +15 -3
- dstack/_internal/cli/commands/logs.py +0 -22
- dstack/_internal/cli/commands/stats.py +8 -17
- dstack/_internal/cli/main.py +1 -5
- dstack/_internal/cli/services/configurators/fleet.py +4 -39
- dstack/_internal/cli/services/configurators/run.py +22 -20
- dstack/_internal/cli/services/profile.py +34 -83
- dstack/_internal/cli/utils/gateway.py +1 -1
- dstack/_internal/cli/utils/run.py +11 -0
- dstack/_internal/core/backends/__init__.py +56 -39
- dstack/_internal/core/backends/aws/__init__.py +0 -25
- dstack/_internal/core/backends/aws/auth.py +1 -10
- dstack/_internal/core/backends/aws/backend.py +26 -0
- dstack/_internal/core/backends/aws/compute.py +21 -45
- dstack/_internal/{server/services/backends/configurators/aws.py → core/backends/aws/configurator.py} +46 -85
- dstack/_internal/core/backends/aws/models.py +135 -0
- dstack/_internal/core/backends/aws/resources.py +1 -1
- dstack/_internal/core/backends/azure/__init__.py +0 -20
- dstack/_internal/core/backends/azure/auth.py +2 -11
- dstack/_internal/core/backends/azure/backend.py +21 -0
- dstack/_internal/core/backends/azure/compute.py +14 -28
- dstack/_internal/{server/services/backends/configurators/azure.py → core/backends/azure/configurator.py} +141 -210
- dstack/_internal/core/backends/azure/models.py +89 -0
- dstack/_internal/core/backends/base/__init__.py +0 -12
- dstack/_internal/core/backends/base/backend.py +18 -0
- dstack/_internal/core/backends/base/compute.py +153 -33
- dstack/_internal/core/backends/base/configurator.py +105 -0
- dstack/_internal/core/backends/base/models.py +14 -0
- dstack/_internal/core/backends/configurators.py +138 -0
- dstack/_internal/core/backends/cudo/__init__.py +0 -15
- dstack/_internal/core/backends/cudo/backend.py +16 -0
- dstack/_internal/core/backends/cudo/compute.py +8 -26
- dstack/_internal/core/backends/cudo/configurator.py +72 -0
- dstack/_internal/core/backends/cudo/models.py +37 -0
- dstack/_internal/core/backends/datacrunch/__init__.py +0 -15
- dstack/_internal/core/backends/datacrunch/backend.py +16 -0
- dstack/_internal/core/backends/datacrunch/compute.py +8 -25
- dstack/_internal/core/backends/datacrunch/configurator.py +66 -0
- dstack/_internal/core/backends/datacrunch/models.py +38 -0
- dstack/_internal/core/{models/backends/dstack.py → backends/dstack/models.py} +7 -7
- dstack/_internal/core/backends/gcp/__init__.py +0 -16
- dstack/_internal/core/backends/gcp/auth.py +2 -11
- dstack/_internal/core/backends/gcp/backend.py +17 -0
- dstack/_internal/core/backends/gcp/compute.py +14 -44
- dstack/_internal/{server/services/backends/configurators/gcp.py → core/backends/gcp/configurator.py} +46 -103
- dstack/_internal/core/backends/gcp/models.py +125 -0
- dstack/_internal/core/backends/kubernetes/__init__.py +0 -15
- dstack/_internal/core/backends/kubernetes/backend.py +16 -0
- dstack/_internal/core/backends/kubernetes/compute.py +16 -5
- dstack/_internal/core/backends/kubernetes/configurator.py +55 -0
- dstack/_internal/core/backends/kubernetes/models.py +72 -0
- dstack/_internal/core/backends/lambdalabs/__init__.py +0 -16
- dstack/_internal/core/backends/lambdalabs/backend.py +17 -0
- dstack/_internal/core/backends/lambdalabs/compute.py +7 -28
- dstack/_internal/core/backends/lambdalabs/configurator.py +82 -0
- dstack/_internal/core/backends/lambdalabs/models.py +37 -0
- dstack/_internal/core/backends/local/__init__.py +0 -13
- dstack/_internal/core/backends/local/backend.py +14 -0
- dstack/_internal/core/backends/local/compute.py +16 -2
- dstack/_internal/core/backends/models.py +128 -0
- dstack/_internal/core/backends/oci/__init__.py +0 -15
- dstack/_internal/core/backends/oci/auth.py +1 -5
- dstack/_internal/core/backends/oci/backend.py +16 -0
- dstack/_internal/core/backends/oci/compute.py +9 -23
- dstack/_internal/{server/services/backends/configurators/oci.py → core/backends/oci/configurator.py} +40 -85
- dstack/_internal/core/{models/backends/oci.py → backends/oci/models.py} +24 -25
- dstack/_internal/core/backends/oci/region.py +1 -1
- dstack/_internal/core/backends/runpod/__init__.py +0 -15
- dstack/_internal/core/backends/runpod/backend.py +16 -0
- dstack/_internal/core/backends/runpod/compute.py +28 -6
- dstack/_internal/core/backends/runpod/configurator.py +59 -0
- dstack/_internal/core/backends/runpod/models.py +54 -0
- dstack/_internal/core/backends/template/__init__.py +0 -0
- dstack/_internal/core/backends/tensordock/__init__.py +0 -15
- dstack/_internal/core/backends/tensordock/backend.py +16 -0
- dstack/_internal/core/backends/tensordock/compute.py +8 -27
- dstack/_internal/core/backends/tensordock/configurator.py +68 -0
- dstack/_internal/core/backends/tensordock/models.py +38 -0
- dstack/_internal/core/backends/vastai/__init__.py +0 -15
- dstack/_internal/core/backends/vastai/backend.py +16 -0
- dstack/_internal/core/backends/vastai/compute.py +2 -2
- dstack/_internal/core/backends/vastai/configurator.py +66 -0
- dstack/_internal/core/backends/vastai/models.py +37 -0
- dstack/_internal/core/backends/vultr/__init__.py +0 -15
- dstack/_internal/core/backends/vultr/backend.py +16 -0
- dstack/_internal/core/backends/vultr/compute.py +10 -24
- dstack/_internal/core/backends/vultr/configurator.py +64 -0
- dstack/_internal/core/backends/vultr/models.py +34 -0
- dstack/_internal/core/models/backends/__init__.py +0 -184
- dstack/_internal/core/models/backends/base.py +0 -19
- dstack/_internal/core/models/configurations.py +22 -16
- dstack/_internal/core/models/envs.py +4 -3
- dstack/_internal/core/models/fleets.py +17 -22
- dstack/_internal/core/models/gateways.py +3 -3
- dstack/_internal/core/models/instances.py +24 -0
- dstack/_internal/core/models/profiles.py +85 -45
- dstack/_internal/core/models/projects.py +1 -1
- dstack/_internal/core/models/repos/base.py +0 -5
- dstack/_internal/core/models/repos/local.py +3 -3
- dstack/_internal/core/models/repos/remote.py +26 -12
- dstack/_internal/core/models/repos/virtual.py +1 -1
- dstack/_internal/core/models/resources.py +45 -76
- dstack/_internal/core/models/runs.py +21 -19
- dstack/_internal/core/models/volumes.py +1 -3
- dstack/_internal/core/services/profiles.py +7 -16
- dstack/_internal/core/services/repos.py +0 -4
- dstack/_internal/server/app.py +11 -4
- dstack/_internal/server/background/__init__.py +10 -0
- dstack/_internal/server/background/tasks/process_gateways.py +4 -8
- dstack/_internal/server/background/tasks/process_instances.py +14 -9
- dstack/_internal/server/background/tasks/process_metrics.py +1 -1
- dstack/_internal/server/background/tasks/process_placement_groups.py +5 -1
- dstack/_internal/server/background/tasks/process_prometheus_metrics.py +135 -0
- dstack/_internal/server/background/tasks/process_running_jobs.py +80 -24
- dstack/_internal/server/background/tasks/process_runs.py +1 -0
- dstack/_internal/server/background/tasks/process_submitted_jobs.py +20 -38
- dstack/_internal/server/background/tasks/process_volumes.py +5 -2
- dstack/_internal/server/migrations/versions/60e444118b6d_add_jobprometheusmetrics.py +40 -0
- dstack/_internal/server/migrations/versions/7bc2586e8b9e_make_instancemodel_pool_id_optional.py +36 -0
- dstack/_internal/server/migrations/versions/98d1b92988bc_add_jobterminationreason_terminated_due_.py +140 -0
- dstack/_internal/server/migrations/versions/bc8ca4a505c6_store_backendtype_as_string.py +171 -0
- dstack/_internal/server/models.py +59 -9
- dstack/_internal/server/routers/backends.py +14 -23
- dstack/_internal/server/routers/instances.py +3 -4
- dstack/_internal/server/routers/metrics.py +31 -10
- dstack/_internal/server/routers/prometheus.py +36 -0
- dstack/_internal/server/routers/repos.py +1 -2
- dstack/_internal/server/routers/runs.py +13 -59
- dstack/_internal/server/schemas/gateways.py +14 -23
- dstack/_internal/server/schemas/projects.py +7 -2
- dstack/_internal/server/schemas/repos.py +2 -38
- dstack/_internal/server/schemas/runner.py +1 -0
- dstack/_internal/server/schemas/runs.py +1 -24
- dstack/_internal/server/security/permissions.py +1 -1
- dstack/_internal/server/services/backends/__init__.py +85 -158
- dstack/_internal/server/services/config.py +53 -567
- dstack/_internal/server/services/fleets.py +9 -103
- dstack/_internal/server/services/gateways/__init__.py +13 -4
- dstack/_internal/server/services/{pools.py → instances.py} +22 -329
- dstack/_internal/server/services/jobs/__init__.py +9 -6
- dstack/_internal/server/services/jobs/configurators/base.py +25 -1
- dstack/_internal/server/services/jobs/configurators/dev.py +9 -1
- dstack/_internal/server/services/jobs/configurators/extensions/cursor.py +42 -0
- dstack/_internal/server/services/metrics.py +131 -72
- dstack/_internal/server/services/offers.py +1 -1
- dstack/_internal/server/services/projects.py +23 -14
- dstack/_internal/server/services/prometheus.py +245 -0
- dstack/_internal/server/services/runner/client.py +14 -3
- dstack/_internal/server/services/runs.py +67 -31
- dstack/_internal/server/services/volumes.py +9 -4
- dstack/_internal/server/settings.py +3 -0
- dstack/_internal/server/statics/index.html +1 -1
- dstack/_internal/server/statics/{main-fe8fd9db55df8d10e648.js → main-4a0fe83e84574654e397.js} +76 -19
- dstack/_internal/server/statics/{main-fe8fd9db55df8d10e648.js.map → main-4a0fe83e84574654e397.js.map} +1 -1
- dstack/_internal/server/statics/{main-7510e71dfa9749a4e70e.css → main-da9f8c06a69c20dac23e.css} +1 -1
- dstack/_internal/server/statics/static/media/entraID.d65d1f3e9486a8e56d24fc07b3230885.svg +9 -0
- dstack/_internal/server/testing/common.py +75 -32
- dstack/_internal/utils/json_schema.py +6 -0
- dstack/_internal/utils/ssh.py +2 -1
- dstack/api/__init__.py +4 -0
- dstack/api/_public/__init__.py +16 -20
- dstack/api/_public/backends.py +1 -1
- dstack/api/_public/repos.py +36 -36
- dstack/api/_public/runs.py +170 -83
- dstack/api/server/__init__.py +11 -13
- dstack/api/server/_backends.py +12 -16
- dstack/api/server/_fleets.py +15 -55
- dstack/api/server/_gateways.py +3 -14
- dstack/api/server/_repos.py +1 -4
- dstack/api/server/_runs.py +21 -96
- dstack/api/server/_volumes.py +10 -5
- dstack/api/utils.py +3 -0
- dstack/version.py +1 -1
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/METADATA +10 -1
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/RECORD +229 -206
- tests/_internal/cli/services/configurators/test_profile.py +6 -6
- tests/_internal/core/backends/aws/test_configurator.py +35 -0
- tests/_internal/core/backends/aws/test_resources.py +1 -1
- tests/_internal/core/backends/azure/test_configurator.py +61 -0
- tests/_internal/core/backends/cudo/__init__.py +0 -0
- tests/_internal/core/backends/cudo/test_configurator.py +37 -0
- tests/_internal/core/backends/datacrunch/__init__.py +0 -0
- tests/_internal/core/backends/datacrunch/test_configurator.py +17 -0
- tests/_internal/core/backends/gcp/test_configurator.py +42 -0
- tests/_internal/core/backends/kubernetes/test_configurator.py +43 -0
- tests/_internal/core/backends/lambdalabs/__init__.py +0 -0
- tests/_internal/core/backends/lambdalabs/test_configurator.py +38 -0
- tests/_internal/core/backends/oci/test_configurator.py +55 -0
- tests/_internal/core/backends/runpod/__init__.py +0 -0
- tests/_internal/core/backends/runpod/test_configurator.py +33 -0
- tests/_internal/core/backends/tensordock/__init__.py +0 -0
- tests/_internal/core/backends/tensordock/test_configurator.py +38 -0
- tests/_internal/core/backends/vastai/__init__.py +0 -0
- tests/_internal/core/backends/vastai/test_configurator.py +33 -0
- tests/_internal/core/backends/vultr/__init__.py +0 -0
- tests/_internal/core/backends/vultr/test_configurator.py +33 -0
- tests/_internal/server/background/tasks/test_process_gateways.py +4 -0
- tests/_internal/server/background/tasks/test_process_instances.py +49 -48
- tests/_internal/server/background/tasks/test_process_metrics.py +0 -3
- tests/_internal/server/background/tasks/test_process_placement_groups.py +2 -0
- tests/_internal/server/background/tasks/test_process_prometheus_metrics.py +186 -0
- tests/_internal/server/background/tasks/test_process_running_jobs.py +123 -19
- tests/_internal/server/background/tasks/test_process_runs.py +8 -22
- tests/_internal/server/background/tasks/test_process_submitted_jobs.py +3 -40
- tests/_internal/server/background/tasks/test_process_submitted_volumes.py +2 -0
- tests/_internal/server/background/tasks/test_process_terminating_jobs.py +10 -15
- tests/_internal/server/routers/test_backends.py +6 -764
- tests/_internal/server/routers/test_fleets.py +2 -26
- tests/_internal/server/routers/test_gateways.py +27 -3
- tests/_internal/server/routers/test_instances.py +0 -10
- tests/_internal/server/routers/test_metrics.py +42 -0
- tests/_internal/server/routers/test_projects.py +56 -0
- tests/_internal/server/routers/test_prometheus.py +333 -0
- tests/_internal/server/routers/test_repos.py +0 -15
- tests/_internal/server/routers/test_runs.py +83 -275
- tests/_internal/server/routers/test_volumes.py +2 -3
- tests/_internal/server/services/backends/__init__.py +0 -0
- tests/_internal/server/services/jobs/configurators/test_task.py +35 -0
- tests/_internal/server/services/test_config.py +7 -4
- tests/_internal/server/services/test_fleets.py +1 -4
- tests/_internal/server/services/{test_pools.py → test_instances.py} +11 -49
- tests/_internal/server/services/test_metrics.py +167 -0
- tests/_internal/server/services/test_repos.py +1 -14
- tests/_internal/server/services/test_runs.py +0 -4
- dstack/_internal/cli/commands/pool.py +0 -581
- dstack/_internal/cli/commands/run.py +0 -75
- dstack/_internal/core/backends/aws/config.py +0 -18
- dstack/_internal/core/backends/azure/config.py +0 -12
- dstack/_internal/core/backends/base/config.py +0 -5
- dstack/_internal/core/backends/cudo/config.py +0 -9
- dstack/_internal/core/backends/datacrunch/config.py +0 -9
- dstack/_internal/core/backends/gcp/config.py +0 -22
- dstack/_internal/core/backends/kubernetes/config.py +0 -6
- dstack/_internal/core/backends/lambdalabs/config.py +0 -9
- dstack/_internal/core/backends/nebius/__init__.py +0 -15
- dstack/_internal/core/backends/nebius/api_client.py +0 -319
- dstack/_internal/core/backends/nebius/compute.py +0 -220
- dstack/_internal/core/backends/nebius/config.py +0 -6
- dstack/_internal/core/backends/nebius/types.py +0 -37
- dstack/_internal/core/backends/oci/config.py +0 -6
- dstack/_internal/core/backends/runpod/config.py +0 -9
- dstack/_internal/core/backends/tensordock/config.py +0 -9
- dstack/_internal/core/backends/vastai/config.py +0 -6
- dstack/_internal/core/backends/vultr/config.py +0 -9
- dstack/_internal/core/models/backends/aws.py +0 -86
- dstack/_internal/core/models/backends/azure.py +0 -68
- dstack/_internal/core/models/backends/cudo.py +0 -43
- dstack/_internal/core/models/backends/datacrunch.py +0 -44
- dstack/_internal/core/models/backends/gcp.py +0 -67
- dstack/_internal/core/models/backends/kubernetes.py +0 -40
- dstack/_internal/core/models/backends/lambdalabs.py +0 -43
- dstack/_internal/core/models/backends/nebius.py +0 -54
- dstack/_internal/core/models/backends/runpod.py +0 -40
- dstack/_internal/core/models/backends/tensordock.py +0 -44
- dstack/_internal/core/models/backends/vastai.py +0 -43
- dstack/_internal/core/models/backends/vultr.py +0 -40
- dstack/_internal/core/models/pools.py +0 -43
- dstack/_internal/server/routers/pools.py +0 -142
- dstack/_internal/server/schemas/pools.py +0 -38
- dstack/_internal/server/services/backends/configurators/base.py +0 -72
- dstack/_internal/server/services/backends/configurators/cudo.py +0 -87
- dstack/_internal/server/services/backends/configurators/datacrunch.py +0 -79
- dstack/_internal/server/services/backends/configurators/kubernetes.py +0 -63
- dstack/_internal/server/services/backends/configurators/lambdalabs.py +0 -98
- dstack/_internal/server/services/backends/configurators/nebius.py +0 -85
- dstack/_internal/server/services/backends/configurators/runpod.py +0 -97
- dstack/_internal/server/services/backends/configurators/tensordock.py +0 -82
- dstack/_internal/server/services/backends/configurators/vastai.py +0 -80
- dstack/_internal/server/services/backends/configurators/vultr.py +0 -80
- dstack/api/_public/pools.py +0 -41
- dstack/api/_public/resources.py +0 -105
- dstack/api/server/_pools.py +0 -63
- tests/_internal/server/routers/test_pools.py +0 -612
- /dstack/_internal/{server/services/backends/configurators → core/backends/dstack}/__init__.py +0 -0
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/LICENSE.md +0 -0
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/WHEEL +0 -0
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/entry_points.txt +0 -0
- {dstack-0.18.43.dist-info → dstack-0.19.0.dist-info}/top_level.txt +0 -0
|
@@ -16,9 +16,9 @@ from dstack._internal.server.background.tasks.process_terminating_jobs import (
|
|
|
16
16
|
from dstack._internal.server.models import InstanceModel, JobModel, VolumeAttachmentModel
|
|
17
17
|
from dstack._internal.server.services.volumes import volume_model_to_volume
|
|
18
18
|
from dstack._internal.server.testing.common import (
|
|
19
|
+
ComputeMockSpec,
|
|
19
20
|
create_instance,
|
|
20
21
|
create_job,
|
|
21
|
-
create_pool,
|
|
22
22
|
create_project,
|
|
23
23
|
create_repo,
|
|
24
24
|
create_run,
|
|
@@ -39,11 +39,9 @@ class TestProcessTerminatingJobs:
|
|
|
39
39
|
async def test_terminates_job(self, session: AsyncSession):
|
|
40
40
|
project = await create_project(session=session)
|
|
41
41
|
user = await create_user(session=session)
|
|
42
|
-
pool = await create_pool(session=session, project=project)
|
|
43
42
|
instance = await create_instance(
|
|
44
43
|
session=session,
|
|
45
44
|
project=project,
|
|
46
|
-
pool=pool,
|
|
47
45
|
status=InstanceStatus.BUSY,
|
|
48
46
|
)
|
|
49
47
|
repo = await create_repo(session=session, project_id=project.id)
|
|
@@ -78,7 +76,6 @@ class TestProcessTerminatingJobs:
|
|
|
78
76
|
async def test_detaches_job_volumes(self, session: AsyncSession):
|
|
79
77
|
project = await create_project(session=session)
|
|
80
78
|
user = await create_user(session=session)
|
|
81
|
-
pool = await create_pool(session=session, project=project)
|
|
82
79
|
volume = await create_volume(
|
|
83
80
|
session=session,
|
|
84
81
|
project=project,
|
|
@@ -90,7 +87,6 @@ class TestProcessTerminatingJobs:
|
|
|
90
87
|
instance = await create_instance(
|
|
91
88
|
session=session,
|
|
92
89
|
project=project,
|
|
93
|
-
pool=pool,
|
|
94
90
|
status=InstanceStatus.BUSY,
|
|
95
91
|
volumes=[volume],
|
|
96
92
|
)
|
|
@@ -114,6 +110,7 @@ class TestProcessTerminatingJobs:
|
|
|
114
110
|
with patch("dstack._internal.server.services.backends.get_project_backend_by_type") as m:
|
|
115
111
|
backend_mock = Mock()
|
|
116
112
|
m.return_value = backend_mock
|
|
113
|
+
backend_mock.compute.return_value = Mock(spec=ComputeMockSpec)
|
|
117
114
|
backend_mock.compute.return_value.is_volume_detached.return_value = True
|
|
118
115
|
await process_terminating_jobs()
|
|
119
116
|
m.assert_awaited_once()
|
|
@@ -125,7 +122,6 @@ class TestProcessTerminatingJobs:
|
|
|
125
122
|
async def test_force_detaches_job_volumes(self, session: AsyncSession):
|
|
126
123
|
project = await create_project(session=session)
|
|
127
124
|
user = await create_user(session=session)
|
|
128
|
-
pool = await create_pool(session=session, project=project)
|
|
129
125
|
volume = await create_volume(
|
|
130
126
|
session=session,
|
|
131
127
|
project=project,
|
|
@@ -137,7 +133,6 @@ class TestProcessTerminatingJobs:
|
|
|
137
133
|
instance = await create_instance(
|
|
138
134
|
session=session,
|
|
139
135
|
project=project,
|
|
140
|
-
pool=pool,
|
|
141
136
|
status=InstanceStatus.BUSY,
|
|
142
137
|
volumes=[volume],
|
|
143
138
|
)
|
|
@@ -163,6 +158,7 @@ class TestProcessTerminatingJobs:
|
|
|
163
158
|
with patch("dstack._internal.server.services.backends.get_project_backend_by_type") as m:
|
|
164
159
|
backend_mock = Mock()
|
|
165
160
|
m.return_value = backend_mock
|
|
161
|
+
backend_mock.compute.return_value = Mock(spec=ComputeMockSpec)
|
|
166
162
|
backend_mock.compute.return_value.is_volume_detached.return_value = False
|
|
167
163
|
await process_terminating_jobs()
|
|
168
164
|
m.assert_awaited_once()
|
|
@@ -188,6 +184,7 @@ class TestProcessTerminatingJobs:
|
|
|
188
184
|
) + timedelta(minutes=30)
|
|
189
185
|
backend_mock = Mock()
|
|
190
186
|
m.return_value = backend_mock
|
|
187
|
+
backend_mock.compute.return_value = Mock(spec=ComputeMockSpec)
|
|
191
188
|
backend_mock.compute.return_value.is_volume_detached.return_value = False
|
|
192
189
|
await process_terminating_jobs()
|
|
193
190
|
m.assert_awaited_once()
|
|
@@ -205,6 +202,7 @@ class TestProcessTerminatingJobs:
|
|
|
205
202
|
with patch("dstack._internal.server.services.backends.get_project_backend_by_type") as m:
|
|
206
203
|
backend_mock = Mock()
|
|
207
204
|
m.return_value = backend_mock
|
|
205
|
+
backend_mock.compute.return_value = Mock(spec=ComputeMockSpec)
|
|
208
206
|
backend_mock.compute.return_value.is_volume_detached.return_value = True
|
|
209
207
|
await process_terminating_jobs()
|
|
210
208
|
m.assert_awaited_once()
|
|
@@ -223,7 +221,6 @@ class TestProcessTerminatingJobs:
|
|
|
223
221
|
async def test_terminates_job_on_shared_instance(self, session: AsyncSession):
|
|
224
222
|
project = await create_project(session)
|
|
225
223
|
user = await create_user(session)
|
|
226
|
-
pool = await create_pool(session=session, project=project)
|
|
227
224
|
repo = await create_repo(
|
|
228
225
|
session=session,
|
|
229
226
|
project_id=project.id,
|
|
@@ -231,12 +228,10 @@ class TestProcessTerminatingJobs:
|
|
|
231
228
|
instance = await create_instance(
|
|
232
229
|
session=session,
|
|
233
230
|
project=project,
|
|
234
|
-
pool=pool,
|
|
235
231
|
status=InstanceStatus.BUSY,
|
|
236
232
|
total_blocks=4,
|
|
237
233
|
busy_blocks=3,
|
|
238
234
|
)
|
|
239
|
-
await session.refresh(pool)
|
|
240
235
|
run = await create_run(
|
|
241
236
|
session=session,
|
|
242
237
|
project=project,
|
|
@@ -270,7 +265,6 @@ class TestProcessTerminatingJobs:
|
|
|
270
265
|
async def test_detaches_job_volumes_on_shared_instance(self, session: AsyncSession):
|
|
271
266
|
project = await create_project(session=session)
|
|
272
267
|
user = await create_user(session=session)
|
|
273
|
-
pool = await create_pool(session=session, project=project)
|
|
274
268
|
volume_conf_1 = get_volume_configuration(name="vol-1")
|
|
275
269
|
volume_1 = await create_volume(
|
|
276
270
|
session=session,
|
|
@@ -294,7 +288,6 @@ class TestProcessTerminatingJobs:
|
|
|
294
288
|
instance = await create_instance(
|
|
295
289
|
session=session,
|
|
296
290
|
project=project,
|
|
297
|
-
pool=pool,
|
|
298
291
|
status=InstanceStatus.BUSY,
|
|
299
292
|
volumes=[volume_1, volume_2],
|
|
300
293
|
)
|
|
@@ -319,13 +312,15 @@ class TestProcessTerminatingJobs:
|
|
|
319
312
|
with patch("dstack._internal.server.services.backends.get_project_backend_by_type") as m:
|
|
320
313
|
backend_mock = Mock()
|
|
321
314
|
m.return_value = backend_mock
|
|
315
|
+
backend_mock.compute.return_value = Mock(spec=ComputeMockSpec)
|
|
322
316
|
backend_mock.compute.return_value.is_volume_detached.return_value = True
|
|
323
317
|
|
|
324
318
|
await process_terminating_jobs()
|
|
325
319
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
320
|
+
m.assert_awaited_once()
|
|
321
|
+
backend_mock.compute.return_value.detach_volume.assert_called_once()
|
|
322
|
+
backend_mock.compute.return_value.is_volume_detached.assert_called_once()
|
|
323
|
+
|
|
329
324
|
await session.refresh(job)
|
|
330
325
|
await session.refresh(instance)
|
|
331
326
|
assert job.status == JobStatus.TERMINATED
|