dstack 0.19.12__py3-none-any.whl → 0.19.13__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/services/configurators/run.py +1 -6
- dstack/_internal/cli/utils/run.py +5 -1
- dstack/_internal/core/backends/aws/compute.py +22 -9
- dstack/_internal/core/backends/aws/resources.py +26 -0
- dstack/_internal/core/backends/base/offers.py +0 -1
- dstack/_internal/core/compatibility/__init__.py +0 -0
- dstack/_internal/core/compatibility/fleets.py +72 -0
- dstack/_internal/core/compatibility/gateways.py +34 -0
- dstack/_internal/core/compatibility/runs.py +125 -0
- dstack/_internal/core/compatibility/volumes.py +32 -0
- dstack/_internal/core/models/instances.py +51 -12
- dstack/_internal/core/models/runs.py +41 -0
- dstack/_internal/server/app.py +1 -1
- dstack/_internal/server/services/storage/__init__.py +38 -0
- dstack/_internal/server/services/storage/base.py +27 -0
- dstack/_internal/server/services/storage/gcs.py +44 -0
- dstack/_internal/server/services/{storage.py → storage/s3.py} +4 -27
- dstack/_internal/server/settings.py +7 -3
- dstack/_internal/server/statics/index.html +1 -1
- dstack/_internal/server/statics/{main-b0e80f8e26a168c129e9.js → main-2066f1f22ddb4557bcde.js} +1615 -31
- dstack/_internal/server/statics/{main-b0e80f8e26a168c129e9.js.map → main-2066f1f22ddb4557bcde.js.map} +1 -1
- dstack/_internal/server/statics/{main-8f9c66f404e9c7e7e020.css → main-f39c418b05fe14772dd8.css} +1 -1
- dstack/api/server/_fleets.py +9 -73
- dstack/api/server/_gateways.py +3 -14
- dstack/api/server/_runs.py +4 -124
- dstack/api/server/_volumes.py +3 -14
- dstack/plugins/builtin/rest_plugin/_plugin.py +24 -5
- dstack/version.py +2 -2
- {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/METADATA +1 -1
- {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/RECORD +33 -25
- {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/WHEEL +0 -0
- {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/entry_points.txt +0 -0
- {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/licenses/LICENSE.md +0 -0
dstack/api/server/_fleets.py
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import List, Union
|
|
2
2
|
|
|
3
3
|
from pydantic import parse_obj_as
|
|
4
4
|
|
|
5
|
+
from dstack._internal.core.compatibility.fleets import (
|
|
6
|
+
get_apply_plan_excludes,
|
|
7
|
+
get_create_fleet_excludes,
|
|
8
|
+
get_get_plan_excludes,
|
|
9
|
+
)
|
|
5
10
|
from dstack._internal.core.models.fleets import ApplyFleetPlanInput, Fleet, FleetPlan, FleetSpec
|
|
6
|
-
from dstack._internal.core.models.instances import Instance
|
|
7
11
|
from dstack._internal.server.schemas.fleets import (
|
|
8
12
|
ApplyFleetPlanRequest,
|
|
9
13
|
CreateFleetRequest,
|
|
@@ -34,7 +38,7 @@ class FleetsAPIClient(APIClientGroup):
|
|
|
34
38
|
spec: FleetSpec,
|
|
35
39
|
) -> FleetPlan:
|
|
36
40
|
body = GetFleetPlanRequest(spec=spec)
|
|
37
|
-
body_json = body.json(exclude=
|
|
41
|
+
body_json = body.json(exclude=get_get_plan_excludes(spec))
|
|
38
42
|
resp = self._request(f"/api/project/{project_name}/fleets/get_plan", body=body_json)
|
|
39
43
|
return parse_obj_as(FleetPlan.__response__, resp.json())
|
|
40
44
|
|
|
@@ -46,7 +50,7 @@ class FleetsAPIClient(APIClientGroup):
|
|
|
46
50
|
) -> Fleet:
|
|
47
51
|
plan_input = ApplyFleetPlanInput.__response__.parse_obj(plan)
|
|
48
52
|
body = ApplyFleetPlanRequest(plan=plan_input, force=force)
|
|
49
|
-
body_json = body.json(exclude=
|
|
53
|
+
body_json = body.json(exclude=get_apply_plan_excludes(plan_input))
|
|
50
54
|
resp = self._request(f"/api/project/{project_name}/fleets/apply", body=body_json)
|
|
51
55
|
return parse_obj_as(Fleet.__response__, resp.json())
|
|
52
56
|
|
|
@@ -66,74 +70,6 @@ class FleetsAPIClient(APIClientGroup):
|
|
|
66
70
|
spec: FleetSpec,
|
|
67
71
|
) -> Fleet:
|
|
68
72
|
body = CreateFleetRequest(spec=spec)
|
|
69
|
-
body_json = body.json(exclude=
|
|
73
|
+
body_json = body.json(exclude=get_create_fleet_excludes(spec))
|
|
70
74
|
resp = self._request(f"/api/project/{project_name}/fleets/create", body=body_json)
|
|
71
75
|
return parse_obj_as(Fleet.__response__, resp.json())
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _get_get_plan_excludes(fleet_spec: FleetSpec) -> Dict:
|
|
75
|
-
get_plan_excludes = {}
|
|
76
|
-
spec_excludes = _get_fleet_spec_excludes(fleet_spec)
|
|
77
|
-
if spec_excludes:
|
|
78
|
-
get_plan_excludes["spec"] = spec_excludes
|
|
79
|
-
return get_plan_excludes
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def _get_apply_plan_excludes(plan_input: ApplyFleetPlanInput) -> Dict:
|
|
83
|
-
apply_plan_excludes = {}
|
|
84
|
-
spec_excludes = _get_fleet_spec_excludes(plan_input.spec)
|
|
85
|
-
if spec_excludes:
|
|
86
|
-
apply_plan_excludes["spec"] = spec_excludes
|
|
87
|
-
current_resource = plan_input.current_resource
|
|
88
|
-
if current_resource is not None:
|
|
89
|
-
current_resource_excludes = {}
|
|
90
|
-
apply_plan_excludes["current_resource"] = current_resource_excludes
|
|
91
|
-
if all(map(_should_exclude_instance_cpu_arch, current_resource.instances)):
|
|
92
|
-
current_resource_excludes["instances"] = {
|
|
93
|
-
"__all__": {"instance_type": {"resources": {"cpu_arch"}}}
|
|
94
|
-
}
|
|
95
|
-
return {"plan": apply_plan_excludes}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
def _should_exclude_instance_cpu_arch(instance: Instance) -> bool:
|
|
99
|
-
try:
|
|
100
|
-
return instance.instance_type.resources.cpu_arch is None
|
|
101
|
-
except AttributeError:
|
|
102
|
-
return True
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def _get_create_fleet_excludes(fleet_spec: FleetSpec) -> Dict:
|
|
106
|
-
create_fleet_excludes = {}
|
|
107
|
-
spec_excludes = _get_fleet_spec_excludes(fleet_spec)
|
|
108
|
-
if spec_excludes:
|
|
109
|
-
create_fleet_excludes["spec"] = spec_excludes
|
|
110
|
-
return create_fleet_excludes
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _get_fleet_spec_excludes(fleet_spec: FleetSpec) -> Optional[Dict]:
|
|
114
|
-
"""
|
|
115
|
-
Returns `fleet_spec` exclude mapping to exclude certain fields from the request.
|
|
116
|
-
Use this method to exclude new fields when they are not set to keep
|
|
117
|
-
clients backward-compatibility with older servers.
|
|
118
|
-
"""
|
|
119
|
-
spec_excludes: Dict[str, Any] = {}
|
|
120
|
-
configuration_excludes: Dict[str, Any] = {}
|
|
121
|
-
profile_excludes: set[str] = set()
|
|
122
|
-
profile = fleet_spec.profile
|
|
123
|
-
if profile.fleets is None:
|
|
124
|
-
profile_excludes.add("fleets")
|
|
125
|
-
if fleet_spec.configuration.tags is None:
|
|
126
|
-
configuration_excludes["tags"] = True
|
|
127
|
-
if profile.tags is None:
|
|
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")
|
|
133
|
-
if configuration_excludes:
|
|
134
|
-
spec_excludes["configuration"] = configuration_excludes
|
|
135
|
-
if profile_excludes:
|
|
136
|
-
spec_excludes["profile"] = profile_excludes
|
|
137
|
-
if spec_excludes:
|
|
138
|
-
return spec_excludes
|
|
139
|
-
return None
|
dstack/api/server/_gateways.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import List
|
|
2
2
|
|
|
3
3
|
from pydantic import parse_obj_as
|
|
4
4
|
|
|
5
|
+
from dstack._internal.core.compatibility.gateways import get_create_gateway_excludes
|
|
5
6
|
from dstack._internal.core.models.gateways import Gateway, GatewayConfiguration
|
|
6
7
|
from dstack._internal.server.schemas.gateways import (
|
|
7
8
|
CreateGatewayRequest,
|
|
@@ -31,7 +32,7 @@ class GatewaysAPIClient(APIClientGroup):
|
|
|
31
32
|
body = CreateGatewayRequest(configuration=configuration)
|
|
32
33
|
resp = self._request(
|
|
33
34
|
f"/api/project/{project_name}/gateways/create",
|
|
34
|
-
body=body.json(exclude=
|
|
35
|
+
body=body.json(exclude=get_create_gateway_excludes(configuration)),
|
|
35
36
|
)
|
|
36
37
|
return parse_obj_as(Gateway.__response__, resp.json())
|
|
37
38
|
|
|
@@ -51,15 +52,3 @@ class GatewaysAPIClient(APIClientGroup):
|
|
|
51
52
|
f"/api/project/{project_name}/gateways/set_wildcard_domain", body=body.json()
|
|
52
53
|
)
|
|
53
54
|
return parse_obj_as(Gateway.__response__, resp.json())
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _get_gateway_configuration_excludes(configuration: GatewayConfiguration) -> Dict:
|
|
57
|
-
"""
|
|
58
|
-
Returns `configuration` exclude mapping to exclude certain fields from the request.
|
|
59
|
-
Use this method to exclude new fields when they are not set to keep
|
|
60
|
-
clients backward-compatibility with older servers.
|
|
61
|
-
"""
|
|
62
|
-
configuration_excludes = {}
|
|
63
|
-
if configuration.tags is None:
|
|
64
|
-
configuration_excludes["tags"] = True
|
|
65
|
-
return {"configuration": configuration_excludes}
|
dstack/api/server/_runs.py
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import List, Optional, Union
|
|
3
3
|
from uuid import UUID
|
|
4
4
|
|
|
5
5
|
from pydantic import parse_obj_as
|
|
6
6
|
|
|
7
|
-
from dstack._internal.core.
|
|
7
|
+
from dstack._internal.core.compatibility.runs import get_apply_plan_excludes, get_get_plan_excludes
|
|
8
8
|
from dstack._internal.core.models.runs import (
|
|
9
9
|
ApplyRunPlanInput,
|
|
10
|
-
JobSubmission,
|
|
11
10
|
Run,
|
|
12
11
|
RunPlan,
|
|
13
12
|
RunSpec,
|
|
@@ -60,7 +59,7 @@ class RunsAPIClient(APIClientGroup):
|
|
|
60
59
|
body = GetRunPlanRequest(run_spec=run_spec, max_offers=max_offers)
|
|
61
60
|
resp = self._request(
|
|
62
61
|
f"/api/project/{project_name}/runs/get_plan",
|
|
63
|
-
body=body.json(exclude=
|
|
62
|
+
body=body.json(exclude=get_get_plan_excludes(body)),
|
|
64
63
|
)
|
|
65
64
|
return parse_obj_as(RunPlan.__response__, resp.json())
|
|
66
65
|
|
|
@@ -74,7 +73,7 @@ class RunsAPIClient(APIClientGroup):
|
|
|
74
73
|
body = ApplyRunPlanRequest(plan=plan_input, force=force)
|
|
75
74
|
resp = self._request(
|
|
76
75
|
f"/api/project/{project_name}/runs/apply",
|
|
77
|
-
body=body.json(exclude=
|
|
76
|
+
body=body.json(exclude=get_apply_plan_excludes(plan_input)),
|
|
78
77
|
)
|
|
79
78
|
return parse_obj_as(Run.__response__, resp.json())
|
|
80
79
|
|
|
@@ -85,122 +84,3 @@ class RunsAPIClient(APIClientGroup):
|
|
|
85
84
|
def delete(self, project_name: str, runs_names: List[str]):
|
|
86
85
|
body = DeleteRunsRequest(runs_names=runs_names)
|
|
87
86
|
self._request(f"/api/project/{project_name}/runs/delete", body=body.json())
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def _get_apply_plan_excludes(plan: ApplyRunPlanInput) -> Optional[Dict]:
|
|
91
|
-
"""
|
|
92
|
-
Returns `plan` exclude mapping to exclude certain fields from the request.
|
|
93
|
-
Use this method to exclude new fields when they are not set to keep
|
|
94
|
-
clients backward-compatibility with older servers.
|
|
95
|
-
"""
|
|
96
|
-
apply_plan_excludes = {}
|
|
97
|
-
run_spec_excludes = _get_run_spec_excludes(plan.run_spec)
|
|
98
|
-
if run_spec_excludes is not None:
|
|
99
|
-
apply_plan_excludes["run_spec"] = run_spec_excludes
|
|
100
|
-
current_resource = plan.current_resource
|
|
101
|
-
if current_resource is not None:
|
|
102
|
-
current_resource_excludes = {}
|
|
103
|
-
apply_plan_excludes["current_resource"] = current_resource_excludes
|
|
104
|
-
current_resource_excludes["run_spec"] = _get_run_spec_excludes(current_resource.run_spec)
|
|
105
|
-
job_submissions_excludes = {}
|
|
106
|
-
current_resource_excludes["jobs"] = {
|
|
107
|
-
"__all__": {"job_submissions": {"__all__": job_submissions_excludes}}
|
|
108
|
-
}
|
|
109
|
-
job_submissions = [js for j in current_resource.jobs for js in j.job_submissions]
|
|
110
|
-
if all(map(_should_exclude_job_submission_jpd_cpu_arch, job_submissions)):
|
|
111
|
-
job_submissions_excludes["job_provisioning_data"] = {
|
|
112
|
-
"instance_type": {"resources": {"cpu_arch"}}
|
|
113
|
-
}
|
|
114
|
-
if all(map(_should_exclude_job_submission_jrd_cpu_arch, job_submissions)):
|
|
115
|
-
job_submissions_excludes["job_runtime_data"] = {
|
|
116
|
-
"offer": {"instance": {"resources": {"cpu_arch"}}}
|
|
117
|
-
}
|
|
118
|
-
if all(js.exit_status is None for js in job_submissions):
|
|
119
|
-
job_submissions_excludes["exit_status"] = True
|
|
120
|
-
latest_job_submission = current_resource.latest_job_submission
|
|
121
|
-
if latest_job_submission is not None:
|
|
122
|
-
latest_job_submission_excludes = {}
|
|
123
|
-
current_resource_excludes["latest_job_submission"] = latest_job_submission_excludes
|
|
124
|
-
if _should_exclude_job_submission_jpd_cpu_arch(latest_job_submission):
|
|
125
|
-
latest_job_submission_excludes["job_provisioning_data"] = {
|
|
126
|
-
"instance_type": {"resources": {"cpu_arch"}}
|
|
127
|
-
}
|
|
128
|
-
if _should_exclude_job_submission_jrd_cpu_arch(latest_job_submission):
|
|
129
|
-
latest_job_submission_excludes["job_runtime_data"] = {
|
|
130
|
-
"offer": {"instance": {"resources": {"cpu_arch"}}}
|
|
131
|
-
}
|
|
132
|
-
if latest_job_submission.exit_status is None:
|
|
133
|
-
latest_job_submission_excludes["exit_status"] = True
|
|
134
|
-
return {"plan": apply_plan_excludes}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def _should_exclude_job_submission_jpd_cpu_arch(job_submission: JobSubmission) -> bool:
|
|
138
|
-
try:
|
|
139
|
-
return job_submission.job_provisioning_data.instance_type.resources.cpu_arch is None
|
|
140
|
-
except AttributeError:
|
|
141
|
-
return True
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def _should_exclude_job_submission_jrd_cpu_arch(job_submission: JobSubmission) -> bool:
|
|
145
|
-
try:
|
|
146
|
-
return job_submission.job_runtime_data.offer.instance.resources.cpu_arch is None
|
|
147
|
-
except AttributeError:
|
|
148
|
-
return True
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def _get_get_plan_excludes(request: GetRunPlanRequest) -> Optional[Dict]:
|
|
152
|
-
"""
|
|
153
|
-
Excludes new fields when they are not set to keep
|
|
154
|
-
clients backward-compatibility with older servers.
|
|
155
|
-
"""
|
|
156
|
-
get_plan_excludes = {}
|
|
157
|
-
run_spec_excludes = _get_run_spec_excludes(request.run_spec)
|
|
158
|
-
if run_spec_excludes is not None:
|
|
159
|
-
get_plan_excludes["run_spec"] = run_spec_excludes
|
|
160
|
-
if request.max_offers is None:
|
|
161
|
-
get_plan_excludes["max_offers"] = True
|
|
162
|
-
return get_plan_excludes
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[Dict]:
|
|
166
|
-
"""
|
|
167
|
-
Returns `run_spec` exclude mapping to exclude certain fields from the request.
|
|
168
|
-
Use this method to exclude new fields when they are not set to keep
|
|
169
|
-
clients backward-compatibility with older servers.
|
|
170
|
-
"""
|
|
171
|
-
spec_excludes: dict[str, Any] = {}
|
|
172
|
-
configuration_excludes: dict[str, Any] = {}
|
|
173
|
-
profile_excludes: set[str] = set()
|
|
174
|
-
configuration = run_spec.configuration
|
|
175
|
-
profile = run_spec.profile
|
|
176
|
-
|
|
177
|
-
if configuration.fleets is None:
|
|
178
|
-
configuration_excludes["fleets"] = True
|
|
179
|
-
if profile is not None and profile.fleets is None:
|
|
180
|
-
profile_excludes.add("fleets")
|
|
181
|
-
if configuration.tags is None:
|
|
182
|
-
configuration_excludes["tags"] = True
|
|
183
|
-
if profile is not None and profile.tags is None:
|
|
184
|
-
profile_excludes.add("tags")
|
|
185
|
-
if isinstance(configuration, ServiceConfiguration) and not configuration.rate_limits:
|
|
186
|
-
configuration_excludes["rate_limits"] = True
|
|
187
|
-
if configuration.shell is None:
|
|
188
|
-
configuration_excludes["shell"] = True
|
|
189
|
-
if configuration.priority is None:
|
|
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")
|
|
199
|
-
|
|
200
|
-
if configuration_excludes:
|
|
201
|
-
spec_excludes["configuration"] = configuration_excludes
|
|
202
|
-
if profile_excludes:
|
|
203
|
-
spec_excludes["profile"] = profile_excludes
|
|
204
|
-
if spec_excludes:
|
|
205
|
-
return spec_excludes
|
|
206
|
-
return None
|
dstack/api/server/_volumes.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import List
|
|
2
2
|
|
|
3
3
|
from pydantic import parse_obj_as
|
|
4
4
|
|
|
5
|
+
from dstack._internal.core.compatibility.volumes import get_create_volume_excludes
|
|
5
6
|
from dstack._internal.core.models.volumes import Volume, VolumeConfiguration
|
|
6
7
|
from dstack._internal.server.schemas.volumes import (
|
|
7
8
|
CreateVolumeRequest,
|
|
@@ -29,22 +30,10 @@ class VolumesAPIClient(APIClientGroup):
|
|
|
29
30
|
body = CreateVolumeRequest(configuration=configuration)
|
|
30
31
|
resp = self._request(
|
|
31
32
|
f"/api/project/{project_name}/volumes/create",
|
|
32
|
-
body=body.json(exclude=
|
|
33
|
+
body=body.json(exclude=get_create_volume_excludes(configuration)),
|
|
33
34
|
)
|
|
34
35
|
return parse_obj_as(Volume.__response__, resp.json())
|
|
35
36
|
|
|
36
37
|
def delete(self, project_name: str, names: List[str]) -> None:
|
|
37
38
|
body = DeleteVolumesRequest(names=names)
|
|
38
39
|
self._request(f"/api/project/{project_name}/volumes/delete", body=body.json())
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def _get_volume_configuration_excludes(configuration: VolumeConfiguration) -> Dict:
|
|
42
|
-
"""
|
|
43
|
-
Returns `configuration` exclude mapping to exclude certain fields from the request.
|
|
44
|
-
Use this method to exclude new fields when they are not set to keep
|
|
45
|
-
clients backward-compatibility with older servers.
|
|
46
|
-
"""
|
|
47
|
-
configuration_excludes = {}
|
|
48
|
-
if configuration.tags is None:
|
|
49
|
-
configuration_excludes["tags"] = True
|
|
50
|
-
return {"configuration": configuration_excludes}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
|
-
from typing import Type
|
|
3
|
+
from typing import Dict, Optional, Type
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
6
|
from pydantic import ValidationError
|
|
7
7
|
|
|
8
|
+
from dstack._internal.core.compatibility.fleets import get_fleet_spec_excludes
|
|
9
|
+
from dstack._internal.core.compatibility.gateways import get_gateway_spec_excludes
|
|
10
|
+
from dstack._internal.core.compatibility.runs import get_run_spec_excludes
|
|
11
|
+
from dstack._internal.core.compatibility.volumes import get_volume_spec_excludes
|
|
8
12
|
from dstack._internal.core.errors import ServerClientError
|
|
9
13
|
from dstack._internal.core.models.fleets import FleetSpec
|
|
10
14
|
from dstack._internal.core.models.gateways import GatewaySpec
|
|
@@ -44,12 +48,17 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
44
48
|
logger.error(f"Plugin service rejected apply request: {response.error}")
|
|
45
49
|
raise ServerClientError(f"Apply request rejected: {response.error}")
|
|
46
50
|
|
|
47
|
-
def _call_plugin_service(
|
|
51
|
+
def _call_plugin_service(
|
|
52
|
+
self,
|
|
53
|
+
spec_request: SpecApplyRequest,
|
|
54
|
+
endpoint: str,
|
|
55
|
+
excludes: Optional[Dict],
|
|
56
|
+
) -> ApplySpec:
|
|
48
57
|
response = None
|
|
49
58
|
try:
|
|
50
59
|
response = requests.post(
|
|
51
60
|
f"{self._plugin_service_uri}{endpoint}",
|
|
52
|
-
json=spec_request.dict(),
|
|
61
|
+
json=spec_request.dict(exclude={"spec": excludes}),
|
|
53
62
|
headers={"accept": "application/json", "Content-Type": "application/json"},
|
|
54
63
|
timeout=PLUGIN_REQUEST_TIMEOUT_SEC,
|
|
55
64
|
)
|
|
@@ -75,10 +84,11 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
75
84
|
user: str,
|
|
76
85
|
project: str,
|
|
77
86
|
spec: ApplySpec,
|
|
87
|
+
excludes: Optional[Dict] = None,
|
|
78
88
|
) -> ApplySpec:
|
|
79
89
|
try:
|
|
80
90
|
spec_request = request_cls(user=user, project=project, spec=spec)
|
|
81
|
-
spec_json = self._call_plugin_service(spec_request, endpoint)
|
|
91
|
+
spec_json = self._call_plugin_service(spec_request, endpoint, excludes)
|
|
82
92
|
response = response_cls(**spec_json)
|
|
83
93
|
self._check_request_rejected(response)
|
|
84
94
|
return response.spec
|
|
@@ -88,7 +98,13 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
88
98
|
|
|
89
99
|
def on_run_apply(self, user: str, project: str, spec: RunSpec) -> RunSpec:
|
|
90
100
|
return self._on_apply(
|
|
91
|
-
RunSpecRequest,
|
|
101
|
+
RunSpecRequest,
|
|
102
|
+
RunSpecResponse,
|
|
103
|
+
"/apply_policies/on_run_apply",
|
|
104
|
+
user,
|
|
105
|
+
project,
|
|
106
|
+
spec,
|
|
107
|
+
excludes=get_run_spec_excludes(spec),
|
|
92
108
|
)
|
|
93
109
|
|
|
94
110
|
def on_fleet_apply(self, user: str, project: str, spec: FleetSpec) -> FleetSpec:
|
|
@@ -99,6 +115,7 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
99
115
|
user,
|
|
100
116
|
project,
|
|
101
117
|
spec,
|
|
118
|
+
excludes=get_fleet_spec_excludes(spec),
|
|
102
119
|
)
|
|
103
120
|
|
|
104
121
|
def on_volume_apply(self, user: str, project: str, spec: VolumeSpec) -> VolumeSpec:
|
|
@@ -109,6 +126,7 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
109
126
|
user,
|
|
110
127
|
project,
|
|
111
128
|
spec,
|
|
129
|
+
excludes=get_volume_spec_excludes(spec),
|
|
112
130
|
)
|
|
113
131
|
|
|
114
132
|
def on_gateway_apply(self, user: str, project: str, spec: GatewaySpec) -> GatewaySpec:
|
|
@@ -119,6 +137,7 @@ class CustomApplyPolicy(ApplyPolicy):
|
|
|
119
137
|
user,
|
|
120
138
|
project,
|
|
121
139
|
spec,
|
|
140
|
+
excludes=get_gateway_spec_excludes(spec),
|
|
122
141
|
)
|
|
123
142
|
|
|
124
143
|
|
dstack/version.py
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
__version__ = "0.19.
|
|
1
|
+
__version__ = "0.19.13"
|
|
2
2
|
__is_release__ = True
|
|
3
|
-
base_image = "0.
|
|
3
|
+
base_image = "0.9"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dstack
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.13
|
|
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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
dstack/version.py,sha256=
|
|
2
|
+
dstack/version.py,sha256=OwNbB8gHGF6BM_ok6ibCM0DP4eAejg2QWX9OL07NlV0,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
|
|
@@ -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=
|
|
35
|
+
dstack/_internal/cli/services/configurators/run.py,sha256=Dapy7YkwH88veiyYuhNg5PzJ0ubCOsrwIWgBaC8XcJ0,25056
|
|
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=
|
|
42
|
+
dstack/_internal/cli/utils/run.py,sha256=g4rOQ6OPfz2dRhuYKfUDJQD9QGWLqBPRTcdxAgsXTYY,8967
|
|
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
|
|
@@ -51,10 +51,10 @@ dstack/_internal/core/backends/models.py,sha256=aKQOrDEStouuwY4MacSen7SkoyAa6HR6
|
|
|
51
51
|
dstack/_internal/core/backends/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
52
|
dstack/_internal/core/backends/aws/auth.py,sha256=BAe3HAedoAO42Fbv7YhpODKWlyil8M0PuRJsL-_u_kw,978
|
|
53
53
|
dstack/_internal/core/backends/aws/backend.py,sha256=pjROH-S9pgrSMm-Eox_ocL7cTU6mIMRxvURq7Vi-2J8,876
|
|
54
|
-
dstack/_internal/core/backends/aws/compute.py,sha256=
|
|
54
|
+
dstack/_internal/core/backends/aws/compute.py,sha256=fvFkB-SLgOHJNm-CgGcuuwsc3GtU5ctjW823KMA5D4k,36563
|
|
55
55
|
dstack/_internal/core/backends/aws/configurator.py,sha256=gGynfTQW89hUt7acAjVnZnRtCbzhno7l4baCKnBEuQI,7499
|
|
56
56
|
dstack/_internal/core/backends/aws/models.py,sha256=EUCHXHmZnshe3rwI9UtjilwcUMu1Z7MO4Y4-nlZ_IcA,4404
|
|
57
|
-
dstack/_internal/core/backends/aws/resources.py,sha256=
|
|
57
|
+
dstack/_internal/core/backends/aws/resources.py,sha256=ccvdQd2H1DuUupdzMtqf86nkrenYPBJb1k3VgHu5Gp4,23610
|
|
58
58
|
dstack/_internal/core/backends/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
59
|
dstack/_internal/core/backends/azure/auth.py,sha256=CHp3QRNx3tIwkhyOY_l8WU-ElY4Pxhavoy9JSdwr15g,1259
|
|
60
60
|
dstack/_internal/core/backends/azure/backend.py,sha256=XySTor8v_tLkZctDBryrFHrbVzQgNf_RUPkXQYplvwM,746
|
|
@@ -68,7 +68,7 @@ dstack/_internal/core/backends/base/backend.py,sha256=hdFMHED1RMV9GVfLSU0yGhGE-c
|
|
|
68
68
|
dstack/_internal/core/backends/base/compute.py,sha256=D4rRxUHUZOkUfAhmDE6MaS4AyHEPdRVcnS4LxQ-DF9E,28719
|
|
69
69
|
dstack/_internal/core/backends/base/configurator.py,sha256=OCv8N2oxcxy3In2zS1PKiCJ0a-COZwxGjBz2FYkQnfg,3807
|
|
70
70
|
dstack/_internal/core/backends/base/models.py,sha256=Ij0osOl-T-ABsKLoVg2eY81DMkwdWkevAnjXj2QnLXI,532
|
|
71
|
-
dstack/_internal/core/backends/base/offers.py,sha256=
|
|
71
|
+
dstack/_internal/core/backends/base/offers.py,sha256=2BARohq0sJk0a9K0Z4OuIbpIQNSSq8ZTzAnO8pCxO4M,6228
|
|
72
72
|
dstack/_internal/core/backends/cudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
73
73
|
dstack/_internal/core/backends/cudo/api_client.py,sha256=ygq1Gx7ZvwKaifdXtvzDSw4xR4ZH6UWd5J47BjuaGh0,3685
|
|
74
74
|
dstack/_internal/core/backends/cudo/backend.py,sha256=i13YoAkUfIStc3Yyyt_3YmL30eVrKtrhwnE9_B1iBRI,546
|
|
@@ -153,6 +153,11 @@ dstack/_internal/core/backends/vultr/backend.py,sha256=WkPmbUxm3Ysv3_wJjuktQqvvN
|
|
|
153
153
|
dstack/_internal/core/backends/vultr/compute.py,sha256=-6Mw7ADW6HaqzK34I3T5RVhreU9W9CIau1hj1Osi5B4,5957
|
|
154
154
|
dstack/_internal/core/backends/vultr/configurator.py,sha256=YdBeMveKaUDiLESTG3AzpSpQRzevUGpdnCGJx4tUR7g,2190
|
|
155
155
|
dstack/_internal/core/backends/vultr/models.py,sha256=TkqK_lW6w5k_7wsoFiKDb6NXuTrHL6ypVm59FoyaSFY,928
|
|
156
|
+
dstack/_internal/core/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
157
|
+
dstack/_internal/core/compatibility/fleets.py,sha256=Ndrib4Wtam-az1o2O4unBrSj3MpNwIBfU3Q8uSPNGHc,2674
|
|
158
|
+
dstack/_internal/core/compatibility/gateways.py,sha256=gMAHSyhStn1ij51efEhEpUCZg7y8FPeppNITUctJqyU,1284
|
|
159
|
+
dstack/_internal/core/compatibility/runs.py,sha256=L_vo3vIEJ-8AFyHnHxPlGZPypxVmgyYjO7LNbfoRol0,5647
|
|
160
|
+
dstack/_internal/core/compatibility/volumes.py,sha256=WVsnAh3pWEkytFWp9irV4QPfkXCH-rfAUOcye7XDoDs,1252
|
|
156
161
|
dstack/_internal/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
157
162
|
dstack/_internal/core/models/common.py,sha256=XWd79dmFGMrdpTcStH5fVmNXCKE0s7FsIorPL0saQ8w,2138
|
|
158
163
|
dstack/_internal/core/models/config.py,sha256=JJ7rT7dztzTWCY5TkoyxXxTvG5D4IFYhGe7EzwkLOWQ,581
|
|
@@ -160,14 +165,14 @@ dstack/_internal/core/models/configurations.py,sha256=PA_u1gdTBCwKKIiGo7tH95Wv_Z
|
|
|
160
165
|
dstack/_internal/core/models/envs.py,sha256=yq84YRFBILOy4x3XnGcTgYpbZ69eFTCQPgBCr9Ndov4,4969
|
|
161
166
|
dstack/_internal/core/models/fleets.py,sha256=aqDVlZMc71NjLrzwBF3qz-dHzocQT5Qip7QWl8ZbKuA,12263
|
|
162
167
|
dstack/_internal/core/models/gateways.py,sha256=_O8EWwHWLdgNoWY4P4u71KM-uEr5DDp42LXfyv1qMDI,4054
|
|
163
|
-
dstack/_internal/core/models/instances.py,sha256=
|
|
168
|
+
dstack/_internal/core/models/instances.py,sha256=Vwh-D3WB_NBdG_1BPHBEaX60n4MtYksN2gf7zA-icYs,6642
|
|
164
169
|
dstack/_internal/core/models/logs.py,sha256=Lsmtd_NrnChMjBJahUZpFb1j8Xobix9FHWf1L47FOGs,443
|
|
165
170
|
dstack/_internal/core/models/metrics.py,sha256=Xb8hCXUL-ncQ3PMsErIUAJTe9gwh5jyrQ4UQoZbibsc,269
|
|
166
171
|
dstack/_internal/core/models/placement.py,sha256=WJVq5ENJykyRarQzL2EeYQag_9_jV7VSAtR_xoFvPVM,720
|
|
167
172
|
dstack/_internal/core/models/profiles.py,sha256=SSbslQfKoa6Sg8A_Z26xDNTujGZc51we11G5rlqfBpY,11659
|
|
168
173
|
dstack/_internal/core/models/projects.py,sha256=H5ZZRiyUEKifpTFAhl45KBi5ly7ooE0WmI329myK360,643
|
|
169
174
|
dstack/_internal/core/models/resources.py,sha256=rsf6hAhi5bfSb_Z9VcS3UoEG0G8Ohl6ekyrOStLOAqw,14114
|
|
170
|
-
dstack/_internal/core/models/runs.py,sha256=
|
|
175
|
+
dstack/_internal/core/models/runs.py,sha256=q7SZxavNuDippPXfJ_Qd4wWK7kyCrCO456toovwOyKc,22346
|
|
171
176
|
dstack/_internal/core/models/secrets.py,sha256=IQyemsNpSzqOCB-VlVTuc4gyPFmXXO4mhko0Ur0ey3I,221
|
|
172
177
|
dstack/_internal/core/models/server.py,sha256=Hkc1v2s3KOiwslsWVmhUOAzcSeREoG-HD1SzSX9WUGg,152
|
|
173
178
|
dstack/_internal/core/models/services.py,sha256=2Hpi7j0Q1shaf_0wd0C0044AJAmuYi-D3qx3PH849oI,3076
|
|
@@ -247,12 +252,12 @@ dstack/_internal/proxy/lib/testing/auth.py,sha256=-firWTnis9Eogoi58BURv1S-te4Hf9
|
|
|
247
252
|
dstack/_internal/proxy/lib/testing/common.py,sha256=5e2VYboMqjBnUxkvidaWLoQ-uaBGh_hnURb_VJc38q4,1518
|
|
248
253
|
dstack/_internal/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
249
254
|
dstack/_internal/server/alembic.ini,sha256=rTauBJC8Jxlw76KUygW061OFAGV7GhwAStinlaxoYGY,3166
|
|
250
|
-
dstack/_internal/server/app.py,sha256=
|
|
255
|
+
dstack/_internal/server/app.py,sha256=SB2UUorR9OzvWOXBvK4g21kGWZHSu13IdefnnRKrIHQ,11536
|
|
251
256
|
dstack/_internal/server/db.py,sha256=WjuqmjG3QAZmSMCeUaJ_ynbowlHuNAvYCZO649cTPHc,3210
|
|
252
257
|
dstack/_internal/server/deps.py,sha256=31e8SU_ogPJWHIDLkgl7cuC_5V91xbJoLyAj17VanfM,670
|
|
253
258
|
dstack/_internal/server/main.py,sha256=kztKhCYNoHSDyJJQScWfZXE0naNleJOCQULW6dd8SGw,109
|
|
254
259
|
dstack/_internal/server/models.py,sha256=6F_w9kQ2UWfcp5s39zQtUjF9oNh7mCSULnqmmHC3c8M,29695
|
|
255
|
-
dstack/_internal/server/settings.py,sha256=
|
|
260
|
+
dstack/_internal/server/settings.py,sha256=7f2ur03yIElq2y6XvRtWMSOWWycx1jQMqCjksx0lgro,4432
|
|
256
261
|
dstack/_internal/server/background/__init__.py,sha256=8kTbhEHCeXTibsOlHY1HwqIO6gGb4q8fUa2fcDrah1c,3893
|
|
257
262
|
dstack/_internal/server/background/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
258
263
|
dstack/_internal/server/background/tasks/common.py,sha256=N7xSXbf2MoBWgbJ1e3AEzYBTf1Gn-pDXYND8Zr_YCJQ,970
|
|
@@ -386,7 +391,6 @@ dstack/_internal/server/services/prometheus.py,sha256=xq5G-Q2BJup9lS2F6__0wUVTs-
|
|
|
386
391
|
dstack/_internal/server/services/repos.py,sha256=f9ztN7jz_2gvD9hXF5sJwWDVyG2-NHRfjIdSukowPh8,9342
|
|
387
392
|
dstack/_internal/server/services/resources.py,sha256=VRFOih_cMJdc0c2m9nSGsX8vWAJQV3M6N87aqS_JXfw,699
|
|
388
393
|
dstack/_internal/server/services/runs.py,sha256=7nj4iQ6CZT3SEW9h3Vb8CBV65MUSSeQfZwgP_J4YlMo,39179
|
|
389
|
-
dstack/_internal/server/services/storage.py,sha256=6I0xI_3_RpJNbKZwHjDnjrEwXGdHfiaeb5li15T-M1I,1884
|
|
390
394
|
dstack/_internal/server/services/users.py,sha256=W-5xL7zsHNjeG7BBK54RWGvIrBOrw-FF0NcG_z9qhoE,7466
|
|
391
395
|
dstack/_internal/server/services/volumes.py,sha256=vxjFn3ijrvwi9-aXipT0iQgNjgebdwcBRn1mKFL9zAQ,16244
|
|
392
396
|
dstack/_internal/server/services/backends/__init__.py,sha256=Aqo1GoqhZ_FsLEkCcBrvReKSq6E5w4QbBLrDXfGjiKU,13154
|
|
@@ -429,6 +433,10 @@ dstack/_internal/server/services/runner/ssh.py,sha256=H-X0015ZPwYq5tc31ytFF1uNaU
|
|
|
429
433
|
dstack/_internal/server/services/services/__init__.py,sha256=HQz72SNN8W9gUQ5INyO_Wd8TR9j3V6qoHFGEDEI920w,10862
|
|
430
434
|
dstack/_internal/server/services/services/autoscalers.py,sha256=0o_w9La-ex_P3VKG88w_XN3hkLkzryv5l1cH3pkZyAE,4315
|
|
431
435
|
dstack/_internal/server/services/services/options.py,sha256=BEpZbRY4PKFVkNNWxLtY--QISqBL1_aPPzZYLPpRgvM,2234
|
|
436
|
+
dstack/_internal/server/services/storage/__init__.py,sha256=ZjlLdCQiclM7h_dKJM9HXjMJDKCFOAf3yI4iO6K3HHk,1384
|
|
437
|
+
dstack/_internal/server/services/storage/base.py,sha256=eK6wLny_QmRuTUDXo_WaZ8zdGpqduI0VeCO1n_-Yyxc,589
|
|
438
|
+
dstack/_internal/server/services/storage/gcs.py,sha256=XJrbYCiyd3QvxorOPxgT4cPmtDt-7xjWlNsP-ctJmfk,1094
|
|
439
|
+
dstack/_internal/server/services/storage/s3.py,sha256=CLVW4xhtuxmY9lCU_d6JAhcN5UWFB-HYtJ3qbOaZDvU,1311
|
|
432
440
|
dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png,sha256=OOtPkMkLAB5vm5pJZKBQWpRmXgSYgvxH8WgaXIbaJZM,427
|
|
433
441
|
dstack/_internal/server/statics/0cae4d9f0a36034984a7.png,sha256=Z2vD7WPCpPCmSokeW4LcAdFaxYfOTF5UvGYPPhz6ry4,160
|
|
434
442
|
dstack/_internal/server/statics/391de232cc0e30cae513.png,sha256=9JBIW86hk7re23qp3NFMRTzyQE25dJ8-K-6aK-hwfu4,109
|
|
@@ -454,10 +462,10 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
|
|
|
454
462
|
dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
|
|
455
463
|
dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
|
|
456
464
|
dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
|
|
457
|
-
dstack/_internal/server/statics/index.html,sha256=
|
|
458
|
-
dstack/_internal/server/statics/main-
|
|
459
|
-
dstack/_internal/server/statics/main-
|
|
460
|
-
dstack/_internal/server/statics/main-
|
|
465
|
+
dstack/_internal/server/statics/index.html,sha256=E5vDpRhmK0lMacdC6HVyDb2wyQm75uRmsQ2EMwu-3iQ,10468
|
|
466
|
+
dstack/_internal/server/statics/main-2066f1f22ddb4557bcde.js,sha256=Fl7-1DvaGJV7YDrLwcdCdyGQHlh9FRVxVFFGWQYSLgs,6640579
|
|
467
|
+
dstack/_internal/server/statics/main-2066f1f22ddb4557bcde.js.map,sha256=Ip-VpaoYT1iHP6tirCf6RADiZ2rOy2AGGOuSUqNEL00,8709013
|
|
468
|
+
dstack/_internal/server/statics/main-f39c418b05fe14772dd8.css,sha256=Rpuq_7-gUuuWprZuHa4xN0Mkk08_65nmPAF4uXzuT8k,1355497
|
|
461
469
|
dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
|
|
462
470
|
dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
|
|
463
471
|
dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
|
|
@@ -566,17 +574,17 @@ dstack/api/_public/runs.py,sha256=e_-CqkzHJqeUvO_yXbLnmO8ADZEcgRtagZoL5fr2wmU,28
|
|
|
566
574
|
dstack/api/huggingface/__init__.py,sha256=oIrEij3wttLZ1yrywEGvCMd6zswMQrX5pPjrqdSi0UA,2201
|
|
567
575
|
dstack/api/server/__init__.py,sha256=Zyl1M51tifn4pB150yIsh39N96qUgMjg5XplcElHDxg,6097
|
|
568
576
|
dstack/api/server/_backends.py,sha256=tSvJ4j-yp-S-4IYo7pKHluDaSsx6Xbwo08Ff6Do85fo,1639
|
|
569
|
-
dstack/api/server/_fleets.py,sha256=
|
|
570
|
-
dstack/api/server/_gateways.py,sha256=
|
|
577
|
+
dstack/api/server/_fleets.py,sha256=6Duz5-SF1HI4qIkgdJr8OikzDosYtavJZOEyMwyDu_8,2882
|
|
578
|
+
dstack/api/server/_gateways.py,sha256=2wyoERBl9R-uWtBI0AiRgLFLtNRlagQxlcgOWHkAlhA,2274
|
|
571
579
|
dstack/api/server/_group.py,sha256=f9a_YvwZ7s1vDTQhOWHLwm3kO84C5R_zXToD4cxAnvY,432
|
|
572
580
|
dstack/api/server/_logs.py,sha256=ng8QvFAIaoVOVChTK6Wuu5BeM6y7gAdx30KEYRsn9xA,500
|
|
573
581
|
dstack/api/server/_metrics.py,sha256=OPb8sLhI_U605sHOPrELgy0_6cNFLJVfpvr-qkEukRM,670
|
|
574
582
|
dstack/api/server/_projects.py,sha256=g6kNSU6jer8u7Kaut1I0Ft4wRMLBBCQShJf3fOB63hQ,1440
|
|
575
583
|
dstack/api/server/_repos.py,sha256=bqsKuZWyiNLE8UAdSZrYNtk1J3Gu5MXXnTMIoM9jxpI,1770
|
|
576
|
-
dstack/api/server/_runs.py,sha256
|
|
584
|
+
dstack/api/server/_runs.py,sha256=9XjsjH05Q26iagDwv8PZ4PbzG8KfSL1mEOHkem2FZ74,3086
|
|
577
585
|
dstack/api/server/_secrets.py,sha256=VqLfrIcmBJtPxNDRkXTG44H5SWoY788YJapScUukvdY,1576
|
|
578
586
|
dstack/api/server/_users.py,sha256=XzhgGKc5Tsr0-xkz3T6rGyWZ1tO7aYNhLux2eE7dAoY,1738
|
|
579
|
-
dstack/api/server/_volumes.py,sha256=
|
|
587
|
+
dstack/api/server/_volumes.py,sha256=dL_DS0edjdXnW8vIjdDpxHhRMBdHAjjnyUhRFvQd0sE,1523
|
|
580
588
|
dstack/api/server/utils.py,sha256=i1KX4CNXVeDj9CnytdzsJz0bxjvvfLRTb7xw8oqtEtQ,1040
|
|
581
589
|
dstack/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
582
590
|
dstack/plugins/__init__.py,sha256=buT1pcyORLgVbl89ATkRWJPhvejriVz7sNBjvuZRCRE,403
|
|
@@ -586,9 +594,9 @@ dstack/plugins/_utils.py,sha256=FqeWYb7zOrgZkO9Bd8caL5I81_TUEsysIzvxsULrmzk,392
|
|
|
586
594
|
dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
587
595
|
dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
|
|
588
596
|
dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
|
|
589
|
-
dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=
|
|
590
|
-
dstack-0.19.
|
|
591
|
-
dstack-0.19.
|
|
592
|
-
dstack-0.19.
|
|
593
|
-
dstack-0.19.
|
|
594
|
-
dstack-0.19.
|
|
597
|
+
dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=iv8TmQh959iEUZjCFTzmGnFW8fHukTVpPmD4iBzOfS4,5361
|
|
598
|
+
dstack-0.19.13.dist-info/METADATA,sha256=NGfazUY-dpac2klfg5O7t1cnoRu93oBi_2uaoFLXaXg,20513
|
|
599
|
+
dstack-0.19.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
600
|
+
dstack-0.19.13.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
|
|
601
|
+
dstack-0.19.13.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
|
|
602
|
+
dstack-0.19.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|