11from typing import Optional
22
33from dstack ._internal .core .models .common import IncludeExcludeDictType , IncludeExcludeSetType
4- from dstack ._internal .core .models .configurations import LEGACY_REPO_DIR , ServiceConfiguration
5- from dstack ._internal .core .models .runs import ApplyRunPlanInput , JobSpec , JobSubmission , RunSpec
4+ from dstack ._internal .core .models .runs import ApplyRunPlanInput , JobSpec , RunSpec
65from dstack ._internal .server .schemas .runs import GetRunPlanRequest , ListRunsRequest
7- from dstack ._internal .settings import FeatureFlags
86
97
108def get_list_runs_excludes (list_runs_request : ListRunsRequest ) -> IncludeExcludeSetType :
11- excludes = set ()
12- if list_runs_request .include_jobs :
13- excludes .add ("include_jobs" )
14- if list_runs_request .job_submissions_limit is None :
15- excludes .add ("job_submissions_limit" )
9+ excludes : IncludeExcludeSetType = set ()
1610 return excludes
1711
1812
@@ -29,82 +23,7 @@ def get_apply_plan_excludes(plan: ApplyRunPlanInput) -> Optional[IncludeExcludeD
2923 current_resource = plan .current_resource
3024 if current_resource is not None :
3125 current_resource_excludes : IncludeExcludeDictType = {}
32- current_resource_excludes ["status_message" ] = True
33- if current_resource .deployment_num == 0 :
34- current_resource_excludes ["deployment_num" ] = True
35- if current_resource .fleet is None :
36- current_resource_excludes ["fleet" ] = True
37- if current_resource .next_triggered_at is None :
38- current_resource_excludes ["next_triggered_at" ] = True
39- apply_plan_excludes ["current_resource" ] = current_resource_excludes
4026 current_resource_excludes ["run_spec" ] = get_run_spec_excludes (current_resource .run_spec )
41- job_submissions_excludes : IncludeExcludeDictType = {}
42- current_resource_excludes ["jobs" ] = {
43- "__all__" : {
44- "job_spec" : get_job_spec_excludes ([job .job_spec for job in current_resource .jobs ]),
45- "job_submissions" : {"__all__" : job_submissions_excludes },
46- }
47- }
48- job_submissions = [js for j in current_resource .jobs for js in j .job_submissions ]
49- if all (map (_should_exclude_job_submission_jpd_cpu_arch , job_submissions )):
50- job_submissions_excludes ["job_provisioning_data" ] = {
51- "instance_type" : {"resources" : {"cpu_arch" }}
52- }
53- jrd_offer_excludes = {}
54- if any (
55- js .job_runtime_data and js .job_runtime_data .offer for js in job_submissions
56- ) and all (
57- not js .job_runtime_data
58- or not js .job_runtime_data .offer
59- or not js .job_runtime_data .offer .backend_data
60- for js in job_submissions
61- ):
62- jrd_offer_excludes ["backend_data" ] = True
63- if all (map (_should_exclude_job_submission_jrd_cpu_arch , job_submissions )):
64- jrd_offer_excludes ["instance" ] = {"resources" : {"cpu_arch" }}
65- if jrd_offer_excludes :
66- job_submissions_excludes ["job_runtime_data" ] = {"offer" : jrd_offer_excludes }
67- if all (js .exit_status is None for js in job_submissions ):
68- job_submissions_excludes ["exit_status" ] = True
69- if all (js .status_message == "" for js in job_submissions ):
70- job_submissions_excludes ["status_message" ] = True
71- if all (js .error is None for js in job_submissions ):
72- job_submissions_excludes ["error" ] = True
73- if all (js .deployment_num == 0 for js in job_submissions ):
74- job_submissions_excludes ["deployment_num" ] = True
75- if all (not js .probes for js in job_submissions ):
76- job_submissions_excludes ["probes" ] = True
77- latest_job_submission = current_resource .latest_job_submission
78- if latest_job_submission is not None :
79- latest_job_submission_excludes : IncludeExcludeDictType = {}
80- current_resource_excludes ["latest_job_submission" ] = latest_job_submission_excludes
81- if _should_exclude_job_submission_jpd_cpu_arch (latest_job_submission ):
82- latest_job_submission_excludes ["job_provisioning_data" ] = {
83- "instance_type" : {"resources" : {"cpu_arch" }}
84- }
85- latest_job_submission_jrd_offer_excludes = {}
86- if (
87- latest_job_submission .job_runtime_data
88- and latest_job_submission .job_runtime_data .offer
89- and not latest_job_submission .job_runtime_data .offer .backend_data
90- ):
91- latest_job_submission_jrd_offer_excludes ["backend_data" ] = True
92- if _should_exclude_job_submission_jrd_cpu_arch (latest_job_submission ):
93- latest_job_submission_jrd_offer_excludes ["instance" ] = {"resources" : {"cpu_arch" }}
94- if latest_job_submission_jrd_offer_excludes :
95- latest_job_submission_excludes ["job_runtime_data" ] = {
96- "offer" : latest_job_submission_jrd_offer_excludes
97- }
98- if latest_job_submission .exit_status is None :
99- latest_job_submission_excludes ["exit_status" ] = True
100- if latest_job_submission .status_message == "" :
101- latest_job_submission_excludes ["status_message" ] = True
102- if latest_job_submission .error is None :
103- latest_job_submission_excludes ["error" ] = True
104- if latest_job_submission .deployment_num == 0 :
105- latest_job_submission_excludes ["deployment_num" ] = True
106- if not latest_job_submission .probes :
107- latest_job_submission_excludes ["probes" ] = True
10827 return {"plan" : apply_plan_excludes }
10928
11029
@@ -117,8 +36,6 @@ def get_get_plan_excludes(request: GetRunPlanRequest) -> Optional[IncludeExclude
11736 run_spec_excludes = get_run_spec_excludes (request .run_spec )
11837 if run_spec_excludes is not None :
11938 get_plan_excludes ["run_spec" ] = run_spec_excludes
120- if request .max_offers is None :
121- get_plan_excludes ["max_offers" ] = True
12239 return get_plan_excludes
12340
12441
@@ -131,53 +48,13 @@ def get_run_spec_excludes(run_spec: RunSpec) -> IncludeExcludeDictType:
13148 spec_excludes : IncludeExcludeDictType = {}
13249 configuration_excludes : IncludeExcludeDictType = {}
13350 profile_excludes : IncludeExcludeSetType = set ()
134- configuration = run_spec .configuration
135- profile = run_spec .profile
13651
137- if not FeatureFlags .LEGACY_REPO_DIR_DISABLED :
138- if run_spec .repo_dir in [None , LEGACY_REPO_DIR ]:
139- spec_excludes ["repo_dir" ] = True
140- elif run_spec .repo_dir == "." and configuration .working_dir in [
141- None ,
142- LEGACY_REPO_DIR ,
143- "." ,
144- ]:
145- spec_excludes ["repo_dir" ] = True
146-
147- if configuration .fleets is None :
148- configuration_excludes ["fleets" ] = True
149- if profile is not None and profile .fleets is None :
150- profile_excludes .add ("fleets" )
151- if configuration .tags is None :
152- configuration_excludes ["tags" ] = True
153- if profile is not None and profile .tags is None :
154- profile_excludes .add ("tags" )
155- if isinstance (configuration , ServiceConfiguration ) and not configuration .rate_limits :
156- configuration_excludes ["rate_limits" ] = True
157- if configuration .shell is None :
158- configuration_excludes ["shell" ] = True
159- if configuration .docker is None :
160- configuration_excludes ["docker" ] = True
161- if configuration .priority is None :
162- configuration_excludes ["priority" ] = True
163- if configuration .startup_order is None :
164- configuration_excludes ["startup_order" ] = True
165- if profile is not None and profile .startup_order is None :
166- profile_excludes .add ("startup_order" )
167- if configuration .stop_criteria is None :
168- configuration_excludes ["stop_criteria" ] = True
169- if isinstance (configuration , ServiceConfiguration ) and not configuration .probes :
170- configuration_excludes ["probes" ] = True
171- if profile is not None and profile .stop_criteria is None :
172- profile_excludes .add ("stop_criteria" )
173- if not configuration .files :
174- configuration_excludes ["files" ] = True
175- if not run_spec .file_archives :
176- spec_excludes ["file_archives" ] = True
177- if configuration .schedule is None :
178- configuration_excludes ["schedule" ] = True
179- if profile is not None and profile .schedule is None :
180- profile_excludes .add ("schedule" )
52+ # Add excludes like this:
53+ #
54+ # if run_spec.configuration.tags is None:
55+ # configuration_excludes["tags"] = True
56+ # if run_spec.profile is not None and run_spec.profile.tags is None:
57+ # profile_excludes.add("tags")
18158
18259 if configuration_excludes :
18360 spec_excludes ["configuration" ] = configuration_excludes
@@ -193,34 +70,4 @@ def get_job_spec_excludes(job_specs: list[JobSpec]) -> IncludeExcludeDictType:
19370 clients backward-compatibility with older servers.
19471 """
19572 spec_excludes : IncludeExcludeDictType = {}
196-
197- if all (s .repo_code_hash is None for s in job_specs ):
198- spec_excludes ["repo_code_hash" ] = True
199- if all (s .repo_data is None for s in job_specs ):
200- spec_excludes ["repo_data" ] = True
201- if all (not s .file_archives for s in job_specs ):
202- spec_excludes ["file_archives" ] = True
203- if all (s .service_port is None for s in job_specs ):
204- spec_excludes ["service_port" ] = True
205- if all (not s .probes for s in job_specs ):
206- spec_excludes ["probes" ] = True
207- if all (s .repo_dir in [None , LEGACY_REPO_DIR ] for s in job_specs ):
208- spec_excludes ["repo_dir" ] = True
209- if all (s .requirements .multinode is None for s in job_specs ):
210- spec_excludes ["requirements" ] = {"multinode" : True }
211-
21273 return spec_excludes
213-
214-
215- def _should_exclude_job_submission_jpd_cpu_arch (job_submission : JobSubmission ) -> bool :
216- try :
217- return job_submission .job_provisioning_data .instance_type .resources .cpu_arch is None
218- except AttributeError :
219- return True
220-
221-
222- def _should_exclude_job_submission_jrd_cpu_arch (job_submission : JobSubmission ) -> bool :
223- try :
224- return job_submission .job_runtime_data .offer .instance .resources .cpu_arch is None
225- except AttributeError :
226- return True
0 commit comments