dstack 0.19.28__py3-none-any.whl → 0.19.30__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.

Files changed (51) hide show
  1. dstack/_internal/cli/main.py +3 -1
  2. dstack/_internal/cli/services/configurators/fleet.py +20 -6
  3. dstack/_internal/cli/utils/gpu.py +2 -2
  4. dstack/_internal/core/backends/aws/compute.py +62 -41
  5. dstack/_internal/core/backends/aws/resources.py +11 -6
  6. dstack/_internal/core/backends/azure/compute.py +25 -13
  7. dstack/_internal/core/backends/base/compute.py +121 -14
  8. dstack/_internal/core/backends/base/offers.py +34 -4
  9. dstack/_internal/core/backends/cloudrift/compute.py +5 -7
  10. dstack/_internal/core/backends/cudo/compute.py +4 -2
  11. dstack/_internal/core/backends/datacrunch/compute.py +13 -11
  12. dstack/_internal/core/backends/digitalocean_base/compute.py +4 -5
  13. dstack/_internal/core/backends/gcp/compute.py +25 -11
  14. dstack/_internal/core/backends/hotaisle/compute.py +4 -7
  15. dstack/_internal/core/backends/kubernetes/compute.py +6 -4
  16. dstack/_internal/core/backends/lambdalabs/compute.py +4 -5
  17. dstack/_internal/core/backends/local/compute.py +1 -3
  18. dstack/_internal/core/backends/nebius/compute.py +10 -7
  19. dstack/_internal/core/backends/oci/compute.py +15 -8
  20. dstack/_internal/core/backends/oci/resources.py +8 -3
  21. dstack/_internal/core/backends/runpod/compute.py +15 -6
  22. dstack/_internal/core/backends/template/compute.py.jinja +3 -1
  23. dstack/_internal/core/backends/tensordock/compute.py +1 -3
  24. dstack/_internal/core/backends/tensordock/models.py +2 -0
  25. dstack/_internal/core/backends/vastai/compute.py +7 -3
  26. dstack/_internal/core/backends/vultr/compute.py +5 -5
  27. dstack/_internal/core/consts.py +2 -0
  28. dstack/_internal/core/models/projects.py +8 -0
  29. dstack/_internal/core/services/repos.py +101 -10
  30. dstack/_internal/server/background/tasks/process_instances.py +3 -2
  31. dstack/_internal/server/background/tasks/process_running_jobs.py +1 -1
  32. dstack/_internal/server/background/tasks/process_submitted_jobs.py +100 -47
  33. dstack/_internal/server/services/backends/__init__.py +1 -1
  34. dstack/_internal/server/services/projects.py +11 -3
  35. dstack/_internal/server/services/runs.py +2 -0
  36. dstack/_internal/server/statics/index.html +1 -1
  37. dstack/_internal/server/statics/main-56191fbfe77f49b251de.css +3 -0
  38. dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js → main-c51afa7f243e24d3e446.js} +61081 -49037
  39. dstack/_internal/server/statics/{main-a2a16772fbf11a14d191.js.map → main-c51afa7f243e24d3e446.js.map} +1 -1
  40. dstack/_internal/utils/ssh.py +22 -2
  41. dstack/version.py +2 -2
  42. {dstack-0.19.28.dist-info → dstack-0.19.30.dist-info}/METADATA +8 -6
  43. {dstack-0.19.28.dist-info → dstack-0.19.30.dist-info}/RECORD +46 -50
  44. dstack/_internal/core/backends/tensordock/__init__.py +0 -0
  45. dstack/_internal/core/backends/tensordock/api_client.py +0 -104
  46. dstack/_internal/core/backends/tensordock/backend.py +0 -16
  47. dstack/_internal/core/backends/tensordock/configurator.py +0 -74
  48. dstack/_internal/server/statics/main-5e0d56245c4bd241ec27.css +0 -3
  49. {dstack-0.19.28.dist-info → dstack-0.19.30.dist-info}/WHEEL +0 -0
  50. {dstack-0.19.28.dist-info → dstack-0.19.30.dist-info}/entry_points.txt +0 -0
  51. {dstack-0.19.28.dist-info → dstack-0.19.30.dist-info}/licenses/LICENSE.md +0 -0
@@ -50,8 +50,28 @@ def make_ssh_command_for_git(identity_file: PathLike) -> str:
50
50
  )
51
51
 
52
52
 
53
- def make_git_env(*, identity_file: Optional[PathLike] = None) -> dict[str, str]:
54
- env: dict[str, str] = {"GIT_TERMINAL_PROMPT": "0"}
53
+ def make_git_env(
54
+ *,
55
+ disable_prompt: bool = True,
56
+ disable_askpass: bool = False,
57
+ disable_config: bool = False,
58
+ identity_file: Optional[PathLike] = None,
59
+ ) -> dict[str, str]:
60
+ env: dict[str, str] = {}
61
+ if disable_prompt:
62
+ # Fail with error instead of prompting on the terminal (e.g., when asking for
63
+ # HTTP authentication)
64
+ env["GIT_TERMINAL_PROMPT"] = "0"
65
+ if disable_askpass:
66
+ env["GIT_ASKPASS"] = ""
67
+ env["SSH_ASKPASS"] = ""
68
+ if disable_config:
69
+ # Disable system-wide config (usually /etc/gitconfig)
70
+ env["GIT_CONFIG_SYSTEM"] = os.devnull
71
+ # Disable user (aka "global") config ($XDG_CONFIG_HOME/git/config or ~/.git/config)
72
+ env["GIT_CONFIG_GLOBAL"] = os.devnull
73
+ # Disable repo (aka "local") config (./.git/config)
74
+ env["GIT_DIR"] = os.devnull
55
75
  if identity_file is not None:
56
76
  env["GIT_SSH_COMMAND"] = make_ssh_command_for_git(identity_file)
57
77
  return env
dstack/version.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.19.28"
1
+ __version__ = "0.19.30"
2
2
  __is_release__ = True
3
- base_image = "0.10"
3
+ base_image = "0.11rc2"
4
4
  base_image_ubuntu_version = "22.04"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.28
3
+ Version: 0.19.30
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Project-URL: Homepage, https://dstack.ai
6
6
  Project-URL: Source, https://github.com/dstackai/dstack
@@ -331,24 +331,26 @@ Description-Content-Type: text/markdown
331
331
 
332
332
  </div>
333
333
 
334
- `dstack` is an open-source container orchestrator that simplifies workload orchestration and drives GPU utilization for ML teams. It works with any GPU cloud, on-prem cluster, or accelerated hardware.
334
+ `dstack` provides a unified control plane for running development, training, and inference on GPUs across cloud VMs, Kubernetes, or on-prem clusters. It helps your team avoid vendor lock-in and reduce GPU costs.
335
335
 
336
336
  #### Accelerators
337
337
 
338
338
  `dstack` supports `NVIDIA`, `AMD`, `Google TPU`, `Intel Gaudi`, and `Tenstorrent` accelerators out of the box.
339
339
 
340
340
  ## Latest news ✨
341
+ - [2025/09] [dstack 0.19.27: Offers UI, Digital Ocean and AMD Developer Cloud](https://github.com/dstackai/dstack/releases/tag/0.19.27)
342
+ - [2025/08] [dstack 0.19.26: Repos – explicit repo configuration via YAML](https://github.com/dstackai/dstack/releases/tag/0.19.26)
343
+ - [2025/08] [dstack 0.19.25: `dstack offer` CLI command](https://github.com/dstackai/dstack/releases/tag/0.19.25)
344
+ - [2025/08] [dstack 0.19.22: Service probes, GPU health-checks, Tenstorrent Galaxy, Secrets UI](https://github.com/dstackai/dstack/releases/tag/0.19.22)
345
+ - [2025/07] [dstack 0.19.21: Scheduled tasks](https://github.com/dstackai/dstack/releases/tag/0.19.21)
341
346
  - [2025/07] [dstack 0.19.17: Secrets, Files, Rolling deployment](https://github.com/dstackai/dstack/releases/tag/0.19.17)
342
347
  - [2025/06] [dstack 0.19.16: Docker in Docker, CloudRift](https://github.com/dstackai/dstack/releases/tag/0.19.16)
343
348
  - [2025/06] [dstack 0.19.13: InfiniBand support in default images](https://github.com/dstackai/dstack/releases/tag/0.19.13)
344
349
  - [2025/06] [dstack 0.19.12: Simplified use of MPI](https://github.com/dstackai/dstack/releases/tag/0.19.12)
345
- - [2025/05] [dstack 0.19.10: Priorities](https://github.com/dstackai/dstack/releases/tag/0.19.10)
346
- - [2025/05] [dstack 0.19.8: Nebius clusters, GH200 on Lambda](https://github.com/dstackai/dstack/releases/tag/0.19.8)
347
- - [2025/04] [dstack 0.19.6: Tenstorrent, Plugins](https://github.com/dstackai/dstack/releases/tag/0.19.6)
348
350
 
349
351
  ## How does it work?
350
352
 
351
- <img src="https://dstack.ai/static-assets/static-assets/images/dstack-architecture-diagram-v10.svg" width="750" />
353
+ <img src="https://dstack.ai/static-assets/static-assets/images/dstack-architecture-diagram-v11.svg" width="750" />
352
354
 
353
355
  ### Installation
354
356
 
@@ -1,10 +1,10 @@
1
1
  dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dstack/version.py,sha256=D7GukE1Gm51wYjN8H3JLGrFvyhMFAGdjhKN4kdBymDA,102
2
+ dstack/version.py,sha256=2A1fxFQ9n9Kcprebn6q6fi-3iIYieg8EN2ej5aCbbYs,105
3
3
  dstack/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  dstack/_internal/compat.py,sha256=bF9U9fTMfL8UVhCouedoUSTYFl7UAOiU0WXrnRoByxw,40
5
5
  dstack/_internal/settings.py,sha256=FYtd7tRk17Oc62Kl_3O8NuT5JHb8TKhLThl1TsfjjVs,1390
6
6
  dstack/_internal/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- dstack/_internal/cli/main.py,sha256=AZ4TB025U5wpQq3qH5sk9KkOYZCpxMIKqfaLH_Mv0DU,3876
7
+ dstack/_internal/cli/main.py,sha256=0QScKrDlNf0rHXVhSiprAKOMJxJbmlc6QKTRCZDpb0U,3920
8
8
  dstack/_internal/cli/commands/__init__.py,sha256=aZdSeBeL38BYl_kjkdTHNbsQZiFbpDAHxas01be9CG8,2269
9
9
  dstack/_internal/cli/commands/apply.py,sha256=py0ysrUSo8EbwzpHRS3d_vbO3ALxpDFQmscieSoKkjE,3725
10
10
  dstack/_internal/cli/commands/attach.py,sha256=75hojBqYRXj_65eQNvjypuyDy1G1HmajzOHSLe3pOIk,5148
@@ -31,7 +31,7 @@ dstack/_internal/cli/services/profile.py,sha256=TiNMP_0Xbx9cD22zc8dTHHNIsZeIpavW
31
31
  dstack/_internal/cli/services/repos.py,sha256=wvb3nHI9yJ0fb-dWf2yihl6zdG1ZRVpKiC0CUz9qL7Y,2100
32
32
  dstack/_internal/cli/services/configurators/__init__.py,sha256=AwbKV85_XH0V8IS8v2Zpgl8vnvVCLMLbMuPyvsZv3mQ,2971
33
33
  dstack/_internal/cli/services/configurators/base.py,sha256=9mabsRsKHY7xFl8yDRM__FOEQvtEYOn_4KeXKzO6-vA,3244
34
- dstack/_internal/cli/services/configurators/fleet.py,sha256=pPfQmXBdqXHy8QAxGm9yY3Y3vKis-vaKirLrCO84zQA,18827
34
+ dstack/_internal/cli/services/configurators/fleet.py,sha256=xchLFqHkm0zVs3tEVMlYXd4lGjP_OWzdp3nzqNg7b8k,19374
35
35
  dstack/_internal/cli/services/configurators/gateway.py,sha256=B2aEoVhhRZGk25OekR7BT4eAvAgZGAyVOw7DlSuo2jg,8755
36
36
  dstack/_internal/cli/services/configurators/run.py,sha256=lD14geWv8WtImrVDa5w9bXmA8JK8xIcTUawBTbbu6ZE,39543
37
37
  dstack/_internal/cli/services/configurators/volume.py,sha256=ZeESHttKFERBFysJvSGFC4UXUOLghKlzcilXbL48s-c,8346
@@ -39,14 +39,14 @@ dstack/_internal/cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
39
39
  dstack/_internal/cli/utils/common.py,sha256=xgq2Rdx6wGS1NLx8FlmkjKrGaNYD428oeBB4VMjvJ5c,3447
40
40
  dstack/_internal/cli/utils/fleet.py,sha256=qgyZnhKSsdx4nWVnzcU30vhwV7dtrwn8C0yNKMQ1H4g,4044
41
41
  dstack/_internal/cli/utils/gateway.py,sha256=qMYa1NTAT_O98x2_mSyWDRbiHj5fqt6xUXFh9NIUwAM,1502
42
- dstack/_internal/cli/utils/gpu.py,sha256=5LrOFo2bWSNZcyf_vCxhInT1AFYZLbPUvOqJgWP45vM,7688
42
+ dstack/_internal/cli/utils/gpu.py,sha256=sgkSZbK50i4MdVAP44b0Xg1QX631YBDOxi_8PCOQI_U,7667
43
43
  dstack/_internal/cli/utils/rich.py,sha256=Gx1MJU929kMKsbdo9qF7XHARNta2426Ssb-xMLVhwbQ,5710
44
44
  dstack/_internal/cli/utils/run.py,sha256=-hZI0q09qnTeUFJF5zkJ4v3NLS2y2mCDrYHjplZs8RA,11789
45
45
  dstack/_internal/cli/utils/secrets.py,sha256=c7an9e8HwB24oiP1q225G1dhWcvCKw4aZtN0rN38_PE,654
46
46
  dstack/_internal/cli/utils/updates.py,sha256=pGr5keEmHojnbY0ayjWL4GWTz4ParY6fP85tHpJ11pI,3043
47
47
  dstack/_internal/cli/utils/volume.py,sha256=mU9I06dVMFbpjfkefxrZNoSWadKLoib3U14rHudNQN4,1975
48
48
  dstack/_internal/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- dstack/_internal/core/consts.py,sha256=c1Yd5UY6Qx7KeuYgloXWncWhMsYj6TqwlElda7NtB98,254
49
+ dstack/_internal/core/consts.py,sha256=gN6AKBhvR-o6unEH66Kg3Sehqd06TO7uxunSvThvqzY,373
50
50
  dstack/_internal/core/errors.py,sha256=VTEmJ6C0zWL3fUL8ObRjB4rNL7_NxwEuWf0hZs6orWo,3377
51
51
  dstack/_internal/core/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  dstack/_internal/core/backends/configurators.py,sha256=Fy1FpiS_2aV8IWT1nkCb2CUI7fDVVRK-O2YFcHSpkTo,4573
@@ -59,39 +59,39 @@ dstack/_internal/core/backends/amddevcloud/configurator.py,sha256=WF4e-Yh2jMuTKQ
59
59
  dstack/_internal/core/backends/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  dstack/_internal/core/backends/aws/auth.py,sha256=BAe3HAedoAO42Fbv7YhpODKWlyil8M0PuRJsL-_u_kw,978
61
61
  dstack/_internal/core/backends/aws/backend.py,sha256=pjROH-S9pgrSMm-Eox_ocL7cTU6mIMRxvURq7Vi-2J8,876
62
- dstack/_internal/core/backends/aws/compute.py,sha256=Ztodgn_EkDcnVtJkPBduYmDXV8_gsANW9wJW3l2hd4E,44546
62
+ dstack/_internal/core/backends/aws/compute.py,sha256=wmeFCzgAfTZznpUOPlxAy4eGYhgVVixbqt2_q4RmQfU,45444
63
63
  dstack/_internal/core/backends/aws/configurator.py,sha256=X4CS-DnvsbdYCEVo6HBKLmH0YQ-zh5RucOjyhEcRca8,7634
64
64
  dstack/_internal/core/backends/aws/models.py,sha256=EUCHXHmZnshe3rwI9UtjilwcUMu1Z7MO4Y4-nlZ_IcA,4404
65
- dstack/_internal/core/backends/aws/resources.py,sha256=ccvdQd2H1DuUupdzMtqf86nkrenYPBJb1k3VgHu5Gp4,23610
65
+ dstack/_internal/core/backends/aws/resources.py,sha256=vwfy2lz9E0RVl3Lhs8dsuWMhhJOjv1NDckqSNucs7f0,24025
66
66
  dstack/_internal/core/backends/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  dstack/_internal/core/backends/azure/auth.py,sha256=CHp3QRNx3tIwkhyOY_l8WU-ElY4Pxhavoy9JSdwr15g,1259
68
68
  dstack/_internal/core/backends/azure/backend.py,sha256=XySTor8v_tLkZctDBryrFHrbVzQgNf_RUPkXQYplvwM,746
69
- dstack/_internal/core/backends/azure/compute.py,sha256=waunprBzpiJBMtVDJMjFCxEdmtO52E7ckzcc6OcZLf4,24488
69
+ dstack/_internal/core/backends/azure/compute.py,sha256=tuMYTAti3RU58ueBnfvznfc66k55aniNNzWBsXmFEz4,25372
70
70
  dstack/_internal/core/backends/azure/configurator.py,sha256=tKovBgMvyKmCogZ2OMxOJ-Sh_TCBqYXBvbBM-kgyeBI,18367
71
71
  dstack/_internal/core/backends/azure/models.py,sha256=ap0WsYBSFdDCxY0G3W1sg2DBN2k0xknz6bp8Ypf6phs,3356
72
72
  dstack/_internal/core/backends/azure/resources.py,sha256=cJWS2Yjxdg-XtjpdBxfVDZaX_gTbuoEpmdjTxdA9uIw,3431
73
73
  dstack/_internal/core/backends/azure/utils.py,sha256=taHMJq6UHRzUXLUcO2P5VCKy3wJaye2bG-6QdkEPNdY,1741
74
74
  dstack/_internal/core/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  dstack/_internal/core/backends/base/backend.py,sha256=hdFMHED1RMV9GVfLSU0yGhGE-cXlbLvt1coDA885PMM,505
76
- dstack/_internal/core/backends/base/compute.py,sha256=3x--AsQYD63n_KtNJa1TkdRdTw8t3thaZKhfnL0hq9g,30581
76
+ dstack/_internal/core/backends/base/compute.py,sha256=XsyNrbTvHb8_DKDnM--mTiLXqOQW0pIdn3Ug-afRcP4,34358
77
77
  dstack/_internal/core/backends/base/configurator.py,sha256=TKG5iJlOXxVT2agE_ruMW8JGt2dtwXY7ghmJN8bEWlw,4299
78
78
  dstack/_internal/core/backends/base/models.py,sha256=Ij0osOl-T-ABsKLoVg2eY81DMkwdWkevAnjXj2QnLXI,532
79
- dstack/_internal/core/backends/base/offers.py,sha256=IlK1X7Rz3piKeUJNsIjyqrj68k4PlWsC-5e76i9NjYg,6305
79
+ dstack/_internal/core/backends/base/offers.py,sha256=1688KlzBWgQWJFAEQMtqOud4Z8CwpvufNolX1zm1UTI,7487
80
80
  dstack/_internal/core/backends/cloudrift/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  dstack/_internal/core/backends/cloudrift/api_client.py,sha256=mI3_ttwujfSunTiTIelnc1XaLBlfxsKsacrlyB12f8c,8178
82
82
  dstack/_internal/core/backends/cloudrift/backend.py,sha256=Jz3nIQsa3TnMISVXK6EU43O0B7FgIMxwwaEBmd_s5BY,596
83
- dstack/_internal/core/backends/cloudrift/compute.py,sha256=fmCaUliSRKDjAPT8YFwX-7xSk0eMnxryFsDBFBcS7VQ,5141
83
+ dstack/_internal/core/backends/cloudrift/compute.py,sha256=NoMreAUiYK8Pg0g0QrsIpz0ojTzgVlNMiSM1vUcvDRY,5063
84
84
  dstack/_internal/core/backends/cloudrift/configurator.py,sha256=ZchmFjn49QDz7If-tbC1kFQeDvBbu6CiZJGESyt6tGE,2492
85
85
  dstack/_internal/core/backends/cloudrift/models.py,sha256=tFpcG68OghznpzmspjdnlVEWY_GDvFPt_d41p9ceLrk,1119
86
86
  dstack/_internal/core/backends/cudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  dstack/_internal/core/backends/cudo/api_client.py,sha256=ygq1Gx7ZvwKaifdXtvzDSw4xR4ZH6UWd5J47BjuaGh0,3685
88
88
  dstack/_internal/core/backends/cudo/backend.py,sha256=i13YoAkUfIStc3Yyyt_3YmL30eVrKtrhwnE9_B1iBRI,546
89
- dstack/_internal/core/backends/cudo/compute.py,sha256=XlhBQ02TB5Co3IKXcrKqko0YodZWFSTOLlg0LQmLNzI,6680
89
+ dstack/_internal/core/backends/cudo/compute.py,sha256=S5VYgwEvLQrAmqVcnPmWnYerSc2lC4RAnS9vE_z7bZ0,6753
90
90
  dstack/_internal/core/backends/cudo/configurator.py,sha256=3wAegbWDI2DcWD_225PNSQEnT9FPpDIKrJQLlY8hMu0,2193
91
91
  dstack/_internal/core/backends/cudo/models.py,sha256=6sfEqY2hvTpIACkyT4mhD3D8K5TsW_pupys9nqtrgoI,1055
92
92
  dstack/_internal/core/backends/datacrunch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  dstack/_internal/core/backends/datacrunch/backend.py,sha256=-wanJJ_K_wOXezxTSRgsK1MjsOuCl0MoVJREPj3SgM8,606
94
- dstack/_internal/core/backends/datacrunch/compute.py,sha256=i06kApZD9-cRRE4ZEDfvqcFM2944tOMseyPC-Vx2vBc,9159
94
+ dstack/_internal/core/backends/datacrunch/compute.py,sha256=uQTJfDdvNnpiS_BwaQxgiTtAVbNyBxifwOC9A1CMNhg,9367
95
95
  dstack/_internal/core/backends/datacrunch/configurator.py,sha256=9eG3p9LIp5M45T7WH60q8YwH9cNlzz5l_DSRcugO45I,2564
96
96
  dstack/_internal/core/backends/datacrunch/models.py,sha256=QeadH8qmcK3oDY9DfQKmX65fDGQo6FABLQAe9wQsHr8,1194
97
97
  dstack/_internal/core/backends/digitalocean/__init__.py,sha256=BPjTlv6iNDgu2mcsaIh0FEi9T8iwCEEIVbJQYJAa0gY,34
@@ -101,7 +101,7 @@ dstack/_internal/core/backends/digitalocean/configurator.py,sha256=_4Tiei4ejehHd
101
101
  dstack/_internal/core/backends/digitalocean_base/__init__.py,sha256=-7saeWMuPLmclPKi3VT-H5lwALbO9AABcaL248npyBc,84
102
102
  dstack/_internal/core/backends/digitalocean_base/api_client.py,sha256=-QBAOs-Qj1E_4q3uM7oKPxsN86c-quwiZNqqYbTcs8I,3834
103
103
  dstack/_internal/core/backends/digitalocean_base/backend.py,sha256=1xjjveUldj98sg8ELKAbf48a1KDm9DLh8-ymMvhWKXk,115
104
- dstack/_internal/core/backends/digitalocean_base/compute.py,sha256=gD1AszHcAE-EUxMN3gu9IqevAzFXscvZ9UAt0qB68J0,6970
104
+ dstack/_internal/core/backends/digitalocean_base/compute.py,sha256=2hEeOg6OEYq73rBIhN0XamdOfkhmYZmjJgEay-Zlcdc,6944
105
105
  dstack/_internal/core/backends/digitalocean_base/configurator.py,sha256=piXOi4jtUprESLkHE_hSeo1ndxe-3pI5aYDPicNbyAQ,2141
106
106
  dstack/_internal/core/backends/digitalocean_base/models.py,sha256=oyVnr_xaneudGeogfCr0BLZ22kzubUmGaNE5V8FI-6U,1334
107
107
  dstack/_internal/core/backends/dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -109,7 +109,7 @@ dstack/_internal/core/backends/dstack/models.py,sha256=Jbe0Syez43N5i97TlIc8l-5Vn
109
109
  dstack/_internal/core/backends/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  dstack/_internal/core/backends/gcp/auth.py,sha256=VWCn34hapaZ3E0OHCoiAVL97o3s64RF9w85CZ6xdtmk,2235
111
111
  dstack/_internal/core/backends/gcp/backend.py,sha256=OvTv1c7j4LTPCIEtkwD3-q6Eo1QET8xlM8CzbY0hLmI,572
112
- dstack/_internal/core/backends/gcp/compute.py,sha256=arHF6BcMDpGNdA1OadfeKoEYJ6kliX_kV0rz4vSVJwA,43030
112
+ dstack/_internal/core/backends/gcp/compute.py,sha256=0OByUucYMMzhLTvohvsVRV98fB8SOXmkBoPYG-NN0IU,43724
113
113
  dstack/_internal/core/backends/gcp/configurator.py,sha256=eVPr6pD4g66ej5qxhFd94lb_R11CIBA-py9PQS9EOGE,6865
114
114
  dstack/_internal/core/backends/gcp/models.py,sha256=biLA3rlFcoPatAZpKycuIl-8PdnNSAFiDCJjov65_zo,4612
115
115
  dstack/_internal/core/backends/gcp/resources.py,sha256=2jpg24NH4Ov4J4Of1F3DPkwEWkRxEi-x4ZTx8XSNGIQ,16926
@@ -118,27 +118,27 @@ dstack/_internal/core/backends/gcp/features/tcpx.py,sha256=8bDR5kwF5qke5EWNdBscd
118
118
  dstack/_internal/core/backends/hotaisle/__init__.py,sha256=CYMaS1jd9Km0Y6Jvg4ePjYOtfqL9swGsRo5kcXGFrFQ,30
119
119
  dstack/_internal/core/backends/hotaisle/api_client.py,sha256=Fd1TOg4_orwQyJtoZ657zJweLeBhzj_9ObfL538S5uI,3640
120
120
  dstack/_internal/core/backends/hotaisle/backend.py,sha256=o0cqLIKGcrXhvksHHGvjCpLShoQxT2IKdJy9sm0H9gE,586
121
- dstack/_internal/core/backends/hotaisle/compute.py,sha256=vZnaw3CuO8wMlrZvXrDfyGnzqNAuGH-K9GEL3lV5pUo,7511
121
+ dstack/_internal/core/backends/hotaisle/compute.py,sha256=uMiz6UEa5bd03RWFb8bH82CV4tphO5v2Ly5F2LsIsEg,7483
122
122
  dstack/_internal/core/backends/hotaisle/configurator.py,sha256=EJwdKFfC0ab0pe4lzeV65b80Ok21rR0OfupOmuqCp6c,2287
123
123
  dstack/_internal/core/backends/hotaisle/models.py,sha256=CmJ20SbpKzFldX7rrR0CpVytSJSN2YWKQ3Ixnta_A1M,1334
124
124
  dstack/_internal/core/backends/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  dstack/_internal/core/backends/kubernetes/backend.py,sha256=Jy0_Nwn6Oro8McJIo_QeNxxq4Pmwsd7JPd5_YE8Fz9U,606
126
- dstack/_internal/core/backends/kubernetes/compute.py,sha256=hFQkElNHRi4DBoyLJAYXuhCV4bJi0HjzbMGtrsKrMr0,23037
126
+ dstack/_internal/core/backends/kubernetes/compute.py,sha256=pc5FK1wmY8XRpupFZIpOkzLf4BtWJ8XEHkzYYFmmFPY,23132
127
127
  dstack/_internal/core/backends/kubernetes/configurator.py,sha256=RK8_eznv1AFrcG3fM-KIxyolsaJ8UTBAO7c3P3RCBnw,2228
128
128
  dstack/_internal/core/backends/kubernetes/models.py,sha256=YITTXi8f1-0FQ7qlC3nDV46m48w88bIiZ_weQJ9bQXU,2577
129
129
  dstack/_internal/core/backends/kubernetes/utils.py,sha256=k0cmjqMoNfJ_pAe6W82exV4AywMcpZ5jf0QICVbVuFY,1218
130
130
  dstack/_internal/core/backends/lambdalabs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  dstack/_internal/core/backends/lambdalabs/api_client.py,sha256=WaBO7VrPB4kbMQJDxjFxx0HEtAoSncQvH-cahWnVxx4,2688
132
132
  dstack/_internal/core/backends/lambdalabs/backend.py,sha256=zVU_M2EBbP-9-snmh64GTKeYAX84-g5kwrZ9d7xETzs,610
133
- dstack/_internal/core/backends/lambdalabs/compute.py,sha256=BctxiSr2DJ_WwmoYZGm7mUBTw0-TSA3l8YyxvVUWrv4,8184
133
+ dstack/_internal/core/backends/lambdalabs/compute.py,sha256=k9aTZVd7E_RLfF6vXvEIN1w87ghCGTgoROeuUHMJr-Q,8158
134
134
  dstack/_internal/core/backends/lambdalabs/configurator.py,sha256=JL6n0nM42diqVyI1w-8uUY3WgQCbLouurZ4yA8QD69w,2276
135
135
  dstack/_internal/core/backends/lambdalabs/models.py,sha256=c9dAYd0wjun2dvMLUZO4D09XvEskBRehjLDN_nwbSEU,1036
136
136
  dstack/_internal/core/backends/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  dstack/_internal/core/backends/local/backend.py,sha256=KJuNXUXrg60NhLywnExD1EXH2gK0TL-kzNWUPRNZ_Zg,427
138
- dstack/_internal/core/backends/local/compute.py,sha256=-FUD8Ii5VTBtygAV1U3k1j10MFdK1whGvrSeRwTk29Y,3788
138
+ dstack/_internal/core/backends/local/compute.py,sha256=M5xCk7Yav_u6OtZUzLfmw36RfNwzl1SCs-I7mWYiyPY,3757
139
139
  dstack/_internal/core/backends/nebius/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  dstack/_internal/core/backends/nebius/backend.py,sha256=2XqZIbSR8VzlfOnuVklXlDxNmwAkQj7txQN8VXF1j2E,566
141
- dstack/_internal/core/backends/nebius/compute.py,sha256=UcYIfaqp0-keMuGhARcL82bQK_VXEMigsveW_LbD6Ds,14645
141
+ dstack/_internal/core/backends/nebius/compute.py,sha256=9r0m0yqefZbnT9iP-9VtWCJNcNalk9Kut1KBy3OWEy0,14852
142
142
  dstack/_internal/core/backends/nebius/configurator.py,sha256=PilZ5M0xj-koYz9PPew9L29rrHoF2JrW2bxgCqt27u4,3213
143
143
  dstack/_internal/core/backends/nebius/fabrics.py,sha256=-X-nSPV2pUin2PAYDHGm-j14KPboIFRpLi93PKHUXTM,1616
144
144
  dstack/_internal/core/backends/nebius/models.py,sha256=UudYX32p-ZY-GWR83VEtY5dpZBaWhKXQIfn2nrBCq-4,4245
@@ -146,39 +146,35 @@ dstack/_internal/core/backends/nebius/resources.py,sha256=ttgwdqokvXF8BH_IDPFZxW
146
146
  dstack/_internal/core/backends/oci/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  dstack/_internal/core/backends/oci/auth.py,sha256=8Cr18y_LOsyRP-16yfFpT70Cofpm0clB3KawS_7aRl4,717
148
148
  dstack/_internal/core/backends/oci/backend.py,sha256=yXjVCt7n6BVLH0byYFbNFf-P9J0FwlNfxsYbKGMdoI4,536
149
- dstack/_internal/core/backends/oci/compute.py,sha256=-1UyAcsJ7PG980zKGZBg9dYVi_hZrvNWxRh-YGjKas4,7398
149
+ dstack/_internal/core/backends/oci/compute.py,sha256=njttE6pwrSq5itqUmpzfKjl1NFQ4Qgr5SAOMO4gEu_c,7733
150
150
  dstack/_internal/core/backends/oci/configurator.py,sha256=_mi093BzV8Xdfw81wkiqoY5d5x4CCCtni7J01CZeDCQ,5768
151
151
  dstack/_internal/core/backends/oci/exceptions.py,sha256=GxlUf7itcAQgY3m-U2ul_ZXzfUOcEcPEmisWFaoWSkA,288
152
152
  dstack/_internal/core/backends/oci/models.py,sha256=fDlY7-A0WDQeiwJzwrQl6D5ENOc-677Bz8LXyvBvF0c,2969
153
153
  dstack/_internal/core/backends/oci/region.py,sha256=a41dmlv-7jh2vP2z-0wnf0Yzdh2Donjm9aXuMgFXXKo,2935
154
- dstack/_internal/core/backends/oci/resources.py,sha256=VfTDuVTEO8MUvD3i2DFoe2du1qP4MSQb1yEaDgHbUp8,28982
154
+ dstack/_internal/core/backends/oci/resources.py,sha256=-47u2vWvRnpNQmgz3A12vu1hSIQ-dqawDl5ndyF0nwY,29392
155
155
  dstack/_internal/core/backends/runpod/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
156
  dstack/_internal/core/backends/runpod/api_client.py,sha256=Oet7CwQTu3sE57unqh-JvuMCBDEDPruAbGB4GyM0dM4,13427
157
157
  dstack/_internal/core/backends/runpod/backend.py,sha256=GcLbySsGY29ZGHXSqTXCxUUoTK9pxVScKly0_fkNr8c,566
158
- dstack/_internal/core/backends/runpod/compute.py,sha256=yPu7P5vpt2hoGoBfZAMDj-XCkluy0sCVMVxVhu8zllE,10559
158
+ dstack/_internal/core/backends/runpod/compute.py,sha256=ryPUmZ50-iiYHxSvSexs1p3eJFzltrJqNksF4VYMrZo,11056
159
159
  dstack/_internal/core/backends/runpod/configurator.py,sha256=ZcDKN5ulmFMjSy9TlnV-2qxqPwTZUpIwfVwtShZL5fU,2242
160
160
  dstack/_internal/core/backends/runpod/models.py,sha256=W3nO4sjvvWtfKYDZDVJ8oBSsgeGdSR-Z_PD7OpfDBgY,1466
161
161
  dstack/_internal/core/backends/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
162
  dstack/_internal/core/backends/template/backend.py.jinja,sha256=jqSUr05lKHSuGq2MCk4tHob1TfGiSSsHox1GuEz30zU,704
163
- dstack/_internal/core/backends/template/compute.py.jinja,sha256=jLFZ_EMEjlgu6y3VJtvXs4qNXZmytZhl5JzJVM04lIc,3319
163
+ dstack/_internal/core/backends/template/compute.py.jinja,sha256=kJDJztC4VA-2tp9HdMwNn-8OpwChmhdtNmIZSmzrWwU,3368
164
164
  dstack/_internal/core/backends/template/configurator.py.jinja,sha256=OeEjI36hpH62FdSm7tGDMuOwuRpnE6u5VmyeGmNJdgk,2665
165
165
  dstack/_internal/core/backends/template/models.py.jinja,sha256=dhJd8uWoMvAHAsPpDMPNtdMKzJTIoXDtsGC0NCQ3Y08,2061
166
- dstack/_internal/core/backends/tensordock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- dstack/_internal/core/backends/tensordock/api_client.py,sha256=NUEKgu6JY6kqQXRqsghT-aBf7sNstHQo7J1WmqL-Qfs,3872
168
- dstack/_internal/core/backends/tensordock/backend.py,sha256=KT5bRuD3KttEqiNNqQpW5f6nX7Qez-L74TBmYKy3puI,606
169
- dstack/_internal/core/backends/tensordock/compute.py,sha256=GnW8eAeJXYU11_ukX9lBznbYaOQssBH6RltMOX6UYSU,4528
170
- dstack/_internal/core/backends/tensordock/configurator.py,sha256=SlYFcdzgQ09-BJH7FdZFaJ1HWFmMbZzciTkmiQMcaks,2649
171
- dstack/_internal/core/backends/tensordock/models.py,sha256=oxbSWRCsD0_j4-2lQYo4LpmhKL8Kgv2nmq_dfMaSCiU,1182
166
+ dstack/_internal/core/backends/tensordock/compute.py,sha256=yLV9lAYARlrKninbVJ7eoqbfSd8g6lvraQ-j9WiHZRQ,4497
167
+ dstack/_internal/core/backends/tensordock/models.py,sha256=Dov-XsJcgOWML8c_jPpzo47y3wGQkxk3o-hTaZfYrPE,1250
172
168
  dstack/_internal/core/backends/vastai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
169
  dstack/_internal/core/backends/vastai/api_client.py,sha256=b-qgx352lnxhBXichJtURFGxR7Jd9JYx4WXaxYV-HH0,4940
174
170
  dstack/_internal/core/backends/vastai/backend.py,sha256=NawGHNYVmgNwL8HruEA84rimnpeSyXccdJXr6Dr95UY,566
175
- dstack/_internal/core/backends/vastai/compute.py,sha256=ZjeJF196lXTjO5gQ8fnQtvNEVZdYpcVODmZOOV3g96Q,4911
171
+ dstack/_internal/core/backends/vastai/compute.py,sha256=X4nkJUCGB55W2FvqKpQcIPV73s22xviDSBREd4LmPCI,4991
176
172
  dstack/_internal/core/backends/vastai/configurator.py,sha256=rFeUdlGiBw8PsB_zgBLm-p2pzHdyN8cSATHFLzeKhrg,2408
177
173
  dstack/_internal/core/backends/vastai/models.py,sha256=2xpFE-ouYUBienxZXam2Mo4dy9enSv-FuVJXeYnjVLk,1036
178
174
  dstack/_internal/core/backends/vultr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
175
  dstack/_internal/core/backends/vultr/api_client.py,sha256=isHbdBQr2hFRYTcnTsGxSlWIKYrpC1X_gjSZjGxUupE,4363
180
176
  dstack/_internal/core/backends/vultr/backend.py,sha256=WkPmbUxm3Ysv3_wJjuktQqvvN_L_TX5g37CflGQWQFo,556
181
- dstack/_internal/core/backends/vultr/compute.py,sha256=9qfya_TKMvvWyWm2OElQjMIFwANaFcEkyc_gHj5XNVA,5845
177
+ dstack/_internal/core/backends/vultr/compute.py,sha256=7YUgbHOBInSVeYOVW5GtCkv5z2bbq1pk9TmY7D4bXYI,5850
182
178
  dstack/_internal/core/backends/vultr/configurator.py,sha256=JMJ9itCGIRb4MJ8fjS6syd7xrO7wUra2OVoqLTrGRo4,2373
183
179
  dstack/_internal/core/backends/vultr/models.py,sha256=TkqK_lW6w5k_7wsoFiKDb6NXuTrHL6ypVm59FoyaSFY,928
184
180
  dstack/_internal/core/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -202,7 +198,7 @@ dstack/_internal/core/models/logs.py,sha256=VOsgEsvUIRNNHivD6OZnPZNC52ioqafv7ccd
202
198
  dstack/_internal/core/models/metrics.py,sha256=Xb8hCXUL-ncQ3PMsErIUAJTe9gwh5jyrQ4UQoZbibsc,269
203
199
  dstack/_internal/core/models/placement.py,sha256=WJVq5ENJykyRarQzL2EeYQag_9_jV7VSAtR_xoFvPVM,720
204
200
  dstack/_internal/core/models/profiles.py,sha256=_ZxSk-rMvzpiUYUZD0EQbrJDy3FVmRUmIUtEgzlVeHo,14217
205
- dstack/_internal/core/models/projects.py,sha256=HmmlrvUSSEjfGfX7X5tmGJ-CbKeyGK6shHD5OghDNks,671
201
+ dstack/_internal/core/models/projects.py,sha256=hOZoL85q-873vT_Aw7FhzpS6DGVt0Y3yT8kpElrLFto,833
206
202
  dstack/_internal/core/models/resources.py,sha256=-dLupzud5BSqxNABBjLVYTCKekbr9_mhaNGD1ZWBjgM,14544
207
203
  dstack/_internal/core/models/runs.py,sha256=ehGSyCSx5OAaEqCEd2YvCRiP_uewUeDOHbJGSocu6w0,22609
208
204
  dstack/_internal/core/models/secrets.py,sha256=5T4B4eCeZmVQ8t22qYYlm4NUyX7VloiXCJuyDfE92QA,413
@@ -223,7 +219,7 @@ dstack/_internal/core/services/api_client.py,sha256=HTQ0fcZciUh-nmfV09hUt__Z4N2z
223
219
  dstack/_internal/core/services/diff.py,sha256=xtJzlSLIw9pnECpMQTy-a2zcfnSd4Q9qi_Y0W00D65A,2073
224
220
  dstack/_internal/core/services/logs.py,sha256=7_eJdH4MD-3rVb4A6rIJfjj_p4jzUOCmjRVlPD-UDsg,2166
225
221
  dstack/_internal/core/services/profiles.py,sha256=ZFY6VILW6urm6l3u6xpORJ2z48eGJ2jcmRgjVrxr2tw,1612
226
- dstack/_internal/core/services/repos.py,sha256=Cq-t9RvdmEKjQIgQA6giQirqopdrPT-WzUoCoKLt0ws,6251
222
+ dstack/_internal/core/services/repos.py,sha256=Lw-4MXFBaE_BogRgtYra1H3KPkRGeVWoIfU8hTyJ7GM,10552
227
223
  dstack/_internal/core/services/configs/__init__.py,sha256=jMAHvZphEgZJldEiQhkaNSW8lVrVAxuYbu9RtLysUGU,5645
228
224
  dstack/_internal/core/services/ssh/__init__.py,sha256=UhgC3Lv3CPSGqSPEQZIKOfLKUlCFnaB0uqPQhfKCFt0,878
229
225
  dstack/_internal/core/services/ssh/attach.py,sha256=6YZ_HaimKrjdLzcDLksGi0_9rlVyLeBgPmmWHC7dYxo,9096
@@ -296,14 +292,14 @@ dstack/_internal/server/background/tasks/common.py,sha256=N7xSXbf2MoBWgbJ1e3AEzY
296
292
  dstack/_internal/server/background/tasks/process_fleets.py,sha256=b0wECmweaetFv9vSjE1BiOJmlIPlk7O-fmntpdSiWgg,8590
297
293
  dstack/_internal/server/background/tasks/process_gateways.py,sha256=FH9RY3Tfmtw_UctCdYZDIRb2rgtmHdxTg6Oc4IBiDBA,8356
298
294
  dstack/_internal/server/background/tasks/process_idle_volumes.py,sha256=mqnl8wvWaKTYvJMbgFJbOP-bZMRQG2vrhUnaNcyBldE,5223
299
- dstack/_internal/server/background/tasks/process_instances.py,sha256=ddBR_r7VwOuDb4zlp9QSQWgoK4XvOi4IGh0dBZkxtUY,44004
295
+ dstack/_internal/server/background/tasks/process_instances.py,sha256=5xYWqcxNnsZ4ZgGRE1m894N6BgsSMNRL49sg6Wc_zGI,44067
300
296
  dstack/_internal/server/background/tasks/process_metrics.py,sha256=yKXe9J7m3oleK0C-oGJaYNkcPT8kqkz0nw-A7xqYbjE,6390
301
297
  dstack/_internal/server/background/tasks/process_placement_groups.py,sha256=lgYIzjHG9EITK31yG6uQjlIcSwW5jsP9ZOBBZqW_eNs,4263
302
298
  dstack/_internal/server/background/tasks/process_probes.py,sha256=dmug-_rmYiVLLF-imto-Ju1gPtENvHvCjHyilqgYuJw,6457
303
299
  dstack/_internal/server/background/tasks/process_prometheus_metrics.py,sha256=_UZm37FVV4rhdd0So7HtcKbIgrSdAr5Vx-Uen_xizec,5459
304
- dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=ulDrWgwnhosbK0Mtt0yNS4E38QSKXSh6ermNt-3jUTs,44965
300
+ dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=IoQi7mm4upEZgujTkWYrXDKrC5rSZ5Q4_jAR4OpajaM,44973
305
301
  dstack/_internal/server/background/tasks/process_runs.py,sha256=Cx7Z1B7pZVlvCl-OsIaAiIMFG_aZDdn3nlZeha6k2x4,25041
306
- dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=jSyJBfuNhfBGWrKlTSO19nOpYq018MSKemUhn2q73dY,39001
302
+ dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=XxPapMdCsuA_H_X27SIwIZFd0Y5jzwvIABnhqa-kwyQ,41098
307
303
  dstack/_internal/server/background/tasks/process_terminating_jobs.py,sha256=S7ZSDVMX-N0XMaMgwFa1QG_RAi48BP432s9AqHw4PMM,4066
308
304
  dstack/_internal/server/background/tasks/process_volumes.py,sha256=_fMmkwLYsyX-kpW9pDrZVJvFTZEOPp0gpjyKBMW-zw0,5204
309
305
  dstack/_internal/server/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -442,15 +438,15 @@ dstack/_internal/server/services/permissions.py,sha256=l7Ngdelmn65vjw13NcOdaC6lB
442
438
  dstack/_internal/server/services/placement.py,sha256=U-7z4kJ6ZyrCXzkDychWoOhniz19ooFwiNI2InoTLls,2420
443
439
  dstack/_internal/server/services/plugins.py,sha256=aOlqfTUiU2aZ5G4DUW2rY4959PqS2r9imo5pfU3NUww,3851
444
440
  dstack/_internal/server/services/probes.py,sha256=pdgtkOvBuvneUo4Gysg8_afibTf1wuWnrrcuAnOGBE0,357
445
- dstack/_internal/server/services/projects.py,sha256=P9dKbhFvWZoXr8bOSIsxE9NVSdaoIVXqcNC-0I_8N5w,25144
441
+ dstack/_internal/server/services/projects.py,sha256=PZdMCi1PVu68c_rYfwJRk7hgM6ddkekxlG_IU_957QI,25276
446
442
  dstack/_internal/server/services/repos.py,sha256=ECl1cbpdzhTv1P3Y9IQmoWyHHF8iXFyL4s2drfwRDvg,9352
447
443
  dstack/_internal/server/services/resources.py,sha256=VRFOih_cMJdc0c2m9nSGsX8vWAJQV3M6N87aqS_JXfw,699
448
- dstack/_internal/server/services/runs.py,sha256=-RoBSmcau8n_8rvEH-yuORL7R9OaoO92VkLFFZOwcAk,47686
444
+ dstack/_internal/server/services/runs.py,sha256=cZPyGTR7_7l88XAbqXep-P7xcGOCHZhLrIj9ua4z1Bs,47818
449
445
  dstack/_internal/server/services/secrets.py,sha256=M7RS4X1-DIL0f7m6BBb3PhsrAbxwKUD3_pZEWRfR3sM,5567
450
446
  dstack/_internal/server/services/ssh.py,sha256=DT7U_8ON8o30-53WlJwjd5kVrKyt4KPgKeN63NW3P8U,2883
451
447
  dstack/_internal/server/services/users.py,sha256=L-COF4RjtwYSfnkGQefrSiEU0haTv0o1P2OuUdvMK8E,7378
452
448
  dstack/_internal/server/services/volumes.py,sha256=DBGIUsysAO7sQ6vb4mjhzO9XLdyQvtNujucxhGnkSsU,16682
453
- dstack/_internal/server/services/backends/__init__.py,sha256=dyUBoM39lijFTqrKwBn7Vms9NtTgr4Pz8rpLuXqzft8,13427
449
+ dstack/_internal/server/services/backends/__init__.py,sha256=xWHI-A24u9RE7H5I4A3e_JQyuQtp5pdKbU--ZyizrnU,13420
454
450
  dstack/_internal/server/services/backends/handlers.py,sha256=Rz4QjqmmDGDzn6QbwxlJvV5oC6pE4PZN3FX0DVqnBHc,3539
455
451
  dstack/_internal/server/services/encryption/__init__.py,sha256=3kCw_cxC3-Un1OIofdW5Gqsm0ZCXXTlGz09cULBx_uc,3155
456
452
  dstack/_internal/server/services/encryption/keys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -524,11 +520,11 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
524
520
  dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
525
521
  dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
526
522
  dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
527
- dstack/_internal/server/statics/index.html,sha256=2niufKXG9irloxCS8quNIuyNl7Iu7gDexROEBo9oKWY,11155
523
+ dstack/_internal/server/statics/index.html,sha256=zv7wlS5mh2aAps7sEhXTlCwp0UOsiqhsMiIEOhLxt2Q,11155
528
524
  dstack/_internal/server/statics/logo-notext.svg,sha256=Oth7XfcAeDJcaPdzNtDaqYuLU7mCB0JqNtxeyWb6Z3c,11231
529
- dstack/_internal/server/statics/main-5e0d56245c4bd241ec27.css,sha256=DO6ju9AdKMsJOdO7an3B-UtNs8OKSf0mmAKtqfVL3EM,1369554
530
- dstack/_internal/server/statics/main-a2a16772fbf11a14d191.js,sha256=TPgf5tj-jnrdDf1kq_868IG-4GBSfPmaOD4UkKs_8_U,6443886
531
- dstack/_internal/server/statics/main-a2a16772fbf11a14d191.js.map,sha256=_3RjtLU7gqrqgC4Qku77eJ6PFfHczv5dpYNcQ-a1krg,8561506
525
+ dstack/_internal/server/statics/main-56191fbfe77f49b251de.css,sha256=1exsufAv8oyw_4fbdcDJ7CtyRdWFyf-Boxua8HiK81c,1456319
526
+ dstack/_internal/server/statics/main-c51afa7f243e24d3e446.js,sha256=StRTIpOyv0Wt1fPh6XtuUiRQx5dRsDsXDNrNCbp1PPg,6928035
527
+ dstack/_internal/server/statics/main-c51afa7f243e24d3e446.js.map,sha256=gKw2zgeA1icax9QkCOX5jfYFPGe60omyZDRZCrdPtgo,9190078
532
528
  dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
533
529
  dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
534
530
  dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
@@ -632,7 +628,7 @@ dstack/_internal/utils/nested_list.py,sha256=ba4fmMuaz807Bf6KRve-9_8zm4dxlNMQiFb
632
628
  dstack/_internal/utils/network.py,sha256=vvIQulBapL6Zw50jsit7sNNbGJVKTzooqWhkVWqaAzQ,1488
633
629
  dstack/_internal/utils/path.py,sha256=FSKOBLDZdT64KJ-lqpRMoo6YzqR2jwCgdEmcodFQz-E,1342
634
630
  dstack/_internal/utils/random_names.py,sha256=lVyzAmXhaSf2bAuvRFQ_ihLy42in1ydN4gJYsMw4GG8,3537
635
- dstack/_internal/utils/ssh.py,sha256=FxOA85-NTYEGhnW_PL3-uVYGZbVZfyvcA8uvD7BcN2Q,12131
631
+ dstack/_internal/utils/ssh.py,sha256=SE10JKbnUyocoAhMs0dsLIUDOQmUtQGArZEUAFIXBPQ,12852
636
632
  dstack/_internal/utils/tags.py,sha256=Gx4aZM85E_UUCGuFZbCEFxHB5DNgrtJP15_1tFFEd1c,1292
637
633
  dstack/_internal/utils/typing.py,sha256=tHrhtkr3G6jkk-_FZyobdjLYvP5_YIgXbKsN-13dfvg,386
638
634
  dstack/api/__init__.py,sha256=7qbG42qEHMyNDFRCz9FgfuimAKws3hV8eMXs6oRgh5c,1607
@@ -666,8 +662,8 @@ dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
666
662
  dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
667
663
  dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
668
664
  dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=h3r3Yc3h22i93fifPTgTm9Oojd1sN1O4DP7ZTV-kWpM,5386
669
- dstack-0.19.28.dist-info/METADATA,sha256=4lRgfzF2eiWc4vPTkrgGMVDEfso6GWn4jIL9asF-e4E,20586
670
- dstack-0.19.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
671
- dstack-0.19.28.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
672
- dstack-0.19.28.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
673
- dstack-0.19.28.dist-info/RECORD,,
665
+ dstack-0.19.30.dist-info/METADATA,sha256=1Eek1ucesAzIWosGAWsdivcQu0_mV0FKW00DVi6R4nk,20919
666
+ dstack-0.19.30.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
667
+ dstack-0.19.30.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
668
+ dstack-0.19.30.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
669
+ dstack-0.19.30.dist-info/RECORD,,
File without changes
@@ -1,104 +0,0 @@
1
- import uuid
2
-
3
- import requests
4
- import yaml
5
-
6
- from dstack._internal.core.errors import BackendError
7
- from dstack._internal.core.models.instances import InstanceType
8
- from dstack._internal.utils.logging import get_logger
9
-
10
- logger = get_logger(__name__)
11
- REQUEST_TIMEOUT = 20
12
-
13
-
14
- class TensorDockAPIClient:
15
- def __init__(self, api_key: str, api_token: str):
16
- self.api_url = "https://marketplace.tensordock.com/api/v0".rstrip("/")
17
- self.api_key = api_key
18
- self.api_token = api_token
19
- self.s = requests.Session()
20
-
21
- def auth_test(self) -> bool:
22
- resp = self.s.post(
23
- self._url("/auth/test"),
24
- data={"api_key": self.api_key, "api_token": self.api_token},
25
- timeout=REQUEST_TIMEOUT,
26
- )
27
- resp.raise_for_status()
28
- return resp.json()["success"]
29
-
30
- def get_hostnode(self, hostnode_id: str) -> dict:
31
- logger.debug("Fetching hostnode %s", hostnode_id)
32
- resp = self.s.get(
33
- self._url(f"/client/deploy/hostnodes/{hostnode_id}"), timeout=REQUEST_TIMEOUT
34
- )
35
- resp.raise_for_status()
36
- data = resp.json()
37
- if not data["success"]:
38
- raise requests.HTTPError(data)
39
- return data["hostnode"]
40
-
41
- def deploy_single(self, instance_name: str, instance: InstanceType, cloudinit: dict) -> dict:
42
- hostnode = self.get_hostnode(instance.name)
43
- gpu = instance.resources.gpus[0]
44
- for gpu_model in hostnode["specs"]["gpu"].keys():
45
- if gpu_model.endswith(f"-{gpu.memory_mib // 1024}gb"):
46
- if gpu.name.lower() in gpu_model.lower():
47
- break
48
- else:
49
- raise ValueError(f"Can't find GPU on the hostnode: {gpu.name}")
50
- form = {
51
- "api_key": self.api_key,
52
- "api_token": self.api_token,
53
- "password": uuid.uuid4().hex, # we disable the password auth, but it's required
54
- "name": instance_name,
55
- "gpu_count": len(instance.resources.gpus),
56
- "gpu_model": gpu_model,
57
- "vcpus": instance.resources.cpus,
58
- "ram": instance.resources.memory_mib // 1024,
59
- "external_ports": "{%s}"
60
- % max(hostnode["networking"]["ports"]), # it's safer to use a higher port
61
- "internal_ports": "{22}",
62
- "hostnode": instance.name,
63
- "storage": round(instance.resources.disk.size_mib / 1024),
64
- "operating_system": "Ubuntu 22.04 LTS",
65
- "cloudinit_script": yaml.dump(cloudinit).replace("\n", "\\n"),
66
- }
67
- logger.debug(
68
- "Deploying instance hostnode=%s, cpus=%s, memory=%s, gpu=%sx %s",
69
- form["hostnode"],
70
- form["vcpus"],
71
- form["ram"],
72
- form["gpu_count"],
73
- form["gpu_model"],
74
- )
75
- resp = self.s.post(self._url("/client/deploy/single"), data=form, timeout=REQUEST_TIMEOUT)
76
- resp.raise_for_status()
77
- data = resp.json()
78
- if not data["success"]:
79
- raise requests.HTTPError(data)
80
- data["password"] = form["password"]
81
- return data
82
-
83
- def delete_single_if_exists(self, instance_id: str):
84
- logger.debug("Deleting instance %s", instance_id)
85
- resp = self.s.post(
86
- self._url("/client/delete/single"),
87
- data={
88
- "api_key": self.api_key,
89
- "api_token": self.api_token,
90
- "server": instance_id,
91
- },
92
- timeout=REQUEST_TIMEOUT,
93
- )
94
- try:
95
- data = resp.json()
96
- if "already terminated" in data.get("error", ""):
97
- return
98
- if not data.get("success"):
99
- raise BackendError(data)
100
- except ValueError: # json parsing error
101
- raise BackendError(resp.text)
102
-
103
- def _url(self, path):
104
- return f"{self.api_url}/{path.lstrip('/')}"
@@ -1,16 +0,0 @@
1
- from dstack._internal.core.backends.base.backend import Backend
2
- from dstack._internal.core.backends.tensordock.compute import TensorDockCompute
3
- from dstack._internal.core.backends.tensordock.models import TensorDockConfig
4
- from dstack._internal.core.models.backends.base import BackendType
5
-
6
-
7
- class TensorDockBackend(Backend):
8
- TYPE = BackendType.TENSORDOCK
9
- COMPUTE_CLASS = TensorDockCompute
10
-
11
- def __init__(self, config: TensorDockConfig):
12
- self.config = config
13
- self._compute = TensorDockCompute(self.config)
14
-
15
- def compute(self) -> TensorDockCompute:
16
- return self._compute
@@ -1,74 +0,0 @@
1
- import json
2
-
3
- from dstack._internal.core.backends.base.configurator import (
4
- BackendRecord,
5
- Configurator,
6
- raise_invalid_credentials_error,
7
- )
8
- from dstack._internal.core.backends.tensordock import api_client
9
- from dstack._internal.core.backends.tensordock.backend import TensorDockBackend
10
- from dstack._internal.core.backends.tensordock.models import (
11
- TensorDockBackendConfig,
12
- TensorDockBackendConfigWithCreds,
13
- TensorDockConfig,
14
- TensorDockCreds,
15
- TensorDockStoredConfig,
16
- )
17
- from dstack._internal.core.models.backends.base import (
18
- BackendType,
19
- )
20
-
21
- # TensorDock regions are dynamic, currently we don't offer any filtering
22
- REGIONS = []
23
-
24
-
25
- class TensorDockConfigurator(
26
- Configurator[
27
- TensorDockBackendConfig,
28
- TensorDockBackendConfigWithCreds,
29
- ]
30
- ):
31
- TYPE = BackendType.TENSORDOCK
32
- BACKEND_CLASS = TensorDockBackend
33
-
34
- def validate_config(
35
- self, config: TensorDockBackendConfigWithCreds, default_creds_enabled: bool
36
- ):
37
- self._validate_tensordock_creds(config.creds.api_key, config.creds.api_token)
38
-
39
- def create_backend(
40
- self, project_name: str, config: TensorDockBackendConfigWithCreds
41
- ) -> BackendRecord:
42
- if config.regions is None:
43
- config.regions = REGIONS
44
- return BackendRecord(
45
- config=TensorDockStoredConfig(
46
- **TensorDockBackendConfig.__response__.parse_obj(config).dict()
47
- ).json(),
48
- auth=TensorDockCreds.parse_obj(config.creds).json(),
49
- )
50
-
51
- def get_backend_config_with_creds(
52
- self, record: BackendRecord
53
- ) -> TensorDockBackendConfigWithCreds:
54
- config = self._get_config(record)
55
- return TensorDockBackendConfigWithCreds.__response__.parse_obj(config)
56
-
57
- def get_backend_config_without_creds(self, record: BackendRecord) -> TensorDockBackendConfig:
58
- config = self._get_config(record)
59
- return TensorDockBackendConfig.__response__.parse_obj(config)
60
-
61
- def get_backend(self, record: BackendRecord) -> TensorDockBackend:
62
- config = self._get_config(record)
63
- return TensorDockBackend(config=config)
64
-
65
- def _get_config(self, record: BackendRecord) -> TensorDockConfig:
66
- return TensorDockConfig.__response__(
67
- **json.loads(record.config),
68
- creds=TensorDockCreds.parse_raw(record.auth),
69
- )
70
-
71
- def _validate_tensordock_creds(self, api_key: str, api_token: str):
72
- client = api_client.TensorDockAPIClient(api_key=api_key, api_token=api_token)
73
- if not client.auth_test():
74
- raise_invalid_credentials_error(fields=[["creds", "api_key"], ["creds", "api_token"]])