skypilot-nightly 1.0.0.dev20250326__py3-none-any.whl → 1.0.0.dev20250328__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/adaptors/gcp.py +7 -0
- sky/authentication.py +4 -0
- sky/backends/cloud_vm_ray_backend.py +26 -0
- sky/cli.py +8 -2
- sky/client/cli.py +8 -2
- sky/client/sdk.py +4 -2
- sky/clouds/do.py +5 -6
- sky/clouds/service_catalog/data_fetchers/fetch_ibm.py +176 -0
- sky/core.py +4 -2
- sky/data/storage.py +3 -3
- sky/exceptions.py +5 -0
- sky/jobs/server/server.py +8 -2
- sky/optimizer.py +1 -1
- sky/provision/aws/utils.py +11 -10
- sky/provision/azure/config.py +1 -1
- sky/provision/kubernetes/utils.py +4 -1
- sky/provision/provisioner.py +4 -0
- sky/server/requests/payloads.py +1 -0
- sky/utils/kubernetes/deploy_remote_cluster.sh +34 -11
- sky/utils/kubernetes/kubernetes_deploy_utils.py +4 -1
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/METADATA +1 -1
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/RECORD +27 -26
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.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 = '4dab9ac5b17fd6dc807b98dcbccecf481011835a'
|
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.dev20250328'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
sky/adaptors/gcp.py
CHANGED
@@ -68,6 +68,13 @@ def credential_error_exception():
|
|
68
68
|
return exceptions.DefaultCredentialsError
|
69
69
|
|
70
70
|
|
71
|
+
@common.load_lazy_modules(_LAZY_MODULES)
|
72
|
+
def auth_error_exception():
|
73
|
+
"""GoogleAuthError exception."""
|
74
|
+
from google.auth import exceptions
|
75
|
+
return exceptions.GoogleAuthError
|
76
|
+
|
77
|
+
|
71
78
|
@common.load_lazy_modules(_LAZY_MODULES)
|
72
79
|
def gcp_auth_refresh_error_exception():
|
73
80
|
"""GCP auth refresh error exception."""
|
sky/authentication.py
CHANGED
@@ -33,6 +33,7 @@ import colorama
|
|
33
33
|
import filelock
|
34
34
|
|
35
35
|
from sky import clouds
|
36
|
+
from sky import exceptions
|
36
37
|
from sky import sky_logging
|
37
38
|
from sky import skypilot_config
|
38
39
|
from sky.adaptors import common as adaptors_common
|
@@ -214,6 +215,9 @@ def setup_gcp_authentication(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
214
215
|
sys.exit(1)
|
215
216
|
else:
|
216
217
|
raise
|
218
|
+
except gcp.auth_error_exception() as e:
|
219
|
+
raise exceptions.InvalidCloudCredentials(
|
220
|
+
f'{common_utils.format_exception(e)}')
|
217
221
|
except socket.timeout:
|
218
222
|
logger.error('Socket timed out when trying to get the GCP project. '
|
219
223
|
'Please check your network connection.')
|
@@ -1089,6 +1089,21 @@ class FailoverCloudErrorHandlerV2:
|
|
1089
1089
|
FailoverCloudErrorHandlerV2._default_handler(
|
1090
1090
|
blocked_resources, launchable_resources, region, zones, error)
|
1091
1091
|
|
1092
|
+
@staticmethod
|
1093
|
+
def _aws_handler(blocked_resources: Set['resources_lib.Resources'],
|
1094
|
+
launchable_resources: 'resources_lib.Resources',
|
1095
|
+
region: 'clouds.Region',
|
1096
|
+
zones: Optional[List['clouds.Zone']],
|
1097
|
+
error: Exception) -> None:
|
1098
|
+
logger.info(f'AWS handler error: {error}')
|
1099
|
+
# Block AWS if the credential has expired.
|
1100
|
+
if isinstance(error, exceptions.InvalidCloudCredentials):
|
1101
|
+
_add_to_blocked_resources(
|
1102
|
+
blocked_resources, resources_lib.Resources(cloud=clouds.AWS()))
|
1103
|
+
else:
|
1104
|
+
FailoverCloudErrorHandlerV2._default_handler(
|
1105
|
+
blocked_resources, launchable_resources, region, zones, error)
|
1106
|
+
|
1092
1107
|
@staticmethod
|
1093
1108
|
def _default_handler(blocked_resources: Set['resources_lib.Resources'],
|
1094
1109
|
launchable_resources: 'resources_lib.Resources',
|
@@ -1419,6 +1434,17 @@ class RetryingVmProvisioner(object):
|
|
1419
1434
|
# does not have nodes labeled with GPU types.
|
1420
1435
|
logger.info(f'{e}')
|
1421
1436
|
continue
|
1437
|
+
except exceptions.InvalidCloudCredentials as e:
|
1438
|
+
# Failed due to invalid cloud credentials.
|
1439
|
+
logger.warning(f'{common_utils.format_exception(e)}')
|
1440
|
+
# We should block the entire cloud for invalid cloud credentials
|
1441
|
+
_add_to_blocked_resources(
|
1442
|
+
self._blocked_resources,
|
1443
|
+
to_provision.copy(region=None, zone=None))
|
1444
|
+
raise exceptions.ResourcesUnavailableError(
|
1445
|
+
f'Failed to provision on cloud {to_provision.cloud} due to '
|
1446
|
+
f'invalid cloud credentials: '
|
1447
|
+
f'{common_utils.format_exception(e)}')
|
1422
1448
|
except exceptions.InvalidCloudConfigs as e:
|
1423
1449
|
# Failed due to invalid user configs in ~/.sky/config.yaml.
|
1424
1450
|
logger.warning(f'{common_utils.format_exception(e)}')
|
sky/cli.py
CHANGED
@@ -5455,11 +5455,17 @@ def local():
|
|
5455
5455
|
type=str,
|
5456
5456
|
required=False,
|
5457
5457
|
help='Name to use for the kubeconfig context. Defaults to "default".')
|
5458
|
+
@click.option('--password',
|
5459
|
+
type=str,
|
5460
|
+
required=False,
|
5461
|
+
help='Password for the ssh-user to execute sudo commands. '
|
5462
|
+
'Required only if passwordless sudo is not setup.')
|
5458
5463
|
@local.command('up', cls=_DocumentedCodeCommand)
|
5459
5464
|
@_add_click_options(_COMMON_OPTIONS)
|
5460
5465
|
@usage_lib.entrypoint
|
5461
5466
|
def local_up(gpus: bool, ips: str, ssh_user: str, ssh_key_path: str,
|
5462
|
-
cleanup: bool, context_name: Optional[str],
|
5467
|
+
cleanup: bool, context_name: Optional[str],
|
5468
|
+
password: Optional[str], async_call: bool):
|
5463
5469
|
"""Creates a local or remote cluster."""
|
5464
5470
|
|
5465
5471
|
def _validate_args(ips, ssh_user, ssh_key_path, cleanup):
|
@@ -5505,7 +5511,7 @@ def local_up(gpus: bool, ips: str, ssh_user: str, ssh_key_path: str,
|
|
5505
5511
|
f'Failed to read SSH key file {ssh_key_path}: {str(e)}')
|
5506
5512
|
|
5507
5513
|
request_id = sdk.local_up(gpus, ip_list, ssh_user, ssh_key, cleanup,
|
5508
|
-
context_name)
|
5514
|
+
context_name, password)
|
5509
5515
|
_async_call_or_wait(request_id, async_call, request_name='local up')
|
5510
5516
|
|
5511
5517
|
|
sky/client/cli.py
CHANGED
@@ -5455,11 +5455,17 @@ def local():
|
|
5455
5455
|
type=str,
|
5456
5456
|
required=False,
|
5457
5457
|
help='Name to use for the kubeconfig context. Defaults to "default".')
|
5458
|
+
@click.option('--password',
|
5459
|
+
type=str,
|
5460
|
+
required=False,
|
5461
|
+
help='Password for the ssh-user to execute sudo commands. '
|
5462
|
+
'Required only if passwordless sudo is not setup.')
|
5458
5463
|
@local.command('up', cls=_DocumentedCodeCommand)
|
5459
5464
|
@_add_click_options(_COMMON_OPTIONS)
|
5460
5465
|
@usage_lib.entrypoint
|
5461
5466
|
def local_up(gpus: bool, ips: str, ssh_user: str, ssh_key_path: str,
|
5462
|
-
cleanup: bool, context_name: Optional[str],
|
5467
|
+
cleanup: bool, context_name: Optional[str],
|
5468
|
+
password: Optional[str], async_call: bool):
|
5463
5469
|
"""Creates a local or remote cluster."""
|
5464
5470
|
|
5465
5471
|
def _validate_args(ips, ssh_user, ssh_key_path, cleanup):
|
@@ -5505,7 +5511,7 @@ def local_up(gpus: bool, ips: str, ssh_user: str, ssh_key_path: str,
|
|
5505
5511
|
f'Failed to read SSH key file {ssh_key_path}: {str(e)}')
|
5506
5512
|
|
5507
5513
|
request_id = sdk.local_up(gpus, ip_list, ssh_user, ssh_key, cleanup,
|
5508
|
-
context_name)
|
5514
|
+
context_name, password)
|
5509
5515
|
_async_call_or_wait(request_id, async_call, request_name='local up')
|
5510
5516
|
|
5511
5517
|
|
sky/client/sdk.py
CHANGED
@@ -1295,7 +1295,8 @@ def local_up(gpus: bool,
|
|
1295
1295
|
ssh_user: Optional[str],
|
1296
1296
|
ssh_key: Optional[str],
|
1297
1297
|
cleanup: bool,
|
1298
|
-
context_name: Optional[str] = None
|
1298
|
+
context_name: Optional[str] = None,
|
1299
|
+
password: Optional[str] = None) -> server_common.RequestId:
|
1299
1300
|
"""Launches a Kubernetes cluster on local machines.
|
1300
1301
|
|
1301
1302
|
Returns:
|
@@ -1314,7 +1315,8 @@ def local_up(gpus: bool,
|
|
1314
1315
|
ssh_user=ssh_user,
|
1315
1316
|
ssh_key=ssh_key,
|
1316
1317
|
cleanup=cleanup,
|
1317
|
-
context_name=context_name
|
1318
|
+
context_name=context_name,
|
1319
|
+
password=password)
|
1318
1320
|
response = requests.post(f'{server_common.get_server_url()}/local_up',
|
1319
1321
|
json=json.loads(body.model_dump_json()))
|
1320
1322
|
return server_common.get_request_id(response)
|
sky/clouds/do.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
""" Digital Ocean Cloud. """
|
2
2
|
|
3
3
|
import json
|
4
|
+
import os
|
4
5
|
import typing
|
5
6
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
6
7
|
|
@@ -279,13 +280,11 @@ class DO(clouds.Cloud):
|
|
279
280
|
return True, None
|
280
281
|
|
281
282
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
282
|
-
|
283
|
-
do_utils.client()
|
284
|
-
return {
|
285
|
-
f'~/.config/doctl/{_CREDENTIAL_FILE}': do_utils.CREDENTIALS_PATH
|
286
|
-
}
|
287
|
-
except do_utils.DigitalOceanError:
|
283
|
+
if not os.path.exists(os.path.expanduser(do_utils.CREDENTIALS_PATH)):
|
288
284
|
return {}
|
285
|
+
return {
|
286
|
+
f'~/.config/doctl/{_CREDENTIAL_FILE}': do_utils.CREDENTIALS_PATH
|
287
|
+
}
|
289
288
|
|
290
289
|
@classmethod
|
291
290
|
def get_current_user_identity(cls) -> Optional[List[str]]:
|
@@ -0,0 +1,176 @@
|
|
1
|
+
"""A script that generates the Lambda Cloud catalog.
|
2
|
+
|
3
|
+
Usage:
|
4
|
+
python fetch_ibm.py [-h] [--api-key API_KEY]
|
5
|
+
[--api-key-path API_KEY_PATH]
|
6
|
+
|
7
|
+
If neither --api-key nor --api-key-path are provided, this script will parse
|
8
|
+
`~/.ibm/credentials.yaml` to look for IBM API key (`iam_api_key`).
|
9
|
+
"""
|
10
|
+
import argparse
|
11
|
+
import csv
|
12
|
+
from datetime import datetime
|
13
|
+
import json
|
14
|
+
import os
|
15
|
+
from typing import Dict, List, Optional, Tuple
|
16
|
+
|
17
|
+
import requests
|
18
|
+
import yaml
|
19
|
+
|
20
|
+
TOKEN_ENDPOINT = 'https://iam.cloud.ibm.com/identity/token'
|
21
|
+
REGIONS_ENDPOINT = f'https://us-south.iaas.cloud.ibm.com/v1/regions?version={datetime.today().strftime("%Y-%m-%d")}&generation=2' # pylint: disable=line-too-long
|
22
|
+
ENDPOINT = 'https://cloud.lambdalabs.com/api/v1/instance-types'
|
23
|
+
DEFAULT_IBM_CREDENTIALS_PATH = os.path.expanduser('~/.ibm/credentials.yaml')
|
24
|
+
|
25
|
+
|
26
|
+
def _fetch_token(api_key: Optional[str] = None,
|
27
|
+
api_key_path: Optional[str] = None,
|
28
|
+
ibm_token: Optional[str] = None) -> str:
|
29
|
+
if ibm_token is None:
|
30
|
+
if api_key is None:
|
31
|
+
if api_key_path is None:
|
32
|
+
api_key_path = DEFAULT_IBM_CREDENTIALS_PATH
|
33
|
+
with open(api_key_path, mode='r', encoding='utf-8') as f:
|
34
|
+
ibm_cred_yaml = yaml.safe_load(f)
|
35
|
+
api_key = ibm_cred_yaml['iam_api_key']
|
36
|
+
|
37
|
+
headers = {
|
38
|
+
'Accept': 'application/json',
|
39
|
+
}
|
40
|
+
data = {
|
41
|
+
'grant_type': 'urn:ibm:params:oauth:grant-type:apikey',
|
42
|
+
'apikey': api_key,
|
43
|
+
}
|
44
|
+
response = requests.post(url=TOKEN_ENDPOINT, data=data, headers=headers)
|
45
|
+
return response.json()['access_token']
|
46
|
+
else:
|
47
|
+
return ibm_token
|
48
|
+
|
49
|
+
|
50
|
+
def _fetch_regions(ibm_token: str) -> List[str]:
|
51
|
+
headers = {
|
52
|
+
'Authorization': f'Bearer {ibm_token}',
|
53
|
+
'Accept': 'application/json',
|
54
|
+
}
|
55
|
+
response = requests.get(url=REGIONS_ENDPOINT, headers=headers)
|
56
|
+
regions_json = response.json()
|
57
|
+
|
58
|
+
regions = [r['name'] for r in regions_json['regions']]
|
59
|
+
|
60
|
+
print(f'regions: {regions}')
|
61
|
+
return regions
|
62
|
+
|
63
|
+
|
64
|
+
def _fetch_instance_profiles(regions: List[str],
|
65
|
+
ibm_token: str) -> Dict[str, Tuple[List, List]]:
|
66
|
+
"""Fetch instance profiles by region (map):
|
67
|
+
{
|
68
|
+
"region_name": (
|
69
|
+
[list of available zones in the region],
|
70
|
+
[list of available instance profiles in the region]
|
71
|
+
)
|
72
|
+
}
|
73
|
+
"""
|
74
|
+
d = datetime.today().strftime('%Y-%m-%d')
|
75
|
+
|
76
|
+
result = {}
|
77
|
+
headers = {
|
78
|
+
'Authorization': f'Bearer {ibm_token}',
|
79
|
+
'Accept': 'application/json',
|
80
|
+
}
|
81
|
+
for r in regions:
|
82
|
+
az_endpoint = f'https://{r}.iaas.cloud.ibm.com/v1/regions/{r}/zones?version={d}&generation=2' # pylint: disable=line-too-long
|
83
|
+
az_response = requests.get(url=az_endpoint, headers=headers)
|
84
|
+
az_response_json = az_response.json()
|
85
|
+
zones = [a['name'] for a in az_response_json['zones']]
|
86
|
+
print(f'Fetching instance profiles for region {r}, zones {zones}')
|
87
|
+
|
88
|
+
instances_endpoint = f'https://{r}.iaas.cloud.ibm.com/v1/instance/profiles?version={d}&generation=2' # pylint: disable=line-too-long
|
89
|
+
instance_response = requests.get(url=instances_endpoint,
|
90
|
+
headers=headers)
|
91
|
+
instance_response_json = instance_response.json()
|
92
|
+
instance_profiles = instance_response_json['profiles']
|
93
|
+
result[r] = (zones, instance_profiles)
|
94
|
+
|
95
|
+
return result
|
96
|
+
|
97
|
+
|
98
|
+
def create_catalog(region_profile: Dict[str, Tuple[List, List]],
|
99
|
+
output_path: str) -> None:
|
100
|
+
print(f'Create catalog file {output_path} based on the fetched profiles')
|
101
|
+
with open(output_path, mode='w', encoding='utf-8') as f:
|
102
|
+
writer = csv.writer(f, delimiter=',', quotechar='"')
|
103
|
+
writer.writerow([
|
104
|
+
'InstanceType', 'AcceleratorName', 'AcceleratorCount', 'vCPUs',
|
105
|
+
'MemoryGiB', 'GpuInfo', 'Price', 'SpotPrice', 'Region',
|
106
|
+
'AvailabilityZone'
|
107
|
+
])
|
108
|
+
|
109
|
+
for region, (zones, profiles) in region_profile.items():
|
110
|
+
print(f' adding region {region} instances')
|
111
|
+
for profile in profiles:
|
112
|
+
vm = profile['name']
|
113
|
+
gpu: Optional[str] = None
|
114
|
+
gpu_cnt: Optional[int] = None
|
115
|
+
gpu_manufacturer: Optional[str] = None
|
116
|
+
gpu_memory: Optional[int] = None
|
117
|
+
if 'gpu_model' in profile:
|
118
|
+
gpu = profile['gpu_model']['values'][0]
|
119
|
+
if 'gpu_count' in profile:
|
120
|
+
gpu_cnt = int(profile['gpu_count']['value'])
|
121
|
+
if 'vcpu_count' in profile:
|
122
|
+
vcpus = int(profile['vcpu_count']['value'])
|
123
|
+
if 'memory' in profile:
|
124
|
+
mem = int(profile['memory']['value'])
|
125
|
+
if 'gpu_memory' in profile:
|
126
|
+
gpu_memory = int(profile['gpu_memory']['value'])
|
127
|
+
if 'gpu_manufacturer' in profile:
|
128
|
+
gpu_manufacturer = profile['gpu_manufacturer']['values'][0]
|
129
|
+
# TODO: How to fetch prices?
|
130
|
+
# The pricing API doesn't return prices for instance.profile. # pylint: disable=line-too-long
|
131
|
+
# https://cloud.ibm.com/docs/account?topic=account-getting-pricing-api # pylint: disable=line-too-long
|
132
|
+
# https://globalcatalog.cloud.ibm.com/api/v1?q=kind:instance.profile # pylint: disable=line-too-long
|
133
|
+
# https://globalcatalog.cloud.ibm.com/api/v1/gx2-16x128x1v100/plan # pylint: disable=line-too-long
|
134
|
+
price = 0.0
|
135
|
+
gpuinfo: Optional[str] = None
|
136
|
+
gpu_memory_mb: Optional[int] = None
|
137
|
+
gpu_memory_total_mb: Optional[int] = None
|
138
|
+
if gpu_memory is not None:
|
139
|
+
gpu_memory_mb = gpu_memory * 1024
|
140
|
+
if gpu_cnt is not None:
|
141
|
+
gpu_memory_total_mb = gpu_memory_mb * gpu_cnt
|
142
|
+
# gpuinfo: Optional[str] = None
|
143
|
+
if gpu is not None:
|
144
|
+
gpuinfo_dict = {
|
145
|
+
'Gpus': [{
|
146
|
+
'Name': gpu,
|
147
|
+
'Manufacturer': gpu_manufacturer,
|
148
|
+
'Count': gpu_cnt,
|
149
|
+
'MemoryInfo': {
|
150
|
+
'SizeInMiB': gpu_memory_mb
|
151
|
+
},
|
152
|
+
}],
|
153
|
+
'TotalGpuMemoryInMiB': gpu_memory_total_mb
|
154
|
+
}
|
155
|
+
gpuinfo = json.dumps(gpuinfo_dict).replace('"', "'") # pylint: disable=inconsistent-quotes,invalid-string-quote
|
156
|
+
|
157
|
+
for zone in zones:
|
158
|
+
writer.writerow([
|
159
|
+
vm, gpu, gpu_cnt, vcpus, mem, gpuinfo, price, '',
|
160
|
+
region, zone
|
161
|
+
])
|
162
|
+
|
163
|
+
|
164
|
+
if __name__ == '__main__':
|
165
|
+
parser = argparse.ArgumentParser()
|
166
|
+
parser.add_argument('--api-key', help='IBM API key.')
|
167
|
+
parser.add_argument('--api-key-path',
|
168
|
+
help='path of file containing IBM Credentials.')
|
169
|
+
args = parser.parse_args()
|
170
|
+
os.makedirs('ibm', exist_ok=True)
|
171
|
+
call_token = _fetch_token()
|
172
|
+
call_regions = _fetch_regions(call_token)
|
173
|
+
region_profiles_map = _fetch_instance_profiles(regions=call_regions,
|
174
|
+
ibm_token=call_token)
|
175
|
+
create_catalog(region_profiles_map, 'ibm/vms.csv')
|
176
|
+
print('IBM Cloud catalog saved to ibm/vms.csv')
|
sky/core.py
CHANGED
@@ -1063,7 +1063,8 @@ def local_up(gpus: bool,
|
|
1063
1063
|
ssh_user: Optional[str],
|
1064
1064
|
ssh_key: Optional[str],
|
1065
1065
|
cleanup: bool,
|
1066
|
-
context_name: Optional[str] = None
|
1066
|
+
context_name: Optional[str] = None,
|
1067
|
+
password: Optional[str] = None) -> None:
|
1067
1068
|
"""Creates a local or remote cluster."""
|
1068
1069
|
|
1069
1070
|
def _validate_args(ips, ssh_user, ssh_key, cleanup):
|
@@ -1089,7 +1090,8 @@ def local_up(gpus: bool,
|
|
1089
1090
|
if ips:
|
1090
1091
|
assert ssh_user is not None and ssh_key is not None
|
1091
1092
|
kubernetes_deploy_utils.deploy_remote_cluster(ips, ssh_user, ssh_key,
|
1092
|
-
cleanup, context_name
|
1093
|
+
cleanup, context_name,
|
1094
|
+
password)
|
1093
1095
|
else:
|
1094
1096
|
# Run local deployment (kind) if no remote args are specified
|
1095
1097
|
kubernetes_deploy_utils.deploy_local_cluster(gpus)
|
sky/data/storage.py
CHANGED
@@ -203,7 +203,7 @@ class StoreType(enum.Enum):
|
|
203
203
|
return 'oci://'
|
204
204
|
# Nebius storages use 's3://' as a prefix for various aws cli commands
|
205
205
|
elif self == StoreType.NEBIUS:
|
206
|
-
return '
|
206
|
+
return 'nebius://'
|
207
207
|
else:
|
208
208
|
with ux_utils.print_exception_no_traceback():
|
209
209
|
raise ValueError(f'Unknown store type: {self}')
|
@@ -4888,8 +4888,8 @@ class NebiusStore(AbstractStore):
|
|
4888
4888
|
raise exceptions.StorageBucketGetError(
|
4889
4889
|
'Attempted to use a non-existent bucket as a source: '
|
4890
4890
|
f'{self.source}. Consider using `aws s3 ls '
|
4891
|
-
f'{self.
|
4892
|
-
f'--profile={nebius.NEBIUS_PROFILE_NAME} to debug.')
|
4891
|
+
f's3://{self.name} --endpoint={endpoint_url}'
|
4892
|
+
f'--profile={nebius.NEBIUS_PROFILE_NAME}` to debug.')
|
4893
4893
|
|
4894
4894
|
# If bucket cannot be found in both private and public settings,
|
4895
4895
|
# the bucket is to be created by Sky. However, creation is skipped if
|
sky/exceptions.py
CHANGED
@@ -180,6 +180,11 @@ class InvalidCloudConfigs(Exception):
|
|
180
180
|
pass
|
181
181
|
|
182
182
|
|
183
|
+
class InvalidCloudCredentials(Exception):
|
184
|
+
"""Raised when the cloud credentials are invalid."""
|
185
|
+
pass
|
186
|
+
|
187
|
+
|
183
188
|
class ProvisionPrechecksError(Exception):
|
184
189
|
"""Raised when a managed job fails prechecks before provision.
|
185
190
|
|
sky/jobs/server/server.py
CHANGED
@@ -71,8 +71,14 @@ async def logs(
|
|
71
71
|
request_name='jobs.logs',
|
72
72
|
request_body=jobs_logs_body,
|
73
73
|
func=core.tail_logs,
|
74
|
-
|
75
|
-
|
74
|
+
# TODO(aylei): We have tail logs scheduled as SHORT request, because it
|
75
|
+
# should be responsive. However, it can be long running if the user's
|
76
|
+
# job keeps running, and we should avoid it taking the SHORT worker
|
77
|
+
# indefinitely.
|
78
|
+
# When refresh is True we schedule it as LONG because a controller
|
79
|
+
# restart might be needed.
|
80
|
+
schedule_type=api_requests.ScheduleType.LONG
|
81
|
+
if jobs_logs_body.refresh else api_requests.ScheduleType.SHORT,
|
76
82
|
request_cluster_name=common.JOB_CONTROLLER_NAME,
|
77
83
|
)
|
78
84
|
request_task = api_requests.get_request(request.state.request_id)
|
sky/optimizer.py
CHANGED
@@ -713,7 +713,7 @@ class Optimizer:
|
|
713
713
|
if message_data:
|
714
714
|
metric = 'COST ($)' if minimize_cost else 'TIME (s)'
|
715
715
|
table = _create_table(['SOURCE', 'TARGET', 'SIZE (GB)', metric])
|
716
|
-
table.add_rows(reversed(message_data))
|
716
|
+
table.add_rows(list(reversed(message_data)))
|
717
717
|
logger.info(f'Egress plan:\n{table}\n')
|
718
718
|
|
719
719
|
@staticmethod
|
sky/provision/aws/utils.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Utils for AWS provisioner."""
|
2
2
|
import colorama
|
3
3
|
|
4
|
+
from sky import exceptions
|
4
5
|
from sky import sky_logging
|
5
6
|
|
6
7
|
logger = sky_logging.init_logger(__name__)
|
@@ -24,18 +25,17 @@ def handle_boto_error(exc: Exception, msg: str) -> None:
|
|
24
25
|
generic_message = (f'{msg}\nError code: {colorama.Style.BRIGHT}{error_code}'
|
25
26
|
f'{colorama.Style.RESET_ALL}')
|
26
27
|
|
27
|
-
#
|
28
|
-
#
|
29
|
-
|
30
|
-
# RequestExpired
|
31
|
-
# are all the same pretty much
|
32
|
-
credentials_expiration_codes = [
|
28
|
+
# For invalid credentials, like expired tokens or
|
29
|
+
# invalid tokens, raise InvalidCloudCredentials exception
|
30
|
+
invalid_credentials_codes = [
|
33
31
|
'ExpiredTokenException',
|
34
32
|
'ExpiredToken',
|
35
33
|
'RequestExpired',
|
34
|
+
'InvalidClientTokenId',
|
35
|
+
'InvalidClientToken',
|
36
36
|
]
|
37
37
|
|
38
|
-
if error_code in
|
38
|
+
if error_code in invalid_credentials_codes:
|
39
39
|
# 'An error occurred (ExpiredToken) when calling the
|
40
40
|
# GetInstanceProfile operation: The security token
|
41
41
|
# included in the request is expired'
|
@@ -73,9 +73,10 @@ def handle_boto_error(exc: Exception, msg: str) -> None:
|
|
73
73
|
f'{colorama.Style.RESET_ALL}\n'
|
74
74
|
f'You can find a script that automates this at:'
|
75
75
|
f'{aws_session_script_url}')
|
76
|
-
#
|
77
|
-
#
|
78
|
-
raise
|
76
|
+
# Raise the InvalidCloudCredentials exception so that
|
77
|
+
# the provisioner can failover to other clouds
|
78
|
+
raise exceptions.InvalidCloudCredentials(
|
79
|
+
f'InvalidCloudCredentials: {generic_message}') from exc
|
79
80
|
|
80
81
|
# todo: any other errors that we should catch separately?
|
81
82
|
|
sky/provision/azure/config.py
CHANGED
@@ -120,7 +120,7 @@ def bootstrap_instances(
|
|
120
120
|
except azure.exceptions().ClientAuthenticationError as e:
|
121
121
|
message = (
|
122
122
|
'Failed to authenticate with Azure. Please check your '
|
123
|
-
'Azure credentials.
|
123
|
+
'Azure credentials. ClientAuthenticationError: '
|
124
124
|
f'{common_utils.format_exception(e)}').replace('\n', ' ')
|
125
125
|
logger.error(message)
|
126
126
|
raise exceptions.NoClusterLaunchedError(message) from e
|
@@ -159,7 +159,10 @@ def _retry_on_error(max_retries=DEFAULT_MAX_RETRIES,
|
|
159
159
|
# or 403 (Forbidden)
|
160
160
|
if (isinstance(e, kubernetes.api_exception()) and
|
161
161
|
e.status in (401, 403)):
|
162
|
-
|
162
|
+
# Raise KubeAPIUnreachableError exception so that the
|
163
|
+
# optimizer/provisioner can failover to other clouds.
|
164
|
+
raise exceptions.KubeAPIUnreachableError(
|
165
|
+
f'Kubernetes API error: {str(e)}') from e
|
163
166
|
if attempt < max_retries - 1:
|
164
167
|
sleep_time = backoff.current_backoff()
|
165
168
|
logger.debug(f'Kubernetes API call {func.__name__} '
|
sky/provision/provisioner.py
CHANGED
@@ -145,6 +145,10 @@ def bulk_provision(
|
|
145
145
|
except exceptions.NoClusterLaunchedError:
|
146
146
|
# Skip the teardown if the cluster was never launched.
|
147
147
|
raise
|
148
|
+
except exceptions.InvalidCloudCredentials:
|
149
|
+
# Skip the teardown if the cloud config is expired and
|
150
|
+
# the provisioner should failover to other clouds.
|
151
|
+
raise
|
148
152
|
except Exception: # pylint: disable=broad-except
|
149
153
|
zone_str = 'all zones'
|
150
154
|
if zones:
|
sky/server/requests/payloads.py
CHANGED
@@ -12,6 +12,7 @@ NC='\033[0m' # No color
|
|
12
12
|
CLEANUP=false
|
13
13
|
INSTALL_GPU=false
|
14
14
|
POSITIONAL_ARGS=()
|
15
|
+
PASSWORD=""
|
15
16
|
|
16
17
|
# Process all arguments
|
17
18
|
while [[ $# -gt 0 ]]; do
|
@@ -20,6 +21,11 @@ while [[ $# -gt 0 ]]; do
|
|
20
21
|
CLEANUP=true
|
21
22
|
shift
|
22
23
|
;;
|
24
|
+
--password)
|
25
|
+
PASSWORD=$2
|
26
|
+
shift
|
27
|
+
shift
|
28
|
+
;;
|
23
29
|
*)
|
24
30
|
POSITIONAL_ARGS+=("$1")
|
25
31
|
shift
|
@@ -36,11 +42,23 @@ USER=$2
|
|
36
42
|
SSH_KEY=$3
|
37
43
|
CONTEXT_NAME=${4:-default}
|
38
44
|
K3S_TOKEN=mytoken # Any string can be used as the token
|
45
|
+
# Create temporary askpass script for sudo
|
46
|
+
ASKPASS_BLOCK="# Create temporary askpass script
|
47
|
+
ASKPASS_SCRIPT=\$(mktemp)
|
48
|
+
trap 'rm -f \$ASKPASS_SCRIPT' EXIT INT TERM ERR QUIT
|
49
|
+
cat > \$ASKPASS_SCRIPT << EOF
|
50
|
+
#!/bin/bash
|
51
|
+
echo $PASSWORD
|
52
|
+
EOF
|
53
|
+
chmod 700 \$ASKPASS_SCRIPT
|
54
|
+
# Use askpass
|
55
|
+
export SUDO_ASKPASS=\$ASKPASS_SCRIPT
|
56
|
+
"
|
39
57
|
|
40
58
|
# Basic argument checks
|
41
59
|
if [ -z "$IPS_FILE" ] || [ -z "$USER" ] || [ -z "$SSH_KEY" ]; then
|
42
60
|
>&2 echo -e "${RED}Error: Missing required arguments.${NC}"
|
43
|
-
>&2 echo "Usage: ./deploy_remote_cluster.sh ips.txt username path/to/ssh/key [context-name] [--cleanup]"
|
61
|
+
>&2 echo "Usage: ./deploy_remote_cluster.sh ips.txt username path/to/ssh/key [context-name] [--cleanup] [--password password]"
|
44
62
|
exit 1
|
45
63
|
fi
|
46
64
|
|
@@ -89,9 +107,10 @@ cleanup_server_node() {
|
|
89
107
|
local NODE_IP=$1
|
90
108
|
echo -e "${YELLOW}Cleaning up head node $NODE_IP...${NC}"
|
91
109
|
run_remote "$NODE_IP" "
|
110
|
+
$ASKPASS_BLOCK
|
92
111
|
echo 'Uninstalling k3s...' &&
|
93
|
-
/usr/local/bin/k3s-uninstall.sh || true &&
|
94
|
-
sudo rm -rf /etc/rancher /var/lib/rancher /var/lib/kubelet /etc/kubernetes ~/.kube
|
112
|
+
sudo -A /usr/local/bin/k3s-uninstall.sh || true &&
|
113
|
+
sudo -A rm -rf /etc/rancher /var/lib/rancher /var/lib/kubelet /etc/kubernetes ~/.kube
|
95
114
|
"
|
96
115
|
echo -e "${GREEN}Node $NODE_IP cleaned up successfully.${NC}"
|
97
116
|
}
|
@@ -101,9 +120,10 @@ cleanup_agent_node() {
|
|
101
120
|
local NODE_IP=$1
|
102
121
|
echo -e "${YELLOW}Cleaning up node $NODE_IP...${NC}"
|
103
122
|
run_remote "$NODE_IP" "
|
123
|
+
$ASKPASS_BLOCK
|
104
124
|
echo 'Uninstalling k3s...' &&
|
105
|
-
/usr/local/bin/k3s-agent-uninstall.sh || true &&
|
106
|
-
sudo rm -rf /etc/rancher /var/lib/rancher /var/lib/kubelet /etc/kubernetes ~/.kube
|
125
|
+
sudo -A /usr/local/bin/k3s-agent-uninstall.sh || true &&
|
126
|
+
sudo -A rm -rf /etc/rancher /var/lib/rancher /var/lib/kubelet /etc/kubernetes ~/.kube
|
107
127
|
"
|
108
128
|
echo -e "${GREEN}Node $NODE_IP cleaned up successfully.${NC}"
|
109
129
|
}
|
@@ -151,10 +171,11 @@ fi
|
|
151
171
|
# Step 1: Install k3s on the head node
|
152
172
|
progress_message "Deploying Kubernetes on head node ($HEAD_NODE)..."
|
153
173
|
run_remote "$HEAD_NODE" "
|
154
|
-
|
174
|
+
$ASKPASS_BLOCK
|
175
|
+
curl -sfL https://get.k3s.io | K3S_TOKEN=$K3S_TOKEN sudo -E -A sh - &&
|
155
176
|
mkdir -p ~/.kube &&
|
156
|
-
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config &&
|
157
|
-
sudo chown \$(id -u):\$(id -g) ~/.kube/config &&
|
177
|
+
sudo -A cp /etc/rancher/k3s/k3s.yaml ~/.kube/config &&
|
178
|
+
sudo -A chown \$(id -u):\$(id -g) ~/.kube/config &&
|
158
179
|
for i in {1..3}; do
|
159
180
|
if kubectl wait --for=condition=ready node --all --timeout=2m --kubeconfig ~/.kube/config; then
|
160
181
|
break
|
@@ -163,7 +184,7 @@ run_remote "$HEAD_NODE" "
|
|
163
184
|
sleep 5
|
164
185
|
fi
|
165
186
|
done
|
166
|
-
if [
|
187
|
+
if [ \$i -eq 3 ]; then
|
167
188
|
echo 'Failed to wait for nodes to be ready after 3 attempts'
|
168
189
|
exit 1
|
169
190
|
fi"
|
@@ -184,7 +205,8 @@ echo -e "${GREEN}Master node internal IP: $MASTER_ADDR${NC}"
|
|
184
205
|
for NODE in $WORKER_NODES; do
|
185
206
|
progress_message "Deploying Kubernetes on worker node ($NODE)..."
|
186
207
|
run_remote "$NODE" "
|
187
|
-
|
208
|
+
$ASKPASS_BLOCK
|
209
|
+
curl -sfL https://get.k3s.io | K3S_URL=https://$MASTER_ADDR:6443 K3S_TOKEN=$K3S_TOKEN sudo -E -A sh -"
|
188
210
|
success_message "Kubernetes deployed on worker node ($NODE)."
|
189
211
|
|
190
212
|
# Check if worker node has a GPU
|
@@ -247,12 +269,13 @@ echo "Cluster deployment completed. You can now run 'kubectl get nodes' to verif
|
|
247
269
|
if [ "$INSTALL_GPU" == "true" ]; then
|
248
270
|
echo -e "${YELLOW}GPU detected in the cluster. Installing Nvidia GPU Operator...${NC}"
|
249
271
|
run_remote "$HEAD_NODE" "
|
272
|
+
$ASKPASS_BLOCK
|
250
273
|
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 &&
|
251
274
|
chmod 700 get_helm.sh &&
|
252
275
|
./get_helm.sh &&
|
253
276
|
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update &&
|
254
277
|
kubectl create namespace gpu-operator --kubeconfig ~/.kube/config || true &&
|
255
|
-
sudo ln -s /sbin/ldconfig /sbin/ldconfig.real || true &&
|
278
|
+
sudo -A ln -s /sbin/ldconfig /sbin/ldconfig.real || true &&
|
256
279
|
helm install gpu-operator -n gpu-operator --create-namespace nvidia/gpu-operator \
|
257
280
|
--set 'toolkit.env[0].name=CONTAINERD_CONFIG' \
|
258
281
|
--set 'toolkit.env[0].value=/var/lib/rancher/k3s/agent/etc/containerd/config.toml' \
|
@@ -24,7 +24,8 @@ def deploy_remote_cluster(ip_list: List[str],
|
|
24
24
|
ssh_user: str,
|
25
25
|
ssh_key: str,
|
26
26
|
cleanup: bool,
|
27
|
-
context_name: Optional[str] = None
|
27
|
+
context_name: Optional[str] = None,
|
28
|
+
password: Optional[str] = None):
|
28
29
|
success = False
|
29
30
|
path_to_package = os.path.dirname(__file__)
|
30
31
|
up_script_path = os.path.join(path_to_package, 'deploy_remote_cluster.sh')
|
@@ -47,6 +48,8 @@ def deploy_remote_cluster(ip_list: List[str],
|
|
47
48
|
f'{ssh_user} {key_file.name}')
|
48
49
|
if context_name is not None:
|
49
50
|
deploy_command += f' {context_name}'
|
51
|
+
if password is not None:
|
52
|
+
deploy_command += f' --password {password}'
|
50
53
|
if cleanup:
|
51
54
|
deploy_command += ' --cleanup'
|
52
55
|
|
{skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/RECORD
RENAMED
@@ -1,16 +1,16 @@
|
|
1
|
-
sky/__init__.py,sha256=
|
1
|
+
sky/__init__.py,sha256=4GWeKYvInaF3mKBoHHRbOaX6jSHOfnjY0yHaGLpRmPQ,6428
|
2
2
|
sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
|
3
|
-
sky/authentication.py,sha256=
|
3
|
+
sky/authentication.py,sha256=ND011K_-Ud1dVZF37A9KrwYir_ihJXcHc7iDWmuBc8Q,22872
|
4
4
|
sky/check.py,sha256=iMGuM7yjUPRgDHc13Pf1_LSybBqIexq-6aXfnVcaI54,15898
|
5
|
-
sky/cli.py,sha256=
|
5
|
+
sky/cli.py,sha256=qEyX_VHT96vXQH40BzTqQZXv4iqBg8SFlT5ezed8X7o,222226
|
6
6
|
sky/cloud_stores.py,sha256=yo8xQGr8iabYGmn0E6o6jHsfJiomXCTCcR-WMLnNYTQ,26718
|
7
|
-
sky/core.py,sha256=
|
7
|
+
sky/core.py,sha256=G3n6z0dyvoU4FJVGnnTu3kFdu_EtQC1l57er5voRAX0,47926
|
8
8
|
sky/dag.py,sha256=Yl7Ry26Vql5cv4YMz8g9kOUgtoCihJnw7c8NgZYakMY,3242
|
9
|
-
sky/exceptions.py,sha256=
|
9
|
+
sky/exceptions.py,sha256=EodMj6P0x0JYBiioLNuPoFMj12HzlQTQpfXNX6zHBoA,16837
|
10
10
|
sky/execution.py,sha256=9L8NFOXNphtabnsL7mHGPJeGdw4n6gIIUEOzjW7CEHw,28294
|
11
11
|
sky/global_user_state.py,sha256=uGmwtUL-HVKGqEwlEvIXFcQ_w2IxGE4msnffXUxCIGI,33574
|
12
12
|
sky/models.py,sha256=4xSW05BdDPEjW8Ubvj3VlVOVnzv0TbrolsFvR5R5v1U,638
|
13
|
-
sky/optimizer.py,sha256=
|
13
|
+
sky/optimizer.py,sha256=Tv7Qz7uOEQWRP3CboHSOixOl7IXn8dicpn4ypsWhVUw,60881
|
14
14
|
sky/resources.py,sha256=2qc5U09MFDaJjI1dHcThcRodpMGY7HyXzQn8eC4lvbE,72402
|
15
15
|
sky/sky_logging.py,sha256=pID2RINjH62n7SZpv70DuN8BSFYdCfTJ2ScGQpVmugg,5725
|
16
16
|
sky/skypilot_config.py,sha256=CdaIbPL_7ECG5laOARca4p9df_6NLhT-bO8WnalxZAY,8839
|
@@ -23,7 +23,7 @@ sky/adaptors/common.py,sha256=o17TOFNLm1t0lQvZSJCF1C6RjD6ykKrQ-q1BLPX41XI,3027
|
|
23
23
|
sky/adaptors/cudo.py,sha256=WGvIQrlzJkGDe02Ve7pygA56tHwUc4kwS3XHW8kMFAA,239
|
24
24
|
sky/adaptors/do.py,sha256=dJ0BYbkQoUWVu6_9Pxq3fOu6PngjZyyCQzgjnODXLCA,777
|
25
25
|
sky/adaptors/docker.py,sha256=_kzpZ0fkWHqqQAVVl0llTsCE31KYz3Sjn8psTBQHVkA,468
|
26
|
-
sky/adaptors/gcp.py,sha256=
|
26
|
+
sky/adaptors/gcp.py,sha256=oEb9jClEtApw6PQnxdxDYxOCYsedvM3aiko1EW1FDVo,3501
|
27
27
|
sky/adaptors/ibm.py,sha256=7YbHrWbYcZsJDgxMBNZr1yBI03mjs_C3pnCTCz-MNtQ,5068
|
28
28
|
sky/adaptors/kubernetes.py,sha256=BfbUYMc9AMPvtoPX8f3qVI_tY2mLfGEJI9wSXLJftQs,6678
|
29
29
|
sky/adaptors/nebius.py,sha256=B3KxPYhTJA3zjQ7x9k8_sqFTAkPYXldnM7PAuwy02gA,7512
|
@@ -34,7 +34,7 @@ sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
|
|
34
34
|
sky/backends/__init__.py,sha256=UDjwbUgpTRApbPJnNfR786GadUuwgRk3vsWoVu5RB_c,536
|
35
35
|
sky/backends/backend.py,sha256=4BOqKZ-bwBTpjNnZF4JAHX2m2Iga7EmEn8Ao3tEivaM,7527
|
36
36
|
sky/backends/backend_utils.py,sha256=ndY4IPs1F9QovyiKAnB1FNYGWm52_ylwf_K7wY50cv0,134922
|
37
|
-
sky/backends/cloud_vm_ray_backend.py,sha256=
|
37
|
+
sky/backends/cloud_vm_ray_backend.py,sha256=rWz9eUSq9TauA0HWhwYWm2DaGT2p8yDRxXvigcgx-uA,249578
|
38
38
|
sky/backends/docker_utils.py,sha256=Hyw1YY20EyghhEbYx6O2FIMDcGkNzBzV9TM7LFynei8,8358
|
39
39
|
sky/backends/local_docker_backend.py,sha256=nSYCjms3HOPjPNOrcCqsUKm1WV3AAovRFjEQ7hcEXW4,17021
|
40
40
|
sky/backends/wheel_utils.py,sha256=meypuMaygSXXjGdXfq6dhWl-OrpAybg9KVRoup4D0wU,9098
|
@@ -43,15 +43,15 @@ sky/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
sky/benchmark/benchmark_state.py,sha256=X8CXmuU9KgsDRhKedhFgjeRMUFWtQsjFs1qECvPG2yg,8723
|
44
44
|
sky/benchmark/benchmark_utils.py,sha256=7rf-iHt6RXZ_pnBBWOMwcdodHQW69x27xNyx0yVog1U,26385
|
45
45
|
sky/client/__init__.py,sha256=pz6xvVSd9X-gwqbsDL0E9QOojYqM0KAD0j-NCyCIF1k,38
|
46
|
-
sky/client/cli.py,sha256=
|
46
|
+
sky/client/cli.py,sha256=qEyX_VHT96vXQH40BzTqQZXv4iqBg8SFlT5ezed8X7o,222226
|
47
47
|
sky/client/common.py,sha256=YMgYoSYlV3B_scfCIJRKHvDq6JKvnSvRZDhlRjRmzu0,14780
|
48
|
-
sky/client/sdk.py,sha256=
|
48
|
+
sky/client/sdk.py,sha256=36tvJou2IaG8H5lrqMicv-gSJn6VUDHUtB7V20t4lA8,68620
|
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
|
52
52
|
sky/clouds/cloud.py,sha256=OoSyFNYtby2Y0h2TpfMB_lEeolIZOQcfKgIn6AvRC68,36694
|
53
53
|
sky/clouds/cudo.py,sha256=_UkLEtwJsfDMKlmJfML5W3rA8VArba4x8YGIdnvgZoM,13226
|
54
|
-
sky/clouds/do.py,sha256=
|
54
|
+
sky/clouds/do.py,sha256=ZCJa3PTwnnO-mnX-97gD-7vSmo4tsXLLQU4KfnHogMo,11512
|
55
55
|
sky/clouds/fluidstack.py,sha256=jIqW1MLe55MVME1PATZm8e6_FsiTnJawW7OdytPW0aM,12666
|
56
56
|
sky/clouds/gcp.py,sha256=sUJ9LXUnMxYm6OYZ5P-z1dJHxgVILuC3OW3eFSTNCv8,56919
|
57
57
|
sky/clouds/ibm.py,sha256=XtuPN8QgrwJdb1qb_b-7KwAE2tf_N9wh9eEfi2tcg-s,22013
|
@@ -91,6 +91,7 @@ sky/clouds/service_catalog/data_fetchers/fetch_azure.py,sha256=7YVnoGDGGZI2TK02b
|
|
91
91
|
sky/clouds/service_catalog/data_fetchers/fetch_cudo.py,sha256=52P48lvWN0s1ArjeLPeLemPRpxjSRcHincRle0nqdm4,3440
|
92
92
|
sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py,sha256=hsqpQi_YUI-qil3zLCEGatrR7BkWzywr4otRdHrd-4k,7350
|
93
93
|
sky/clouds/service_catalog/data_fetchers/fetch_gcp.py,sha256=JnugFifzHPQITlbDKoKexE8NqgagOEfQWTxon7P6vJ0,30935
|
94
|
+
sky/clouds/service_catalog/data_fetchers/fetch_ibm.py,sha256=i8zW9TFI_McedGoTe7Mnw6bP30W6dnCEbGJV1ta1VV0,7481
|
94
95
|
sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py,sha256=MUzogyLruLQmIt-To6TsfnGPgv_nnlp49XYbeshsd7I,5003
|
95
96
|
sky/clouds/service_catalog/data_fetchers/fetch_vast.py,sha256=MRxk52FUeG-R2hPUbkH44HXRPou73dxXWYAHDEXg3xU,5016
|
96
97
|
sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py,sha256=Opp2r3KSzXPtwk3lKNbO8IX9QzjoRSwy1kW3jPjtS1c,21453
|
@@ -104,7 +105,7 @@ sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
|
|
104
105
|
sky/data/data_transfer.py,sha256=-JcnVa_LT0kQejcSCnBwYtxhuuaNDPf_Q5oz62p186c,11973
|
105
106
|
sky/data/data_utils.py,sha256=m1rrspfkgux7awWwTvQLFBjVix2KbKgRwgnhJDv3pcw,29895
|
106
107
|
sky/data/mounting_utils.py,sha256=gLplBNKRQvVUBdkIRZO-wW4wpfY_F8xmkMyMfSZasTQ,16832
|
107
|
-
sky/data/storage.py,sha256=
|
108
|
+
sky/data/storage.py,sha256=AfSZ5gAtfpBXmo5mXHYk1thvq8l-I3CZbcax8C4OPmE,233456
|
108
109
|
sky/data/storage_utils.py,sha256=GEERbieI4RoQ4LvzVBieVuvUaDDvfP958edjp8tiWNc,12935
|
109
110
|
sky/jobs/__init__.py,sha256=qoI53-xXE0-SOkrLWigvhgFXjk7dWE0OTqGPYIk-kmM,1458
|
110
111
|
sky/jobs/constants.py,sha256=1XiIqdR5dEgGgepLKWkZCRT3MYSsMBR-dO7N4RTsjwg,3088
|
@@ -121,7 +122,7 @@ sky/jobs/dashboard/templates/index.html,sha256=NrlTDiEHJDt7sViwWgXUSxVCyVl_IEukE
|
|
121
122
|
sky/jobs/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
122
123
|
sky/jobs/server/core.py,sha256=IHbGMEEbEdNS_ivIStv3rYVH6XodFgufrzZb3HGF9uo,25257
|
123
124
|
sky/jobs/server/dashboard_utils.py,sha256=2Mbx40W1pQqPEPHsSDbHeaF0j5cgyKy-_A9Owdwp_AQ,2315
|
124
|
-
sky/jobs/server/server.py,sha256=
|
125
|
+
sky/jobs/server/server.py,sha256=pLobr0ITZJmhWUX-QrUwpZMgm7qy4_PHFuAnp4Xikac,8386
|
125
126
|
sky/provision/__init__.py,sha256=LzOo5LjkRXwSf29dUqN14YbjzQu3liXLQcmweTeZ4dE,6457
|
126
127
|
sky/provision/common.py,sha256=E8AlSUFcn0FYQq1erNmoVfMAdsF9tP2yxfyk-9PLvQU,10286
|
127
128
|
sky/provision/constants.py,sha256=oc_XDUkcoLQ_lwDy5yMeMSWviKS0j0s1c0pjlvpNeWY,800
|
@@ -129,14 +130,14 @@ sky/provision/docker_utils.py,sha256=ENm0LkyrYWic3Ikyacho8X5uDMvGsbkZQsb6kNH1DuI
|
|
129
130
|
sky/provision/instance_setup.py,sha256=8ePBfK8qVb9IWmK7vKL8huXrBj5IdN2WsEbiQ6FtGqQ,24388
|
130
131
|
sky/provision/logging.py,sha256=_sx_TH6nLt0FF3myS5pEZbiMhXyl4s1XwMidu_TTBUw,2091
|
131
132
|
sky/provision/metadata_utils.py,sha256=LrxeV4wD2QPzNdXV_npj8q-pr35FatxBBjF_jSbpOT0,4013
|
132
|
-
sky/provision/provisioner.py,sha256=
|
133
|
+
sky/provision/provisioner.py,sha256=XBUnDxPALMj0CiBMtJY8s_1Q-V5rWWL07olk4jzua_g,29878
|
133
134
|
sky/provision/aws/__init__.py,sha256=mxq8PeWJqUtalDozTNpbtENErRZ1ktEs8uf2aG9UUgU,731
|
134
135
|
sky/provision/aws/config.py,sha256=fGOkkn89EpVFYp4x0LTIauBem2Vsqcy8faEadS8l0nE,25979
|
135
136
|
sky/provision/aws/instance.py,sha256=3okAJ1WkZ0YemH9kvUgA6HpHN6BP7unhDL-CHny1qFI,40849
|
136
|
-
sky/provision/aws/utils.py,sha256=
|
137
|
+
sky/provision/aws/utils.py,sha256=LrjeQ09zA7GoMv9Nt8TlL2A3VqqChsgJ9bL-Q5VLaao,3401
|
137
138
|
sky/provision/azure/__init__.py,sha256=87cgk1_Ws7n9rqaDDPv-HpfrkVeSQMdFQnhnXwyx9g4,548
|
138
139
|
sky/provision/azure/azure-config-template.json,sha256=jrjAgOtpe0e6FSg3vsVqHKQqJe0w-HeWOFT1HuwzS2c,4712
|
139
|
-
sky/provision/azure/config.py,sha256=
|
140
|
+
sky/provision/azure/config.py,sha256=4MdatCG7-38vq8azy9kNDYhNdmndIBTEoQQzeQqPlJ8,8905
|
140
141
|
sky/provision/azure/instance.py,sha256=BQ4stZl_m76iULPY_TFEN4WDwNPWI1jmw-LswxxqXPg,47495
|
141
142
|
sky/provision/cudo/__init__.py,sha256=KAEl26MVPsk7IoP9Gg-MOJJRIV6-X9B0fbyHdyJWdLo,741
|
142
143
|
sky/provision/cudo/config.py,sha256=RYOVkV0MoUqVBJRZiKhBZhjFygeyFs7eUdVMdPg1vds,327
|
@@ -165,7 +166,7 @@ sky/provision/kubernetes/constants.py,sha256=dZCUV8FOO9Gct80sdqeubKnxeW3CGl-u5mx
|
|
165
166
|
sky/provision/kubernetes/instance.py,sha256=oag17OtuiqU-1RjkgW9NvEpxSGUFIYdI7M61S-YmPu8,50503
|
166
167
|
sky/provision/kubernetes/network.py,sha256=AtcOM8wPs_-UlQJhGEQGP6Lh4HIgdx63Y0iWEhP5jyc,12673
|
167
168
|
sky/provision/kubernetes/network_utils.py,sha256=6uck1aBkgtm-gGBitU3_hEUp8j14ZuG_4Xo70ReZYXs,11654
|
168
|
-
sky/provision/kubernetes/utils.py,sha256=
|
169
|
+
sky/provision/kubernetes/utils.py,sha256=37esnQgQgeXfxwWyMqAo6SXCz0EyVvKECy2DOWISDEo,124630
|
169
170
|
sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml,sha256=AMzYzlY0JIlfBWj5eX054Rc1XDW2thUcLSOGMJVhIdA,229
|
170
171
|
sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml,sha256=RtTq4F1QUmR2Uunb6zuuRaPhV7hpesz4saHjn3Ncsb4,2010
|
171
172
|
sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
|
@@ -237,7 +238,7 @@ sky/server/html/log.html,sha256=TSGZktua9Ysl_ysg3w60rjxAxhH61AJnsYDHdtqrjmI,6929
|
|
237
238
|
sky/server/requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
238
239
|
sky/server/requests/event_loop.py,sha256=OhpPbuce65bbjpGRlcJa78AVnYSm08SzFKt70ypCUuQ,1211
|
239
240
|
sky/server/requests/executor.py,sha256=BNJqkTQ3swYeRO5YVW-dTmobL2CYnDDf_m-kY7__n40,21684
|
240
|
-
sky/server/requests/payloads.py,sha256=
|
241
|
+
sky/server/requests/payloads.py,sha256=K9CzEqRLDdU2R7s3yxPDD2vC-h6beD_RPdSRpjoQzu4,16529
|
241
242
|
sky/server/requests/preconditions.py,sha256=ipxIb_3JXG6S3-ymcOdqQNb7VDvoPqADxu9ZK7-nQWc,7179
|
242
243
|
sky/server/requests/requests.py,sha256=9ovdQE-zv_Mvc6IbGATHVyQlOxSKjg_OankZbgDVGeE,21338
|
243
244
|
sky/server/requests/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -338,19 +339,19 @@ sky/utils/cli_utils/status_utils.py,sha256=LwGXzMgvnQeGR1fCC24q38hRLuAPeeSDkQ387
|
|
338
339
|
sky/utils/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
339
340
|
sky/utils/kubernetes/create_cluster.sh,sha256=VLXfazav9XCMQmeKVqhuOQzt2vM6G1jgnvvb0SHUFno,7773
|
340
341
|
sky/utils/kubernetes/delete_cluster.sh,sha256=BSccHF43GyepDNf-FZcenzHzpXXATkVD92vgn1lWPgk,927
|
341
|
-
sky/utils/kubernetes/deploy_remote_cluster.sh,sha256=
|
342
|
+
sky/utils/kubernetes/deploy_remote_cluster.sh,sha256=EQMBC0VUqe3UaiYvwkNq4P6U9bkiBwjTNTE0z-MsTBc,10785
|
342
343
|
sky/utils/kubernetes/exec_kubeconfig_converter.py,sha256=fE1SnteoxI05EaugnWeV82hXwZTVHmbXsh1aaZAgF3c,2548
|
343
344
|
sky/utils/kubernetes/generate_kind_config.py,sha256=_TNLnifA_r7-CRq083IP1xjelYqiLjzQX9ohuqYpDH8,3187
|
344
345
|
sky/utils/kubernetes/generate_kubeconfig.sh,sha256=MBvXJio0PeujZSCXiRKE_pa6HCTiU9qBzR1WrXccVSY,10477
|
345
346
|
sky/utils/kubernetes/gpu_labeler.py,sha256=9VZkC4UuR4vtE6TAz5P0i279Rn8KEaHE35JA9OVHxqI,7006
|
346
347
|
sky/utils/kubernetes/k8s_gpu_labeler_job.yaml,sha256=k0TBoQ4zgf79-sVkixKSGYFHQ7ZWF5gdVIZPupCCo9A,1224
|
347
348
|
sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488oMQvhRZWwsj9vBbPUg,3812
|
348
|
-
sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=
|
349
|
+
sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=HPVgNt-wbCVPd9dpDFiA7t2mzQLpjXHJ61eiwRbEr-c,10378
|
349
350
|
sky/utils/kubernetes/rsync_helper.sh,sha256=h4YwrPFf9727CACnMJvF3EyK_0OeOYKKt4su_daKekw,1256
|
350
351
|
sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
|
351
|
-
skypilot_nightly-1.0.0.
|
352
|
-
skypilot_nightly-1.0.0.
|
353
|
-
skypilot_nightly-1.0.0.
|
354
|
-
skypilot_nightly-1.0.0.
|
355
|
-
skypilot_nightly-1.0.0.
|
356
|
-
skypilot_nightly-1.0.0.
|
352
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
|
353
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/METADATA,sha256=Ean7z4vIG2Xc5ExZ6qUOl-9-84h1smKzaRcmvV4ec18,18657
|
354
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
355
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
|
356
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
|
357
|
+
skypilot_nightly-1.0.0.dev20250328.dist-info/RECORD,,
|
{skypilot_nightly-1.0.0.dev20250326.dist-info → skypilot_nightly-1.0.0.dev20250328.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|