skypilot-nightly 1.0.0.dev20250410__py3-none-any.whl → 1.0.0.dev20250411__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.
- sky/__init__.py +2 -2
- sky/client/common.py +4 -2
- sky/client/sdk.py +58 -26
- sky/jobs/client/sdk.py +5 -0
- sky/optimizer.py +1 -2
- sky/serve/client/sdk.py +6 -0
- sky/server/common.py +16 -1
- sky/server/constants.py +5 -0
- sky/skypilot_config.py +19 -30
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/METADATA +1 -1
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/RECORD +15 -15
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/top_level.txt +0 -0
sky/__init__.py
CHANGED
@@ -5,7 +5,7 @@ from typing import Optional
|
|
5
5
|
import urllib.request
|
6
6
|
|
7
7
|
# Replaced with the current commit when building the wheels.
|
8
|
-
_SKYPILOT_COMMIT_SHA = '
|
8
|
+
_SKYPILOT_COMMIT_SHA = 'b4202948016cdf48a5939ea9bf1769a2d31f73bf'
|
9
9
|
|
10
10
|
|
11
11
|
def _get_git_commit():
|
@@ -35,7 +35,7 @@ def _get_git_commit():
|
|
35
35
|
|
36
36
|
|
37
37
|
__commit__ = _get_git_commit()
|
38
|
-
__version__ = '1.0.0.
|
38
|
+
__version__ = '1.0.0.dev20250411'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
sky/client/common.py
CHANGED
@@ -75,7 +75,8 @@ def download_logs_from_api_server(
|
|
75
75
|
body = payloads.DownloadBody(folder_paths=list(paths_on_api_server),)
|
76
76
|
response = requests.post(f'{server_common.get_server_url()}/download',
|
77
77
|
json=json.loads(body.model_dump_json()),
|
78
|
-
stream=True
|
78
|
+
stream=True,
|
79
|
+
cookies=server_common.get_api_cookie_jar())
|
79
80
|
if response.status_code == 200:
|
80
81
|
remote_home_path = response.headers.get('X-Home-Path')
|
81
82
|
assert remote_home_path is not None, response.headers
|
@@ -176,7 +177,8 @@ def _upload_chunk_with_retry(params: UploadChunkParams) -> None:
|
|
176
177
|
},
|
177
178
|
content=FileChunkIterator(f, _UPLOAD_CHUNK_BYTES,
|
178
179
|
params.chunk_index),
|
179
|
-
headers={'Content-Type': 'application/octet-stream'}
|
180
|
+
headers={'Content-Type': 'application/octet-stream'},
|
181
|
+
cookies=server_common.get_api_cookie_jar())
|
180
182
|
if response.status_code == 200:
|
181
183
|
data = response.json()
|
182
184
|
status = data.get('status')
|
sky/client/sdk.py
CHANGED
@@ -102,7 +102,8 @@ def check(clouds: Optional[Tuple[str]],
|
|
102
102
|
"""
|
103
103
|
body = payloads.CheckBody(clouds=clouds, verbose=verbose)
|
104
104
|
response = requests.post(f'{server_common.get_server_url()}/check',
|
105
|
-
json=json.loads(body.model_dump_json())
|
105
|
+
json=json.loads(body.model_dump_json()),
|
106
|
+
cookies=server_common.get_api_cookie_jar())
|
106
107
|
return server_common.get_request_id(response)
|
107
108
|
|
108
109
|
|
@@ -118,7 +119,8 @@ def enabled_clouds() -> server_common.RequestId:
|
|
118
119
|
Request Returns:
|
119
120
|
A list of enabled clouds in string format.
|
120
121
|
"""
|
121
|
-
response = requests.get(f'{server_common.get_server_url()}/enabled_clouds'
|
122
|
+
response = requests.get(f'{server_common.get_server_url()}/enabled_clouds',
|
123
|
+
cookies=server_common.get_api_cookie_jar())
|
122
124
|
return server_common.get_request_id(response)
|
123
125
|
|
124
126
|
|
@@ -168,7 +170,8 @@ def list_accelerators(gpus_only: bool = True,
|
|
168
170
|
)
|
169
171
|
response = requests.post(
|
170
172
|
f'{server_common.get_server_url()}/list_accelerators',
|
171
|
-
json=json.loads(body.model_dump_json())
|
173
|
+
json=json.loads(body.model_dump_json()),
|
174
|
+
cookies=server_common.get_api_cookie_jar())
|
172
175
|
return server_common.get_request_id(response)
|
173
176
|
|
174
177
|
|
@@ -208,7 +211,8 @@ def list_accelerator_counts(
|
|
208
211
|
)
|
209
212
|
response = requests.post(
|
210
213
|
f'{server_common.get_server_url()}/list_accelerator_counts',
|
211
|
-
json=json.loads(body.model_dump_json())
|
214
|
+
json=json.loads(body.model_dump_json()),
|
215
|
+
cookies=server_common.get_api_cookie_jar())
|
212
216
|
return server_common.get_request_id(response)
|
213
217
|
|
214
218
|
|
@@ -246,7 +250,8 @@ def optimize(
|
|
246
250
|
minimize=minimize,
|
247
251
|
request_options=admin_policy_request_options)
|
248
252
|
response = requests.post(f'{server_common.get_server_url()}/optimize',
|
249
|
-
json=json.loads(body.model_dump_json())
|
253
|
+
json=json.loads(body.model_dump_json()),
|
254
|
+
cookies=server_common.get_api_cookie_jar())
|
250
255
|
return server_common.get_request_id(response)
|
251
256
|
|
252
257
|
|
@@ -281,7 +286,8 @@ def validate(
|
|
281
286
|
body = payloads.ValidateBody(dag=dag_str,
|
282
287
|
request_options=admin_policy_request_options)
|
283
288
|
response = requests.post(f'{server_common.get_server_url()}/validate',
|
284
|
-
json=json.loads(body.model_dump_json())
|
289
|
+
json=json.loads(body.model_dump_json()),
|
290
|
+
cookies=server_common.get_api_cookie_jar())
|
285
291
|
if response.status_code == 400:
|
286
292
|
with ux_utils.print_exception_no_traceback():
|
287
293
|
raise exceptions.deserialize_exception(
|
@@ -493,6 +499,7 @@ def launch(
|
|
493
499
|
f'{server_common.get_server_url()}/launch',
|
494
500
|
json=json.loads(body.model_dump_json()),
|
495
501
|
timeout=5,
|
502
|
+
cookies=server_common.get_api_cookie_jar(),
|
496
503
|
)
|
497
504
|
return server_common.get_request_id(response)
|
498
505
|
|
@@ -576,6 +583,7 @@ def exec( # pylint: disable=redefined-builtin
|
|
576
583
|
f'{server_common.get_server_url()}/exec',
|
577
584
|
json=json.loads(body.model_dump_json()),
|
578
585
|
timeout=5,
|
586
|
+
cookies=server_common.get_api_cookie_jar(),
|
579
587
|
)
|
580
588
|
return server_common.get_request_id(response)
|
581
589
|
|
@@ -626,7 +634,8 @@ def tail_logs(cluster_name: str,
|
|
626
634
|
json=json.loads(body.model_dump_json()),
|
627
635
|
stream=True,
|
628
636
|
timeout=(client_common.API_SERVER_REQUEST_CONNECTION_TIMEOUT_SECONDS,
|
629
|
-
None)
|
637
|
+
None),
|
638
|
+
cookies=server_common.get_api_cookie_jar())
|
630
639
|
request_id = server_common.get_request_id(response)
|
631
640
|
return stream_response(request_id, response, output_stream)
|
632
641
|
|
@@ -663,7 +672,8 @@ def download_logs(cluster_name: str,
|
|
663
672
|
job_ids=job_ids,
|
664
673
|
)
|
665
674
|
response = requests.post(f'{server_common.get_server_url()}/download_logs',
|
666
|
-
json=json.loads(body.model_dump_json())
|
675
|
+
json=json.loads(body.model_dump_json()),
|
676
|
+
cookies=server_common.get_api_cookie_jar())
|
667
677
|
job_id_remote_path_dict = stream_and_get(
|
668
678
|
server_common.get_request_id(response))
|
669
679
|
remote2local_path_dict = client_common.download_logs_from_api_server(
|
@@ -745,6 +755,7 @@ def start(
|
|
745
755
|
f'{server_common.get_server_url()}/start',
|
746
756
|
json=json.loads(body.model_dump_json()),
|
747
757
|
timeout=5,
|
758
|
+
cookies=server_common.get_api_cookie_jar(),
|
748
759
|
)
|
749
760
|
return server_common.get_request_id(response)
|
750
761
|
|
@@ -790,6 +801,7 @@ def down(cluster_name: str, purge: bool = False) -> server_common.RequestId:
|
|
790
801
|
f'{server_common.get_server_url()}/down',
|
791
802
|
json=json.loads(body.model_dump_json()),
|
792
803
|
timeout=5,
|
804
|
+
cookies=server_common.get_api_cookie_jar(),
|
793
805
|
)
|
794
806
|
return server_common.get_request_id(response)
|
795
807
|
|
@@ -838,6 +850,7 @@ def stop(cluster_name: str, purge: bool = False) -> server_common.RequestId:
|
|
838
850
|
f'{server_common.get_server_url()}/stop',
|
839
851
|
json=json.loads(body.model_dump_json()),
|
840
852
|
timeout=5,
|
853
|
+
cookies=server_common.get_api_cookie_jar(),
|
841
854
|
)
|
842
855
|
return server_common.get_request_id(response)
|
843
856
|
|
@@ -907,6 +920,7 @@ def autostop(
|
|
907
920
|
f'{server_common.get_server_url()}/autostop',
|
908
921
|
json=json.loads(body.model_dump_json()),
|
909
922
|
timeout=5,
|
923
|
+
cookies=server_common.get_api_cookie_jar(),
|
910
924
|
)
|
911
925
|
return server_common.get_request_id(response)
|
912
926
|
|
@@ -966,7 +980,8 @@ def queue(cluster_name: str,
|
|
966
980
|
all_users=all_users,
|
967
981
|
)
|
968
982
|
response = requests.post(f'{server_common.get_server_url()}/queue',
|
969
|
-
json=json.loads(body.model_dump_json())
|
983
|
+
json=json.loads(body.model_dump_json()),
|
984
|
+
cookies=server_common.get_api_cookie_jar())
|
970
985
|
return server_common.get_request_id(response)
|
971
986
|
|
972
987
|
|
@@ -1007,7 +1022,8 @@ def job_status(cluster_name: str,
|
|
1007
1022
|
job_ids=job_ids,
|
1008
1023
|
)
|
1009
1024
|
response = requests.post(f'{server_common.get_server_url()}/job_status',
|
1010
|
-
json=json.loads(body.model_dump_json())
|
1025
|
+
json=json.loads(body.model_dump_json()),
|
1026
|
+
cookies=server_common.get_api_cookie_jar())
|
1011
1027
|
return server_common.get_request_id(response)
|
1012
1028
|
|
1013
1029
|
|
@@ -1060,7 +1076,8 @@ def cancel(
|
|
1060
1076
|
try_cancel_if_cluster_is_init=_try_cancel_if_cluster_is_init,
|
1061
1077
|
)
|
1062
1078
|
response = requests.post(f'{server_common.get_server_url()}/cancel',
|
1063
|
-
json=json.loads(body.model_dump_json())
|
1079
|
+
json=json.loads(body.model_dump_json()),
|
1080
|
+
cookies=server_common.get_api_cookie_jar())
|
1064
1081
|
return server_common.get_request_id(response)
|
1065
1082
|
|
1066
1083
|
|
@@ -1155,7 +1172,8 @@ def status(
|
|
1155
1172
|
all_users=all_users,
|
1156
1173
|
)
|
1157
1174
|
response = requests.post(f'{server_common.get_server_url()}/status',
|
1158
|
-
json=json.loads(body.model_dump_json())
|
1175
|
+
json=json.loads(body.model_dump_json()),
|
1176
|
+
cookies=server_common.get_api_cookie_jar())
|
1159
1177
|
return server_common.get_request_id(response)
|
1160
1178
|
|
1161
1179
|
|
@@ -1189,7 +1207,8 @@ def endpoints(
|
|
1189
1207
|
port=port,
|
1190
1208
|
)
|
1191
1209
|
response = requests.post(f'{server_common.get_server_url()}/endpoints',
|
1192
|
-
json=json.loads(body.model_dump_json())
|
1210
|
+
json=json.loads(body.model_dump_json()),
|
1211
|
+
cookies=server_common.get_api_cookie_jar())
|
1193
1212
|
return server_common.get_request_id(response)
|
1194
1213
|
|
1195
1214
|
|
@@ -1227,7 +1246,8 @@ def cost_report() -> server_common.RequestId: # pylint: disable=redefined-built
|
|
1227
1246
|
'total_cost': (float) cost given resources and usage intervals,
|
1228
1247
|
}
|
1229
1248
|
"""
|
1230
|
-
response = requests.get(f'{server_common.get_server_url()}/cost_report'
|
1249
|
+
response = requests.get(f'{server_common.get_server_url()}/cost_report',
|
1250
|
+
cookies=server_common.get_api_cookie_jar())
|
1231
1251
|
return server_common.get_request_id(response)
|
1232
1252
|
|
1233
1253
|
|
@@ -1256,7 +1276,8 @@ def storage_ls() -> server_common.RequestId:
|
|
1256
1276
|
}
|
1257
1277
|
]
|
1258
1278
|
"""
|
1259
|
-
response = requests.get(f'{server_common.get_server_url()}/storage/ls'
|
1279
|
+
response = requests.get(f'{server_common.get_server_url()}/storage/ls',
|
1280
|
+
cookies=server_common.get_api_cookie_jar())
|
1260
1281
|
return server_common.get_request_id(response)
|
1261
1282
|
|
1262
1283
|
|
@@ -1280,7 +1301,8 @@ def storage_delete(name: str) -> server_common.RequestId:
|
|
1280
1301
|
"""
|
1281
1302
|
body = payloads.StorageBody(name=name)
|
1282
1303
|
response = requests.post(f'{server_common.get_server_url()}/storage/delete',
|
1283
|
-
json=json.loads(body.model_dump_json())
|
1304
|
+
json=json.loads(body.model_dump_json()),
|
1305
|
+
cookies=server_common.get_api_cookie_jar())
|
1284
1306
|
return server_common.get_request_id(response)
|
1285
1307
|
|
1286
1308
|
|
@@ -1318,7 +1340,8 @@ def local_up(gpus: bool,
|
|
1318
1340
|
context_name=context_name,
|
1319
1341
|
password=password)
|
1320
1342
|
response = requests.post(f'{server_common.get_server_url()}/local_up',
|
1321
|
-
json=json.loads(body.model_dump_json())
|
1343
|
+
json=json.loads(body.model_dump_json()),
|
1344
|
+
cookies=server_common.get_api_cookie_jar())
|
1322
1345
|
return server_common.get_request_id(response)
|
1323
1346
|
|
1324
1347
|
|
@@ -1334,7 +1357,8 @@ def local_down() -> server_common.RequestId:
|
|
1334
1357
|
with ux_utils.print_exception_no_traceback():
|
1335
1358
|
raise ValueError('sky local down is only supported when running '
|
1336
1359
|
'SkyPilot locally.')
|
1337
|
-
response = requests.post(f'{server_common.get_server_url()}/local_down'
|
1360
|
+
response = requests.post(f'{server_common.get_server_url()}/local_down',
|
1361
|
+
cookies=server_common.get_api_cookie_jar())
|
1338
1362
|
return server_common.get_request_id(response)
|
1339
1363
|
|
1340
1364
|
|
@@ -1358,7 +1382,8 @@ def realtime_kubernetes_gpu_availability(
|
|
1358
1382
|
response = requests.post(
|
1359
1383
|
f'{server_common.get_server_url()}/'
|
1360
1384
|
'realtime_kubernetes_gpu_availability',
|
1361
|
-
json=json.loads(body.model_dump_json())
|
1385
|
+
json=json.loads(body.model_dump_json()),
|
1386
|
+
cookies=server_common.get_api_cookie_jar())
|
1362
1387
|
return server_common.get_request_id(response)
|
1363
1388
|
|
1364
1389
|
|
@@ -1389,7 +1414,8 @@ def kubernetes_node_info(
|
|
1389
1414
|
body = payloads.KubernetesNodeInfoRequestBody(context=context)
|
1390
1415
|
response = requests.post(
|
1391
1416
|
f'{server_common.get_server_url()}/kubernetes_node_info',
|
1392
|
-
json=json.loads(body.model_dump_json())
|
1417
|
+
json=json.loads(body.model_dump_json()),
|
1418
|
+
cookies=server_common.get_api_cookie_jar())
|
1393
1419
|
return server_common.get_request_id(response)
|
1394
1420
|
|
1395
1421
|
|
@@ -1418,7 +1444,8 @@ def status_kubernetes() -> server_common.RequestId:
|
|
1418
1444
|
- context: Kubernetes context used to fetch the cluster information.
|
1419
1445
|
"""
|
1420
1446
|
response = requests.get(
|
1421
|
-
f'{server_common.get_server_url()}/status_kubernetes'
|
1447
|
+
f'{server_common.get_server_url()}/status_kubernetes',
|
1448
|
+
cookies=server_common.get_api_cookie_jar())
|
1422
1449
|
return server_common.get_request_id(response)
|
1423
1450
|
|
1424
1451
|
|
@@ -1444,7 +1471,8 @@ def get(request_id: str) -> Any:
|
|
1444
1471
|
response = requests.get(
|
1445
1472
|
f'{server_common.get_server_url()}/api/get?request_id={request_id}',
|
1446
1473
|
timeout=(client_common.API_SERVER_REQUEST_CONNECTION_TIMEOUT_SECONDS,
|
1447
|
-
None)
|
1474
|
+
None),
|
1475
|
+
cookies=server_common.get_api_cookie_jar())
|
1448
1476
|
request_task = None
|
1449
1477
|
if response.status_code == 200:
|
1450
1478
|
request_task = requests_lib.Request.decode(
|
@@ -1523,7 +1551,8 @@ def stream_and_get(
|
|
1523
1551
|
params=params,
|
1524
1552
|
timeout=(client_common.API_SERVER_REQUEST_CONNECTION_TIMEOUT_SECONDS,
|
1525
1553
|
None),
|
1526
|
-
stream=True
|
1554
|
+
stream=True,
|
1555
|
+
cookies=server_common.get_api_cookie_jar())
|
1527
1556
|
if response.status_code in [404, 400]:
|
1528
1557
|
detail = response.json().get('detail')
|
1529
1558
|
with ux_utils.print_exception_no_traceback():
|
@@ -1579,7 +1608,8 @@ def api_cancel(request_ids: Optional[Union[str, List[str]]] = None,
|
|
1579
1608
|
|
1580
1609
|
response = requests.post(f'{server_common.get_server_url()}/api/cancel',
|
1581
1610
|
json=json.loads(body.model_dump_json()),
|
1582
|
-
timeout=5
|
1611
|
+
timeout=5,
|
1612
|
+
cookies=server_common.get_api_cookie_jar())
|
1583
1613
|
return server_common.get_request_id(response)
|
1584
1614
|
|
1585
1615
|
|
@@ -1607,7 +1637,8 @@ def api_status(
|
|
1607
1637
|
f'{server_common.get_server_url()}/api/status',
|
1608
1638
|
params=server_common.request_body_to_params(body),
|
1609
1639
|
timeout=(client_common.API_SERVER_REQUEST_CONNECTION_TIMEOUT_SECONDS,
|
1610
|
-
None)
|
1640
|
+
None),
|
1641
|
+
cookies=server_common.get_api_cookie_jar())
|
1611
1642
|
server_common.handle_request_error(response)
|
1612
1643
|
return [
|
1613
1644
|
requests_lib.RequestPayload(**request) for request in response.json()
|
@@ -1634,7 +1665,8 @@ def api_info() -> Dict[str, str]:
|
|
1634
1665
|
}
|
1635
1666
|
|
1636
1667
|
"""
|
1637
|
-
response = requests.get(f'{server_common.get_server_url()}/api/health'
|
1668
|
+
response = requests.get(f'{server_common.get_server_url()}/api/health',
|
1669
|
+
cookies=server_common.get_api_cookie_jar())
|
1638
1670
|
response.raise_for_status()
|
1639
1671
|
return response.json()
|
1640
1672
|
|
sky/jobs/client/sdk.py
CHANGED
@@ -82,6 +82,7 @@ def launch(
|
|
82
82
|
f'{server_common.get_server_url()}/jobs/launch',
|
83
83
|
json=json.loads(body.model_dump_json()),
|
84
84
|
timeout=(5, None),
|
85
|
+
cookies=server_common.get_api_cookie_jar(),
|
85
86
|
)
|
86
87
|
return server_common.get_request_id(response)
|
87
88
|
|
@@ -138,6 +139,7 @@ def queue(refresh: bool,
|
|
138
139
|
f'{server_common.get_server_url()}/jobs/queue',
|
139
140
|
json=json.loads(body.model_dump_json()),
|
140
141
|
timeout=(5, None),
|
142
|
+
cookies=server_common.get_api_cookie_jar(),
|
141
143
|
)
|
142
144
|
return server_common.get_request_id(response=response)
|
143
145
|
|
@@ -177,6 +179,7 @@ def cancel(
|
|
177
179
|
f'{server_common.get_server_url()}/jobs/cancel',
|
178
180
|
json=json.loads(body.model_dump_json()),
|
179
181
|
timeout=(5, None),
|
182
|
+
cookies=server_common.get_api_cookie_jar(),
|
180
183
|
)
|
181
184
|
return server_common.get_request_id(response=response)
|
182
185
|
|
@@ -224,6 +227,7 @@ def tail_logs(name: Optional[str] = None,
|
|
224
227
|
json=json.loads(body.model_dump_json()),
|
225
228
|
stream=True,
|
226
229
|
timeout=(5, None),
|
230
|
+
cookies=server_common.get_api_cookie_jar(),
|
227
231
|
)
|
228
232
|
request_id = server_common.get_request_id(response)
|
229
233
|
return sdk.stream_response(request_id, response, output_stream)
|
@@ -267,6 +271,7 @@ def download_logs(
|
|
267
271
|
f'{server_common.get_server_url()}/jobs/download_logs',
|
268
272
|
json=json.loads(body.model_dump_json()),
|
269
273
|
timeout=(5, None),
|
274
|
+
cookies=server_common.get_api_cookie_jar(),
|
270
275
|
)
|
271
276
|
job_id_remote_path_dict = sdk.stream_and_get(
|
272
277
|
server_common.get_request_id(response))
|
sky/optimizer.py
CHANGED
@@ -6,6 +6,7 @@ import typing
|
|
6
6
|
from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
|
7
7
|
|
8
8
|
import colorama
|
9
|
+
import numpy as np
|
9
10
|
import prettytable
|
10
11
|
|
11
12
|
from sky import check as sky_check
|
@@ -28,12 +29,10 @@ from sky.utils import ux_utils
|
|
28
29
|
|
29
30
|
if typing.TYPE_CHECKING:
|
30
31
|
import networkx as nx
|
31
|
-
import numpy as np
|
32
32
|
|
33
33
|
from sky import dag as dag_lib
|
34
34
|
else:
|
35
35
|
nx = adaptors_common.LazyImport('networkx')
|
36
|
-
np = adaptors_common.LazyImport('numpy')
|
37
36
|
|
38
37
|
logger = sky_logging.init_logger(__name__)
|
39
38
|
|
sky/serve/client/sdk.py
CHANGED
@@ -74,6 +74,7 @@ def up(
|
|
74
74
|
f'{server_common.get_server_url()}/serve/up',
|
75
75
|
json=json.loads(body.model_dump_json()),
|
76
76
|
timeout=(5, None),
|
77
|
+
cookies=server_common.get_api_cookie_jar(),
|
77
78
|
)
|
78
79
|
return server_common.get_request_id(response)
|
79
80
|
|
@@ -132,6 +133,7 @@ def update(
|
|
132
133
|
f'{server_common.get_server_url()}/serve/update',
|
133
134
|
json=json.loads(body.model_dump_json()),
|
134
135
|
timeout=(5, None),
|
136
|
+
cookies=server_common.get_api_cookie_jar(),
|
135
137
|
)
|
136
138
|
return server_common.get_request_id(response)
|
137
139
|
|
@@ -173,6 +175,7 @@ def down(
|
|
173
175
|
f'{server_common.get_server_url()}/serve/down',
|
174
176
|
json=json.loads(body.model_dump_json()),
|
175
177
|
timeout=(5, None),
|
178
|
+
cookies=server_common.get_api_cookie_jar(),
|
176
179
|
)
|
177
180
|
return server_common.get_request_id(response)
|
178
181
|
|
@@ -207,6 +210,7 @@ def terminate_replica(service_name: str, replica_id: int,
|
|
207
210
|
f'{server_common.get_server_url()}/serve/terminate-replica',
|
208
211
|
json=json.loads(body.model_dump_json()),
|
209
212
|
timeout=(5, None),
|
213
|
+
cookies=server_common.get_api_cookie_jar(),
|
210
214
|
)
|
211
215
|
return server_common.get_request_id(response)
|
212
216
|
|
@@ -279,6 +283,7 @@ def status(
|
|
279
283
|
f'{server_common.get_server_url()}/serve/status',
|
280
284
|
json=json.loads(body.model_dump_json()),
|
281
285
|
timeout=(5, None),
|
286
|
+
cookies=server_common.get_api_cookie_jar(),
|
282
287
|
)
|
283
288
|
return server_common.get_request_id(response)
|
284
289
|
|
@@ -365,6 +370,7 @@ def tail_logs(service_name: str,
|
|
365
370
|
json=json.loads(body.model_dump_json()),
|
366
371
|
timeout=(5, None),
|
367
372
|
stream=True,
|
373
|
+
cookies=server_common.get_api_cookie_jar(),
|
368
374
|
)
|
369
375
|
request_id = server_common.get_request_id(response)
|
370
376
|
sdk.stream_response(request_id, response, output_stream)
|
sky/server/common.py
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
import dataclasses
|
4
4
|
import enum
|
5
5
|
import functools
|
6
|
+
from http.cookiejar import MozillaCookieJar
|
6
7
|
import json
|
7
8
|
import os
|
8
9
|
import pathlib
|
@@ -80,6 +81,18 @@ class ApiServerInfo:
|
|
80
81
|
api_version: ApiVersion
|
81
82
|
|
82
83
|
|
84
|
+
def get_api_cookie_jar() -> requests.cookies.RequestsCookieJar:
|
85
|
+
"""Returns the cookie jar used by the client to access the API server."""
|
86
|
+
cookie_file = os.environ.get(server_constants.API_COOKIE_FILE_ENV_VAR)
|
87
|
+
cookie_jar = requests.cookies.RequestsCookieJar()
|
88
|
+
if cookie_file and os.path.exists(cookie_file):
|
89
|
+
cookie_path = pathlib.Path(cookie_file).expanduser().resolve()
|
90
|
+
file_cookie_jar = MozillaCookieJar(cookie_path)
|
91
|
+
file_cookie_jar.load()
|
92
|
+
cookie_jar.update(file_cookie_jar)
|
93
|
+
return cookie_jar
|
94
|
+
|
95
|
+
|
83
96
|
@annotations.lru_cache(scope='global')
|
84
97
|
def get_server_url(host: Optional[str] = None) -> str:
|
85
98
|
endpoint = DEFAULT_SERVER_URL
|
@@ -117,7 +130,9 @@ def get_api_server_status(endpoint: Optional[str] = None) -> ApiServerInfo:
|
|
117
130
|
server_url = endpoint if endpoint is not None else get_server_url()
|
118
131
|
while time_out_try_count <= RETRY_COUNT_ON_TIMEOUT:
|
119
132
|
try:
|
120
|
-
response = requests.get(f'{server_url}/api/health',
|
133
|
+
response = requests.get(f'{server_url}/api/health',
|
134
|
+
timeout=2.5,
|
135
|
+
cookies=get_api_cookie_jar())
|
121
136
|
if response.status_code == 200:
|
122
137
|
try:
|
123
138
|
result = response.json()
|
sky/server/constants.py
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
"""Constants for the API servers."""
|
2
2
|
|
3
|
+
from sky.skylet import constants
|
4
|
+
|
3
5
|
# API server version, whenever there is a change in API server that requires a
|
4
6
|
# restart of the local API server or error out when the client does not match
|
5
7
|
# the server version.
|
@@ -19,3 +21,6 @@ API_SERVER_REQUEST_DB_PATH = '~/.sky/api_server/requests.db'
|
|
19
21
|
# The interval (seconds) for the cluster status to be refreshed in the
|
20
22
|
# background.
|
21
23
|
CLUSTER_REFRESH_DAEMON_INTERVAL_SECONDS = 60
|
24
|
+
|
25
|
+
# Environment variable for a file path to the API cookie file.
|
26
|
+
API_COOKIE_FILE_ENV_VAR = f'{constants.SKYPILOT_ENV_VAR_PREFIX}API_COOKIE_FILE'
|
sky/skypilot_config.py
CHANGED
@@ -52,7 +52,6 @@ import contextlib
|
|
52
52
|
import copy
|
53
53
|
import os
|
54
54
|
import pprint
|
55
|
-
import tempfile
|
56
55
|
import typing
|
57
56
|
from typing import Any, Dict, Iterator, Optional, Tuple
|
58
57
|
|
@@ -92,6 +91,7 @@ CONFIG_PATH = '~/.sky/config.yaml'
|
|
92
91
|
# The loaded config.
|
93
92
|
_dict = config_utils.Config()
|
94
93
|
_loaded_config_path: Optional[str] = None
|
94
|
+
_config_overridden: bool = False
|
95
95
|
|
96
96
|
|
97
97
|
def get_nested(keys: Tuple[str, ...],
|
@@ -178,7 +178,10 @@ def _reload_config() -> None:
|
|
178
178
|
|
179
179
|
|
180
180
|
def loaded_config_path() -> Optional[str]:
|
181
|
-
"""Returns the path to the loaded config file
|
181
|
+
"""Returns the path to the loaded config file, or
|
182
|
+
'<overridden>' if the config is overridden."""
|
183
|
+
if _config_overridden:
|
184
|
+
return '<overridden>'
|
182
185
|
return _loaded_config_path
|
183
186
|
|
184
187
|
|
@@ -195,31 +198,30 @@ def loaded() -> bool:
|
|
195
198
|
def override_skypilot_config(
|
196
199
|
override_configs: Optional[Dict[str, Any]]) -> Iterator[None]:
|
197
200
|
"""Overrides the user configurations."""
|
201
|
+
global _dict, _config_overridden
|
198
202
|
# TODO(SKY-1215): allow admin user to extend the disallowed keys or specify
|
199
203
|
# allowed keys.
|
200
204
|
if not override_configs:
|
201
205
|
# If no override configs (None or empty dict), do nothing.
|
202
206
|
yield
|
203
207
|
return
|
204
|
-
|
205
|
-
original_config = dict(_dict)
|
208
|
+
original_config = _dict
|
206
209
|
config = _dict.get_nested(
|
207
210
|
keys=tuple(),
|
208
211
|
default_value=None,
|
209
212
|
override_configs=override_configs,
|
210
213
|
allowed_override_keys=None,
|
211
214
|
disallowed_override_keys=constants.SKIPPED_CLIENT_OVERRIDE_KEYS)
|
212
|
-
with tempfile.NamedTemporaryFile(
|
213
|
-
mode='w',
|
214
|
-
prefix='skypilot_config',
|
215
|
-
# Have to avoid deleting the file as the underlying function needs
|
216
|
-
# to read the config file, and we need to close the file mode='w'
|
217
|
-
# to enable reading.
|
218
|
-
delete=False) as f:
|
219
|
-
common_utils.dump_yaml(f.name, dict(config))
|
220
|
-
os.environ[ENV_VAR_SKYPILOT_CONFIG] = f.name
|
221
215
|
try:
|
222
|
-
|
216
|
+
common_utils.validate_schema(
|
217
|
+
config,
|
218
|
+
schemas.get_config_schema(),
|
219
|
+
f'Invalid config {config}. See: '
|
220
|
+
'https://docs.skypilot.co/en/latest/reference/config.html. ' # pylint: disable=line-too-long
|
221
|
+
'Error: ',
|
222
|
+
skip_none=False)
|
223
|
+
_config_overridden = True
|
224
|
+
_dict = config
|
223
225
|
yield
|
224
226
|
except exceptions.InvalidSkyPilotConfigError as e:
|
225
227
|
with ux_utils.print_exception_no_traceback():
|
@@ -227,23 +229,10 @@ def override_skypilot_config(
|
|
227
229
|
'Failed to override the SkyPilot config on API '
|
228
230
|
'server with your local SkyPilot config:\n'
|
229
231
|
'=== SkyPilot config on API server ===\n'
|
230
|
-
f'{common_utils.dump_yaml_str(original_config)}\n'
|
232
|
+
f'{common_utils.dump_yaml_str(dict(original_config))}\n'
|
231
233
|
'=== Your local SkyPilot config ===\n'
|
232
234
|
f'{common_utils.dump_yaml_str(override_configs)}\n'
|
233
235
|
f'Details: {e}') from e
|
234
|
-
|
235
236
|
finally:
|
236
|
-
|
237
|
-
|
238
|
-
else:
|
239
|
-
os.environ.pop(ENV_VAR_SKYPILOT_CONFIG, None)
|
240
|
-
# Reload the config to restore the original config to avoid the next
|
241
|
-
# request reusing the same process to use the config for the current
|
242
|
-
# request.
|
243
|
-
_reload_config()
|
244
|
-
|
245
|
-
try:
|
246
|
-
os.remove(f.name)
|
247
|
-
except Exception: # pylint: disable=broad-except
|
248
|
-
# Failing to delete the file is not critical.
|
249
|
-
pass
|
237
|
+
_dict = original_config
|
238
|
+
_config_overridden = False
|
{skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/RECORD
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
sky/__init__.py,sha256=
|
1
|
+
sky/__init__.py,sha256=5K1BQuEZD1FBwNmOk9UdlNLmigTwj-YySkC2hgH7j8Q,6428
|
2
2
|
sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
|
3
3
|
sky/authentication.py,sha256=ND011K_-Ud1dVZF37A9KrwYir_ihJXcHc7iDWmuBc8Q,22872
|
4
4
|
sky/check.py,sha256=PPNQnaaZBA9_aogJpN4gnG4XWnTqkd74c-rBYDkDRDY,16101
|
@@ -10,10 +10,10 @@ sky/exceptions.py,sha256=EodMj6P0x0JYBiioLNuPoFMj12HzlQTQpfXNX6zHBoA,16837
|
|
10
10
|
sky/execution.py,sha256=FicobVGXIq2z5suKscTZi5aZ8w-_qzeSsuecEabI2vY,28703
|
11
11
|
sky/global_user_state.py,sha256=7HADn0mY-0omf5RbpmAZ88bjySzqKcmiD1MEmkrCoNU,33754
|
12
12
|
sky/models.py,sha256=4Hq_JNpeQyvRlde_mf1T8H5iDS362TRORYXjtk2nmT4,735
|
13
|
-
sky/optimizer.py,sha256=
|
13
|
+
sky/optimizer.py,sha256=U9tTIMU4D-X9n03QmSldBMwwodUpWcPi1PhwgWHheMM,58483
|
14
14
|
sky/resources.py,sha256=2qc5U09MFDaJjI1dHcThcRodpMGY7HyXzQn8eC4lvbE,72402
|
15
15
|
sky/sky_logging.py,sha256=pID2RINjH62n7SZpv70DuN8BSFYdCfTJ2ScGQpVmugg,5725
|
16
|
-
sky/skypilot_config.py,sha256=
|
16
|
+
sky/skypilot_config.py,sha256=SLlx0AzZnjSsDb2PCNbLNjjl8deeEMWukIc9OYiXKAk,8354
|
17
17
|
sky/task.py,sha256=tM-DpB7Mtxtc280gFIw9QvJfKEHgiIoew5rnNxxaj04,56737
|
18
18
|
sky/adaptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
19
|
sky/adaptors/aws.py,sha256=iH55Cm6eXWwufAG0Dgk7LTQcADawNa3ELrBH1m6yuSY,7617
|
@@ -44,8 +44,8 @@ sky/benchmark/benchmark_state.py,sha256=X8CXmuU9KgsDRhKedhFgjeRMUFWtQsjFs1qECvPG
|
|
44
44
|
sky/benchmark/benchmark_utils.py,sha256=7rf-iHt6RXZ_pnBBWOMwcdodHQW69x27xNyx0yVog1U,26385
|
45
45
|
sky/client/__init__.py,sha256=pz6xvVSd9X-gwqbsDL0E9QOojYqM0KAD0j-NCyCIF1k,38
|
46
46
|
sky/client/cli.py,sha256=DOMNgAjK8Iir8nQNoQDG2tIWg9Jf_Gh2DDFqHnjxflU,222727
|
47
|
-
sky/client/common.py,sha256=
|
48
|
-
sky/client/sdk.py,sha256=
|
47
|
+
sky/client/common.py,sha256=KlV1SDWqSdnXyBd1VMNRoUyVk1430D2PL27rD6fk5fY,14913
|
48
|
+
sky/client/sdk.py,sha256=Ng44Iw5AtlikmK5hwnCObxM2LSxQULP8kt9KjSA0XRw,70637
|
49
49
|
sky/clouds/__init__.py,sha256=OW6mJ-9hpJSBORCgt2LippLQEYZHNfnBW1mooRNNvxo,1416
|
50
50
|
sky/clouds/aws.py,sha256=-feXZ72UMUjuZz8dV4qMTjMMTC9pwfkQQT3KJDcIv5A,54633
|
51
51
|
sky/clouds/azure.py,sha256=Zpo6ftWz_B30mX7N-An7JVO-8v7aU3f9cw1iH9phvwE,32251
|
@@ -115,7 +115,7 @@ sky/jobs/scheduler.py,sha256=luQgrCDaDP6bI7oIbaqzxg4qMJtUIVswypnOGUklGtw,13270
|
|
115
115
|
sky/jobs/state.py,sha256=tDULLH6DVs4oKUIKhh0UAn3RzyVGuIUtEq5kW7K1Ojw,44585
|
116
116
|
sky/jobs/utils.py,sha256=ipeh46sWnGWC_gEtWDAqifJZeq2_S5eEa2psyIjLROA,56869
|
117
117
|
sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
118
|
-
sky/jobs/client/sdk.py,sha256=
|
118
|
+
sky/jobs/client/sdk.py,sha256=MxXPe9Mijwegnk_Xupo9qOrkMzYbMOP_GpUKCdDCmZg,10498
|
119
119
|
sky/jobs/dashboard/dashboard.py,sha256=JKg8cCH_Y0sf3MoDTx85BghVEXWpp8ItPLshp09-_Js,7618
|
120
120
|
sky/jobs/dashboard/static/favicon.ico,sha256=uYlvgxSM7gjBmXpZ8wydvZUPAbJiiix-rc2Xe5mma9s,15086
|
121
121
|
sky/jobs/dashboard/templates/index.html,sha256=NrlTDiEHJDt7sViwWgXUSxVCyVl_IEukE5jdvN8WhtQ,33132
|
@@ -225,13 +225,13 @@ sky/serve/service.py,sha256=JlLyhwHbBUztLgKrfBpVRIUhGwGizemfxL7txs9dpcc,12539
|
|
225
225
|
sky/serve/service_spec.py,sha256=t7wh7sx68DKjPyrk1Ub-c1ZjkWD8ehG-YOj9CNdC9qQ,18552
|
226
226
|
sky/serve/spot_placer.py,sha256=LZk-VFPLyKpSJHFlNj-OkTN8C3KppD-IOocp5BHb6X4,11076
|
227
227
|
sky/serve/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
228
|
-
sky/serve/client/sdk.py,sha256=
|
228
|
+
sky/serve/client/sdk.py,sha256=4lcil59KNmJSPUpPaq7x1oj6KsdXxCw-GUMU9QiTli8,11967
|
229
229
|
sky/serve/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
230
230
|
sky/serve/server/core.py,sha256=eShbugECWzJoSUDq5tZt-pePG0hgMY4dqY8AWNZ9_9s,33537
|
231
231
|
sky/serve/server/server.py,sha256=gQGVU9nHYdGbaLhGjIUNIYn4xwKjRASRJkiiTL5AI1Y,3283
|
232
232
|
sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
|
233
|
-
sky/server/common.py,sha256=
|
234
|
-
sky/server/constants.py,sha256=
|
233
|
+
sky/server/common.py,sha256=0Ob8MfIUhjL8XGXm2DiKfJtEvNfb0Ez4m2HX0820uRI,19879
|
234
|
+
sky/server/constants.py,sha256=hYY00IKxBQGveZMuWATOv4vHsgJNN8sCnI-t5G78sAc,948
|
235
235
|
sky/server/server.py,sha256=7aK3Nv_aHIYX2ZB_NFy-5Cn-DbSxUPMeiWaDY_2DLXE,44674
|
236
236
|
sky/server/stream_utils.py,sha256=4JMHgtoXPpCT8JwtqyUcDQ9IdZFir9om0JaCRr8rvbQ,5849
|
237
237
|
sky/server/uvicorn.py,sha256=wajwPHJ3IEEP3GMNOCc0S81-1v2qT5F-ejUkLFVhUzk,2953
|
@@ -353,9 +353,9 @@ sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488
|
|
353
353
|
sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=HPVgNt-wbCVPd9dpDFiA7t2mzQLpjXHJ61eiwRbEr-c,10378
|
354
354
|
sky/utils/kubernetes/rsync_helper.sh,sha256=h4YwrPFf9727CACnMJvF3EyK_0OeOYKKt4su_daKekw,1256
|
355
355
|
sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
|
356
|
-
skypilot_nightly-1.0.0.
|
357
|
-
skypilot_nightly-1.0.0.
|
358
|
-
skypilot_nightly-1.0.0.
|
359
|
-
skypilot_nightly-1.0.0.
|
360
|
-
skypilot_nightly-1.0.0.
|
361
|
-
skypilot_nightly-1.0.0.
|
356
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
|
357
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/METADATA,sha256=4Jv30iaBqLEa6mUWqrRhwpHnritNNODb6Ey1y5w5-kw,18559
|
358
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
359
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
|
360
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
|
361
|
+
skypilot_nightly-1.0.0.dev20250411.dist-info/RECORD,,
|
{skypilot_nightly-1.0.0.dev20250410.dist-info → skypilot_nightly-1.0.0.dev20250411.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|