dstack 0.19.11rc2__py3-none-any.whl → 0.19.12__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 (32) hide show
  1. dstack/_internal/cli/commands/offer.py +2 -0
  2. dstack/_internal/cli/services/configurators/run.py +43 -42
  3. dstack/_internal/cli/utils/run.py +10 -26
  4. dstack/_internal/core/backends/template/configurator.py.jinja +1 -6
  5. dstack/_internal/core/backends/template/models.py.jinja +4 -0
  6. dstack/_internal/core/models/configurations.py +1 -1
  7. dstack/_internal/core/models/fleets.py +6 -1
  8. dstack/_internal/core/models/profiles.py +43 -3
  9. dstack/_internal/core/models/repos/local.py +19 -13
  10. dstack/_internal/core/models/runs.py +78 -45
  11. dstack/_internal/server/background/tasks/process_running_jobs.py +47 -12
  12. dstack/_internal/server/background/tasks/process_runs.py +14 -1
  13. dstack/_internal/server/services/fleets.py +2 -2
  14. dstack/_internal/server/services/gateways/__init__.py +1 -1
  15. dstack/_internal/server/services/plugins.py +3 -2
  16. dstack/_internal/server/services/runner/client.py +4 -1
  17. dstack/_internal/server/services/runs.py +2 -2
  18. dstack/_internal/server/services/volumes.py +1 -1
  19. dstack/_internal/server/statics/index.html +1 -1
  20. dstack/_internal/server/statics/{main-5b9786c955b42bf93581.js → main-b0e80f8e26a168c129e9.js} +72 -25
  21. dstack/_internal/server/statics/{main-5b9786c955b42bf93581.js.map → main-b0e80f8e26a168c129e9.js.map} +1 -1
  22. dstack/_internal/server/testing/common.py +2 -1
  23. dstack/_internal/utils/common.py +4 -0
  24. dstack/api/server/_fleets.py +5 -1
  25. dstack/api/server/_runs.py +8 -0
  26. dstack/version.py +1 -1
  27. {dstack-0.19.11rc2.dist-info → dstack-0.19.12.dist-info}/METADATA +2 -1
  28. {dstack-0.19.11rc2.dist-info → dstack-0.19.12.dist-info}/RECORD +31 -32
  29. dstack/_internal/utils/ignore.py +0 -92
  30. {dstack-0.19.11rc2.dist-info → dstack-0.19.12.dist-info}/WHEEL +0 -0
  31. {dstack-0.19.11rc2.dist-info → dstack-0.19.12.dist-info}/entry_points.txt +0 -0
  32. {dstack-0.19.11rc2.dist-info → dstack-0.19.12.dist-info}/licenses/LICENSE.md +0 -0
@@ -308,12 +308,13 @@ async def create_job(
308
308
  ) -> JobModel:
309
309
  run_spec = RunSpec.parse_raw(run.run_spec)
310
310
  job_spec = (await get_job_specs_from_run_spec(run_spec, replica_num=replica_num))[0]
311
+ job_spec.job_num = job_num
311
312
  job = JobModel(
312
313
  project_id=run.project_id,
313
314
  run_id=run.id,
314
315
  run_name=run.run_name,
315
316
  job_num=job_num,
316
- job_name=run.run_name + f"-0-{replica_num}",
317
+ job_name=run.run_name + f"-{job_num}-{replica_num}",
317
318
  replica_num=replica_num,
318
319
  submission_num=submission_num,
319
320
  submitted_at=submitted_at,
@@ -314,3 +314,7 @@ def make_proxy_url(server_url: str, proxy_url: str) -> str:
314
314
  path=concat_url_path(server.path, proxy.path),
315
315
  )
316
316
  return proxy.geturl()
317
+
318
+
319
+ def list_enum_values_for_annotation(enum_class: type[enum.Enum]) -> str:
320
+ return ", ".join(f"`{e.value}`" for e in enum_class)
@@ -83,7 +83,7 @@ def _get_apply_plan_excludes(plan_input: ApplyFleetPlanInput) -> Dict:
83
83
  apply_plan_excludes = {}
84
84
  spec_excludes = _get_fleet_spec_excludes(plan_input.spec)
85
85
  if spec_excludes:
86
- apply_plan_excludes["spec"] = apply_plan_excludes
86
+ apply_plan_excludes["spec"] = spec_excludes
87
87
  current_resource = plan_input.current_resource
88
88
  if current_resource is not None:
89
89
  current_resource_excludes = {}
@@ -126,6 +126,10 @@ def _get_fleet_spec_excludes(fleet_spec: FleetSpec) -> Optional[Dict]:
126
126
  configuration_excludes["tags"] = True
127
127
  if profile.tags is None:
128
128
  profile_excludes.add("tags")
129
+ if profile.startup_order is None:
130
+ profile_excludes.add("startup_order")
131
+ if profile.stop_criteria is None:
132
+ profile_excludes.add("stop_criteria")
129
133
  if configuration_excludes:
130
134
  spec_excludes["configuration"] = configuration_excludes
131
135
  if profile_excludes:
@@ -188,6 +188,14 @@ def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[Dict]:
188
188
  configuration_excludes["shell"] = True
189
189
  if configuration.priority is None:
190
190
  configuration_excludes["priority"] = True
191
+ if configuration.startup_order is None:
192
+ configuration_excludes["startup_order"] = True
193
+ if profile is not None and profile.startup_order is None:
194
+ profile_excludes.add("startup_order")
195
+ if configuration.stop_criteria is None:
196
+ configuration_excludes["stop_criteria"] = True
197
+ if profile is not None and profile.stop_criteria is None:
198
+ profile_excludes.add("stop_criteria")
191
199
 
192
200
  if configuration_excludes:
193
201
  spec_excludes["configuration"] = configuration_excludes
dstack/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.19.11rc2"
1
+ __version__ = "0.19.12"
2
2
  __is_release__ = True
3
3
  base_image = "0.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.11rc2
3
+ Version: 0.19.12
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
@@ -22,6 +22,7 @@ Requires-Dist: cursor
22
22
  Requires-Dist: filelock
23
23
  Requires-Dist: gitpython
24
24
  Requires-Dist: gpuhunt==0.1.6
25
+ Requires-Dist: ignore-python>=0.2.0
25
26
  Requires-Dist: jsonschema
26
27
  Requires-Dist: packaging
27
28
  Requires-Dist: paramiko>=3.2.0
@@ -1,5 +1,5 @@
1
1
  dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dstack/version.py,sha256=IwrQj83vfz3Q3lIltKTGrhKlC1D7da7-iXWp5LG38Nw,68
2
+ dstack/version.py,sha256=eZrGQsCvpqosKeZL0aLtMA0YuPk3m-HVoj8LhGs7QMs,65
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=GOqfcLEONWC1hGU36IYPuOhJXP_qC3Y6d2SQge_NdpY,953
@@ -16,7 +16,7 @@ dstack/_internal/cli/commands/gateway.py,sha256=DcD6P_MvXbSL9aXkLX9hgGYSAzARjgY6
16
16
  dstack/_internal/cli/commands/init.py,sha256=bLhSlViNWtjflB6xNq_PuCR2o2A06h222luh1NeUgVA,1169
17
17
  dstack/_internal/cli/commands/logs.py,sha256=o8ehPAKM12Xn9thg2jjnYdr7_wKqF-00ziVry8IVVwE,1528
18
18
  dstack/_internal/cli/commands/metrics.py,sha256=ZS_dHD4_YK135J09xKpVTY_3CXzhj8QhDo18Ail9Pas,5862
19
- dstack/_internal/cli/commands/offer.py,sha256=rf10T9ohEC77GmZexdqF_RBCQkLYzVSAwTzZlxukNYM,4085
19
+ dstack/_internal/cli/commands/offer.py,sha256=6gem4Wz6WJmHur9-eiC65JwqObrGIAybROCAp5pr59k,4221
20
20
  dstack/_internal/cli/commands/project.py,sha256=V8gJwQWQGvGKQJPUyce_M7Ij_B7bOxYzo2IQgkLLHFE,6151
21
21
  dstack/_internal/cli/commands/ps.py,sha256=5RU4mcL4-FT4PcXktfKb4htCOPqia7mIuVGgfK7x9lY,1894
22
22
  dstack/_internal/cli/commands/server.py,sha256=4K0tp_tIUStCEMpWrUkRLwe27IgAt99RPpk2H1AWnXk,2817
@@ -32,14 +32,14 @@ dstack/_internal/cli/services/configurators/__init__.py,sha256=z94VPBFqybP8Zpwy3
32
32
  dstack/_internal/cli/services/configurators/base.py,sha256=bGfde2zoma28lLE8MUACO4-NKT1CdJJQJoXrzjpz0mQ,3360
33
33
  dstack/_internal/cli/services/configurators/fleet.py,sha256=jm4tNH6QQVplLdboCTlvRYUee3nZ0UYb_qLTrvtYVYM,14049
34
34
  dstack/_internal/cli/services/configurators/gateway.py,sha256=czB2s89s7IowOmWnpDwWErPAUlW3FvFMizImhrkQiBM,8927
35
- dstack/_internal/cli/services/configurators/run.py,sha256=nXNjFrM5YT6RFqPXJQa4MOiEsG6IFiANyGKP-PXILdc,25518
35
+ dstack/_internal/cli/services/configurators/run.py,sha256=oNjxxUeVzvuuEwot7WVjDbQqGxVfO6BoB7z6K-jKA2E,25248
36
36
  dstack/_internal/cli/services/configurators/volume.py,sha256=riMXLQbgvHIIFwLKdHfad-_0iE9wE3G_rUmXU5P3ZS8,8519
37
37
  dstack/_internal/cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  dstack/_internal/cli/utils/common.py,sha256=rfmzqrsgR3rXW3wj0vxDdvrhUUg2aIy4A6E9MZbd55g,1763
39
39
  dstack/_internal/cli/utils/fleet.py,sha256=ch-LN1X9boSm-rFLW4mAJRmz0XliLhH0LvKD2DqSt2g,3942
40
40
  dstack/_internal/cli/utils/gateway.py,sha256=qMYa1NTAT_O98x2_mSyWDRbiHj5fqt6xUXFh9NIUwAM,1502
41
41
  dstack/_internal/cli/utils/rich.py,sha256=Gx1MJU929kMKsbdo9qF7XHARNta2426Ssb-xMLVhwbQ,5710
42
- dstack/_internal/cli/utils/run.py,sha256=nCQwAU3VDS8ec2oWNjRKi5xIGdwwKI_YNr8vgGyDPzQ,9202
42
+ dstack/_internal/cli/utils/run.py,sha256=X518VI3gjBkAfZt-1ErhuzQpCLATkZm8r_cf9L_Y6IE,8800
43
43
  dstack/_internal/cli/utils/updates.py,sha256=pGr5keEmHojnbY0ayjWL4GWTz4ParY6fP85tHpJ11pI,3043
44
44
  dstack/_internal/cli/utils/volume.py,sha256=mU9I06dVMFbpjfkefxrZNoSWadKLoib3U14rHudNQN4,1975
45
45
  dstack/_internal/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -133,8 +133,8 @@ dstack/_internal/core/backends/runpod/models.py,sha256=W3nO4sjvvWtfKYDZDVJ8oBSsg
133
133
  dstack/_internal/core/backends/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
134
  dstack/_internal/core/backends/template/backend.py.jinja,sha256=jqSUr05lKHSuGq2MCk4tHob1TfGiSSsHox1GuEz30zU,704
135
135
  dstack/_internal/core/backends/template/compute.py.jinja,sha256=jLFZ_EMEjlgu6y3VJtvXs4qNXZmytZhl5JzJVM04lIc,3319
136
- dstack/_internal/core/backends/template/configurator.py.jinja,sha256=XPuJ7u09Mz6_9iYagl4Oe8e3y2sCwS7ZIVA64tEFmcY,2616
137
- dstack/_internal/core/backends/template/models.py.jinja,sha256=5ZGTyWffrT3e22WwQ-T55MqOIe9c69qyK9ZNQk2IBPM,2057
136
+ dstack/_internal/core/backends/template/configurator.py.jinja,sha256=W2Ycp__DZoWW-CligjQTJL6iuEQdT6mXmrb7Mi3jYfw,2500
137
+ dstack/_internal/core/backends/template/models.py.jinja,sha256=dhJd8uWoMvAHAsPpDMPNtdMKzJTIoXDtsGC0NCQ3Y08,2061
138
138
  dstack/_internal/core/backends/tensordock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
139
  dstack/_internal/core/backends/tensordock/api_client.py,sha256=NUEKgu6JY6kqQXRqsghT-aBf7sNstHQo7J1WmqL-Qfs,3872
140
140
  dstack/_internal/core/backends/tensordock/backend.py,sha256=KT5bRuD3KttEqiNNqQpW5f6nX7Qez-L74TBmYKy3puI,606
@@ -156,18 +156,18 @@ dstack/_internal/core/backends/vultr/models.py,sha256=TkqK_lW6w5k_7wsoFiKDb6NXuT
156
156
  dstack/_internal/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
157
  dstack/_internal/core/models/common.py,sha256=XWd79dmFGMrdpTcStH5fVmNXCKE0s7FsIorPL0saQ8w,2138
158
158
  dstack/_internal/core/models/config.py,sha256=JJ7rT7dztzTWCY5TkoyxXxTvG5D4IFYhGe7EzwkLOWQ,581
159
- dstack/_internal/core/models/configurations.py,sha256=yG5GaCbTK4QhSh0UMYrYpFSeFvD0f-Uhi3TT_XviGhQ,19068
159
+ dstack/_internal/core/models/configurations.py,sha256=PA_u1gdTBCwKKIiGo7tH95Wv_ZZYX89mTCBOKs5cYko,19069
160
160
  dstack/_internal/core/models/envs.py,sha256=yq84YRFBILOy4x3XnGcTgYpbZ69eFTCQPgBCr9Ndov4,4969
161
- dstack/_internal/core/models/fleets.py,sha256=gbP2rj1ODDuy4IfTbPNB-ae050thvzTtA8uDb5iTmdY,12059
161
+ dstack/_internal/core/models/fleets.py,sha256=aqDVlZMc71NjLrzwBF3qz-dHzocQT5Qip7QWl8ZbKuA,12263
162
162
  dstack/_internal/core/models/gateways.py,sha256=_O8EWwHWLdgNoWY4P4u71KM-uEr5DDp42LXfyv1qMDI,4054
163
163
  dstack/_internal/core/models/instances.py,sha256=Qh4QFZYQZxxn2HokafZiQyTiiwjiYuL9atxGlw6K980,5451
164
164
  dstack/_internal/core/models/logs.py,sha256=Lsmtd_NrnChMjBJahUZpFb1j8Xobix9FHWf1L47FOGs,443
165
165
  dstack/_internal/core/models/metrics.py,sha256=Xb8hCXUL-ncQ3PMsErIUAJTe9gwh5jyrQ4UQoZbibsc,269
166
166
  dstack/_internal/core/models/placement.py,sha256=WJVq5ENJykyRarQzL2EeYQag_9_jV7VSAtR_xoFvPVM,720
167
- dstack/_internal/core/models/profiles.py,sha256=seeysTuMv1vVUmpHAZgrMUGcbMtH7hSMFIvfx0Qk__0,10406
167
+ dstack/_internal/core/models/profiles.py,sha256=SSbslQfKoa6Sg8A_Z26xDNTujGZc51we11G5rlqfBpY,11659
168
168
  dstack/_internal/core/models/projects.py,sha256=H5ZZRiyUEKifpTFAhl45KBi5ly7ooE0WmI329myK360,643
169
169
  dstack/_internal/core/models/resources.py,sha256=rsf6hAhi5bfSb_Z9VcS3UoEG0G8Ohl6ekyrOStLOAqw,14114
170
- dstack/_internal/core/models/runs.py,sha256=6egFnxV0qGs-XCr22RvJc-rSpc3zsNIk2UF3cRdWlX4,19017
170
+ dstack/_internal/core/models/runs.py,sha256=rOse2_uXcZL1poRI6OKegzC7N52OogpQ4r_pgByQ7J0,20796
171
171
  dstack/_internal/core/models/secrets.py,sha256=IQyemsNpSzqOCB-VlVTuc4gyPFmXXO4mhko0Ur0ey3I,221
172
172
  dstack/_internal/core/models/server.py,sha256=Hkc1v2s3KOiwslsWVmhUOAzcSeREoG-HD1SzSX9WUGg,152
173
173
  dstack/_internal/core/models/services.py,sha256=2Hpi7j0Q1shaf_0wd0C0044AJAmuYi-D3qx3PH849oI,3076
@@ -178,7 +178,7 @@ dstack/_internal/core/models/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
178
178
  dstack/_internal/core/models/backends/base.py,sha256=Fbhs90NBMceXhjORwj7c2_pVriapCGSUMBFwuR-wRIg,1091
179
179
  dstack/_internal/core/models/repos/__init__.py,sha256=7Qo1QgJ852LklUuM-mlCNFodp_XrQ4iqV7uRPiX_qm0,885
180
180
  dstack/_internal/core/models/repos/base.py,sha256=nErlSR3AbG9fwDE5vuJK5DIrP8JB3fG8a7mXqosJ9gY,846
181
- dstack/_internal/core/models/repos/local.py,sha256=DmW_e6qOWctZwuEpCqME-JpxYHTgH5I1gcK7zjSMfao,2394
181
+ dstack/_internal/core/models/repos/local.py,sha256=zKnEOyN7hSDQ7EKn8q9aJ3uikiTTtGdGEN_3896HTTc,2913
182
182
  dstack/_internal/core/models/repos/remote.py,sha256=r50v39KHhoVMfdnIHe58VJEi2Abm-37Y1ttXigdjc9o,11553
183
183
  dstack/_internal/core/models/repos/virtual.py,sha256=8g4hGSQ6Z8oDKoF6cj2souJ2A5vRop5OyFCQ5z84rw4,2582
184
184
  dstack/_internal/core/services/__init__.py,sha256=UVVcj26WYVgo7jHzD07sNRqSOO7zA3QzQv-9LnCDqR4,415
@@ -262,8 +262,8 @@ dstack/_internal/server/background/tasks/process_instances.py,sha256=E1NLac4ubiF
262
262
  dstack/_internal/server/background/tasks/process_metrics.py,sha256=aJPHnmKQE19JVxJVwGFyyK7buUcbp9Smw9CkFO2DPAk,6135
263
263
  dstack/_internal/server/background/tasks/process_placement_groups.py,sha256=gJ8Um3Vx-brazHVWdtVXPnov4rwvDr-0Vn1Voq1cYBQ,4108
264
264
  dstack/_internal/server/background/tasks/process_prometheus_metrics.py,sha256=9VoGFqdiXcVkCi_NV1VqQdqllDkB0bHIqOHKMIZK1Fg,5183
265
- dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=jyuYOQfXIVGu5ugTennwSGXL_c6VDNJN96-Qrz7Hgic,36441
266
- dstack/_internal/server/background/tasks/process_runs.py,sha256=EI1W6HUyB-og3g8BDP_GsBrJjQ-Z3JvZHTuJf7CRKRM,17974
265
+ dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=8nzH9H2Kuaa1g7-SBCdhUWqDztlaQmnECyWqK0S9OaE,37636
266
+ dstack/_internal/server/background/tasks/process_runs.py,sha256=Sz_DQdi9Vd4VDbIzOC3lSExopxdnW5kcrDXOeqOR-2o,18522
267
267
  dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=tLLpdtLHN2xC6Ohc6f0we3oevw3pBt0_XrsufaFtIvE,27383
268
268
  dstack/_internal/server/background/tasks/process_terminating_jobs.py,sha256=0Z3Q409RwSxOL_pgK8JktBthjtESEUH3ahwTLsTdYPk,3800
269
269
  dstack/_internal/server/background/tasks/process_volumes.py,sha256=206rbT4ICeZtEmqh_94Rry_fgHfFLLaSEX9W-svwFk4,5089
@@ -372,7 +372,7 @@ dstack/_internal/server/security/permissions.py,sha256=FJ_8YPhjmebA4jQjtQoAGEaj1
372
372
  dstack/_internal/server/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
373
  dstack/_internal/server/services/config.py,sha256=yo8njslwfS7_blhbPPhOtzCMyg8N_mmFSw5aPvirSzw,10691
374
374
  dstack/_internal/server/services/docker.py,sha256=zAvjFHxIP03Td92NzbGEScz0piLjloE60tQ7vz0AeCA,5328
375
- dstack/_internal/server/services/fleets.py,sha256=5BQ3DYBx0XWfcJJjaOemNoYPkvlkNsZ_uqA01YjjKxY,26587
375
+ dstack/_internal/server/services/fleets.py,sha256=9UL9mHo0IJhYrxiFHQUaLUA61PAQQ8gGwYNHpknlVqU,26599
376
376
  dstack/_internal/server/services/instances.py,sha256=4feu9RfixOIVsLoFPHiYYUe0L6sf3v3h1asTBSF5cyc,18686
377
377
  dstack/_internal/server/services/locking.py,sha256=7JUgNSplKRx7dxC4LIpmWw81agUtslEDTeDiNMPbAVg,3013
378
378
  dstack/_internal/server/services/logging.py,sha256=Nu1628kW2hqB__N0Eyr07wGWjVWxfyJnczonTJ72kSM,417
@@ -380,15 +380,15 @@ dstack/_internal/server/services/metrics.py,sha256=jKLy1jSCVR_crqVu_CmsOMbvMkucW
380
380
  dstack/_internal/server/services/offers.py,sha256=4hhqLzmo14_IY84FSDG59Sib1DrmTAOk-_q8M4aYoLU,7737
381
381
  dstack/_internal/server/services/permissions.py,sha256=l7Ngdelmn65vjw13NcOdaC6lBYMRuSw6FbHzYwdK3nE,1005
382
382
  dstack/_internal/server/services/placement.py,sha256=U-7z4kJ6ZyrCXzkDychWoOhniz19ooFwiNI2InoTLls,2420
383
- dstack/_internal/server/services/plugins.py,sha256=6UeOF65IA7OzLTBiUmZO0g-07aMRh_J2npEfcpz6C0Q,3750
383
+ dstack/_internal/server/services/plugins.py,sha256=KgBqBUqxjQirRcYNuXVetE4OQj0EPkdC7ccbrNV1WQE,3825
384
384
  dstack/_internal/server/services/projects.py,sha256=Je1iWZ-ArmyFxK1yMUzod5WRXyiIDxtuVp6pHcdctTQ,14988
385
385
  dstack/_internal/server/services/prometheus.py,sha256=xq5G-Q2BJup9lS2F6__0wUVTs-k1Gr3dYclGzo2WoWo,12474
386
386
  dstack/_internal/server/services/repos.py,sha256=f9ztN7jz_2gvD9hXF5sJwWDVyG2-NHRfjIdSukowPh8,9342
387
387
  dstack/_internal/server/services/resources.py,sha256=VRFOih_cMJdc0c2m9nSGsX8vWAJQV3M6N87aqS_JXfw,699
388
- dstack/_internal/server/services/runs.py,sha256=Vm-dWX8-ZL6TANnyh0KdEg_UIMaKOky8N8SYoMSQRCQ,39167
388
+ dstack/_internal/server/services/runs.py,sha256=7nj4iQ6CZT3SEW9h3Vb8CBV65MUSSeQfZwgP_J4YlMo,39179
389
389
  dstack/_internal/server/services/storage.py,sha256=6I0xI_3_RpJNbKZwHjDnjrEwXGdHfiaeb5li15T-M1I,1884
390
390
  dstack/_internal/server/services/users.py,sha256=W-5xL7zsHNjeG7BBK54RWGvIrBOrw-FF0NcG_z9qhoE,7466
391
- dstack/_internal/server/services/volumes.py,sha256=vfKY6eZp64I58Mfdvrk9Wig7deveD2Rw4ET1cbc1Sog,16238
391
+ dstack/_internal/server/services/volumes.py,sha256=vxjFn3ijrvwi9-aXipT0iQgNjgebdwcBRn1mKFL9zAQ,16244
392
392
  dstack/_internal/server/services/backends/__init__.py,sha256=Aqo1GoqhZ_FsLEkCcBrvReKSq6E5w4QbBLrDXfGjiKU,13154
393
393
  dstack/_internal/server/services/backends/handlers.py,sha256=j-MhBxrpdepoDG7f2tApjFnE23RVO5I15-hxHyOWnew,3251
394
394
  dstack/_internal/server/services/encryption/__init__.py,sha256=3kCw_cxC3-Un1OIofdW5Gqsm0ZCXXTlGz09cULBx_uc,3155
@@ -396,7 +396,7 @@ dstack/_internal/server/services/encryption/keys/__init__.py,sha256=47DEQpj8HBSa
396
396
  dstack/_internal/server/services/encryption/keys/aes.py,sha256=2He1p2_Rg6hnCeLIGJo-Yfdsij7so_338oY49RXuL3Q,2276
397
397
  dstack/_internal/server/services/encryption/keys/base.py,sha256=mqumJiidoexUPoqxhQG6J_SpC1WGYwkdjKm1MUWnXo8,352
398
398
  dstack/_internal/server/services/encryption/keys/identity.py,sha256=ryb_YSV6u4c7W1OsVfEpzJvZCrR4zZYlzLw_GpjpD2Q,741
399
- dstack/_internal/server/services/gateways/__init__.py,sha256=Up8uFsEQDBE0yOXn7n5o7Q8MkY0XJfbMWViMFd2EIL4,21530
399
+ dstack/_internal/server/services/gateways/__init__.py,sha256=aDTpr45rkaQ2zBHnDQycwEDSQSno7bQ0buRPqTEDRxg,21536
400
400
  dstack/_internal/server/services/gateways/client.py,sha256=XIJX3fGBbZ_AG8qZMTSE8KAB_ojq5YJFa0OXoD_dofg,7493
401
401
  dstack/_internal/server/services/gateways/connection.py,sha256=ot3lV85XdmCT45vBWeyj57nLPcLPNm316zu3jMyeWjA,5625
402
402
  dstack/_internal/server/services/gateways/pool.py,sha256=0LclTl1tyx-doS78LeaAKjr-SMp98zuwh5f9s06JSd0,1914
@@ -424,7 +424,7 @@ dstack/_internal/server/services/proxy/routers/service_proxy.py,sha256=5oB-SX8f_
424
424
  dstack/_internal/server/services/proxy/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
425
425
  dstack/_internal/server/services/proxy/services/service_proxy.py,sha256=4JrSxHqhBYqU1oENii89Db-bzkFWExYrOy-0mNEhWBs,4879
426
426
  dstack/_internal/server/services/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
427
- dstack/_internal/server/services/runner/client.py,sha256=jQDxv_Yaiwr2e3m1LqPCFtToB_GrsC2yVQfgXzyn6g8,15586
427
+ dstack/_internal/server/services/runner/client.py,sha256=8xcZNdnQPHtXCVS2RdVS2_KDcrCUa1K6cnqcDZsisBU,15653
428
428
  dstack/_internal/server/services/runner/ssh.py,sha256=H-X0015ZPwYq5tc31ytFF1uNaUAr9itAsABI2oPJWrk,5017
429
429
  dstack/_internal/server/services/services/__init__.py,sha256=HQz72SNN8W9gUQ5INyO_Wd8TR9j3V6qoHFGEDEI920w,10862
430
430
  dstack/_internal/server/services/services/autoscalers.py,sha256=0o_w9La-ex_P3VKG88w_XN3hkLkzryv5l1cH3pkZyAE,4315
@@ -454,10 +454,10 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
454
454
  dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
455
455
  dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
456
456
  dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
457
- dstack/_internal/server/statics/index.html,sha256=WcJyCA-G5vPq0xyJH8UcyEdw-df77u9C_3S0EdfxvT8,10468
458
- dstack/_internal/server/statics/main-5b9786c955b42bf93581.js,sha256=zhAnUUbO4YDnSGFJ77XNOIraIcw19ov7gokS2DLhy9E,6523313
459
- dstack/_internal/server/statics/main-5b9786c955b42bf93581.js.map,sha256=6SX5ZigfpMVtB3xLBJb4IME1ifg1IwqsyMy8NKTSiq8,8561465
457
+ dstack/_internal/server/statics/index.html,sha256=0WVNSeT_erId8atQuddi8_KDU9CkPZ-sSgKKYKpT1RM,10468
460
458
  dstack/_internal/server/statics/main-8f9c66f404e9c7e7e020.css,sha256=RC2sAxRMpIK3myvsxKEhLk4OsxTOt7DgWunCwyn-B34,1336694
459
+ dstack/_internal/server/statics/main-b0e80f8e26a168c129e9.js,sha256=3gD82dvSvrkE0XhV35ENT8jfDemHl5uh_PWkS9F6LzE,6527495
460
+ dstack/_internal/server/statics/main-b0e80f8e26a168c129e9.js.map,sha256=aajRK86uIUop4KlWzHkMCQ1eHR4-pMe86iw8hXxffaU,8567969
461
461
  dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
462
462
  dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
463
463
  dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
@@ -535,21 +535,20 @@ dstack/_internal/server/statics/static/media/logo.f602feeb138844eda97c8cb6414614
535
535
  dstack/_internal/server/statics/static/media/okta.12f178e6873a1100965f2a4dbd18fcec.svg,sha256=KqFI05gQM135zC1plF1WBRF2F7CyKL7km97WKsZjAHI,319
536
536
  dstack/_internal/server/statics/static/media/theme.3994c817bb7dda191c1c9640dee0bf42.svg,sha256=ZxFFBVZWuRLqmWH4zhwGLNtKjOzHj-5MGJRunFAtu1I,561
537
537
  dstack/_internal/server/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
538
- dstack/_internal/server/testing/common.py,sha256=0zEEx3CEzBUm57C3PdgHaFwS_HjVO2ENNGt2Yo1eJdU,31530
538
+ dstack/_internal/server/testing/common.py,sha256=kFVgsk_dl3akkh5rZ8kSJcKT0-K44nxRENkj2cGPvXU,31569
539
539
  dstack/_internal/server/testing/conf.py,sha256=-zhujfFjTHNfQDOK-hBck32By11c_kC0OeinB3esQGg,1902
540
540
  dstack/_internal/server/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
541
541
  dstack/_internal/server/utils/common.py,sha256=PbjXtqYy1taKXpyG5ys8cIrz9MXqc9dBAsR_9D1brrk,1414
542
542
  dstack/_internal/server/utils/logging.py,sha256=bxUS2uWG5snypNRfL0d5sMLCDytyOZac81PSQlb7_rs,1907
543
543
  dstack/_internal/server/utils/routers.py,sha256=ZuoQEpWjtv4WhXCJmd0ZvwBPZ8eKplO7Bb7leT9e8Ho,4630
544
544
  dstack/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
545
- dstack/_internal/utils/common.py,sha256=Ynq9_nZpIyipOn4y0-feGU_YbxzHSvWZGx2UGGR2bmI,9251
545
+ dstack/_internal/utils/common.py,sha256=W91g_g63X50a5vPCYl7ntW528QBMViaN1owqKc9VHeo,9383
546
546
  dstack/_internal/utils/crypto.py,sha256=2RTSyzePuwwqc1X2HO6lwcSFyZ2kujnqluoICQ2DLJQ,1462
547
547
  dstack/_internal/utils/dxf.py,sha256=wguK9s6-69kqSDZkxd1kFEr6VlH5ixvFRJxizyOuJ8I,3229
548
548
  dstack/_internal/utils/env.py,sha256=HRbIspHpKHh05fMZeV23-hrZoV6vVMuniefD08u6ey0,357
549
549
  dstack/_internal/utils/event_loop.py,sha256=DO2ADtWfH2z8F2hBbg_EADSWzleQYGVZ9D1XYDpH-tk,880
550
550
  dstack/_internal/utils/gpu.py,sha256=ZeWpy1nRLVh-FwBZdxbMoVjjCF0DWJlWfNoVgFhGx2w,1776
551
551
  dstack/_internal/utils/hash.py,sha256=mCERRtj9QwbpoP3vveBqbniSJiNMHG0vPSzp4fxmKv0,920
552
- dstack/_internal/utils/ignore.py,sha256=Lb5l_qTxOApHGPRu_YHkpTB9e5P0KIOFibMm8vTs_eQ,3138
553
552
  dstack/_internal/utils/interpolator.py,sha256=kLRm_DagGcjnkLPtMC9NaHioegsUvg8uk4lom38eV3I,2922
554
553
  dstack/_internal/utils/json_schema.py,sha256=oh23z6jdl_wx3qkojk_2egyKZbdmYWZs12Gd9Bk46M8,371
555
554
  dstack/_internal/utils/logging.py,sha256=j37rgL-fQh2_E3ec_RqDy6Ora-Aa79ZVV-BAgZJViME,97
@@ -567,14 +566,14 @@ dstack/api/_public/runs.py,sha256=e_-CqkzHJqeUvO_yXbLnmO8ADZEcgRtagZoL5fr2wmU,28
567
566
  dstack/api/huggingface/__init__.py,sha256=oIrEij3wttLZ1yrywEGvCMd6zswMQrX5pPjrqdSi0UA,2201
568
567
  dstack/api/server/__init__.py,sha256=Zyl1M51tifn4pB150yIsh39N96qUgMjg5XplcElHDxg,6097
569
568
  dstack/api/server/_backends.py,sha256=tSvJ4j-yp-S-4IYo7pKHluDaSsx6Xbwo08Ff6Do85fo,1639
570
- dstack/api/server/_fleets.py,sha256=6xxAz6Ud8tgDSINLdTQu9t_dHH5NdB5PRtIV_UHzDFs,5160
569
+ dstack/api/server/_fleets.py,sha256=fc5NQpm1xrQ0L8IerqtnPdNb-F_7AiCfk1EDLR2CZkk,5322
571
570
  dstack/api/server/_gateways.py,sha256=FAjSi1l6dj1H0mHuFwcCH-QbRxAxVzPI8xE2cmcvWqo,2688
572
571
  dstack/api/server/_group.py,sha256=f9a_YvwZ7s1vDTQhOWHLwm3kO84C5R_zXToD4cxAnvY,432
573
572
  dstack/api/server/_logs.py,sha256=ng8QvFAIaoVOVChTK6Wuu5BeM6y7gAdx30KEYRsn9xA,500
574
573
  dstack/api/server/_metrics.py,sha256=OPb8sLhI_U605sHOPrELgy0_6cNFLJVfpvr-qkEukRM,670
575
574
  dstack/api/server/_projects.py,sha256=g6kNSU6jer8u7Kaut1I0Ft4wRMLBBCQShJf3fOB63hQ,1440
576
575
  dstack/api/server/_repos.py,sha256=bqsKuZWyiNLE8UAdSZrYNtk1J3Gu5MXXnTMIoM9jxpI,1770
577
- dstack/api/server/_runs.py,sha256=toI0guzIVIpPO8L4c8N6On2KEEAzvg9YGYM3IP1EdGQ,8003
576
+ dstack/api/server/_runs.py,sha256=-19KLwzv_Gql-Qp7w3gauf7yXHQLQPMI4_mlB_uDTwc,8417
578
577
  dstack/api/server/_secrets.py,sha256=VqLfrIcmBJtPxNDRkXTG44H5SWoY788YJapScUukvdY,1576
579
578
  dstack/api/server/_users.py,sha256=XzhgGKc5Tsr0-xkz3T6rGyWZ1tO7aYNhLux2eE7dAoY,1738
580
579
  dstack/api/server/_volumes.py,sha256=xxOt8o5G-bhMh6wSvF4BDFNoqVEhlM4BXQr2KvX0pN0,1937
@@ -588,8 +587,8 @@ dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
588
587
  dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
589
588
  dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
590
589
  dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=LbtjnXqd-51pR19Cr5rYxoIyDKjSOG4hIpXmv1Mpfnc,4615
591
- dstack-0.19.11rc2.dist-info/METADATA,sha256=gW5bm3zVUlCFv1GeJCmDDaskSOyWRTkro3-diWi_avE,20480
592
- dstack-0.19.11rc2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
593
- dstack-0.19.11rc2.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
594
- dstack-0.19.11rc2.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
595
- dstack-0.19.11rc2.dist-info/RECORD,,
590
+ dstack-0.19.12.dist-info/METADATA,sha256=R0LNdikrlXFe0hhYPGnF1nTHOnRtyp0pe5Kmn18W_Bg,20513
591
+ dstack-0.19.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
592
+ dstack-0.19.12.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
593
+ dstack-0.19.12.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
594
+ dstack-0.19.12.dist-info/RECORD,,
@@ -1,92 +0,0 @@
1
- import fnmatch
2
- from itertools import zip_longest
3
- from pathlib import Path
4
- from typing import Dict, List, Optional
5
-
6
- from dstack._internal.utils.path import PathLike
7
-
8
-
9
- class GitIgnore:
10
- def __init__(
11
- self, root_dir: PathLike, ignore_files: List[str] = None, globs: List[str] = None
12
- ):
13
- self.root_dir = Path(root_dir)
14
- self.ignore_files = (
15
- ignore_files
16
- if ignore_files is not None
17
- else [".gitignore", ".git/info/exclude", ".dstackignore"]
18
- )
19
- self.ignore_globs: Dict[str, List[str]] = {".": globs or []}
20
- self.load_recursive()
21
-
22
- def load_ignore_file(self, path: str, ignore_file: Path):
23
- if path != "." and not path.startswith("./"):
24
- path = "./" + path
25
- if path not in self.ignore_globs:
26
- self.ignore_globs[path] = []
27
- with ignore_file.open("r") as f:
28
- for line in f:
29
- line = self.rstrip(line.rstrip("\n")).rstrip("/")
30
- line = line.replace("\\ ", " ")
31
- if line.startswith("#") or not line:
32
- continue
33
- self.ignore_globs[path].append(line)
34
-
35
- def load_recursive(self, path: Optional[Path] = None):
36
- path = path or self.root_dir
37
- for ignore_file in self.ignore_files:
38
- ignore_file = path / ignore_file
39
- if ignore_file.exists():
40
- self.load_ignore_file(str(path.relative_to(self.root_dir)), ignore_file)
41
-
42
- for subdir in path.iterdir():
43
- if not subdir.is_dir() or self.ignore(subdir.relative_to(self.root_dir)):
44
- continue
45
- self.load_recursive(subdir)
46
-
47
- @staticmethod
48
- def rstrip(value: str) -> str:
49
- end = len(value) - 1
50
- while end >= 0:
51
- if not value[end].isspace():
52
- break
53
- if end > 0 and value[end - 1] == "\\":
54
- break # escaped space
55
- end -= 1
56
- else:
57
- return ""
58
- return value[: end + 1]
59
-
60
- @staticmethod
61
- def fnmatch(name: str, pattern: str, sep="/") -> bool:
62
- if pattern.startswith(sep):
63
- name = sep + name
64
- for n, p in zip_longest(
65
- reversed(name.split(sep)), reversed(pattern.split(sep)), fillvalue=None
66
- ):
67
- if p == "**":
68
- raise NotImplementedError()
69
- if p is None:
70
- return True
71
- if n is None or not fnmatch.fnmatch(n, p):
72
- return False
73
- return True
74
-
75
- def ignore(self, path: PathLike, sep="/") -> bool:
76
- if not path:
77
- return False
78
- path = Path(path)
79
- if path.is_absolute():
80
- path = path.relative_to(self.root_dir)
81
-
82
- tokens = ("." + sep + str(path)).split(sep)
83
- for i in range(1, len(tokens)):
84
- parent = sep.join(tokens[:-i])
85
- globs = self.ignore_globs.get(parent)
86
- if not globs:
87
- continue
88
- name = sep.join(tokens[-i:])
89
- for glob in globs:
90
- if self.fnmatch(name, glob, sep=sep):
91
- return True
92
- return False