skypilot-nightly 1.0.0.dev20250325__py3-none-any.whl → 1.0.0.dev20250327__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 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 = '052e0ea3b129f208a82fd9d6bddbfd39d389e831'
8
+ _SKYPILOT_COMMIT_SHA = '3618e2b85057a16b6b8204fd69d450faf4eb9dd2'
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.dev20250325'
38
+ __version__ = '1.0.0.dev20250327'
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)}')
@@ -4380,7 +4406,19 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4380
4406
  # If cluster_yaml is None, the cluster should ensured to be terminated,
4381
4407
  # so we don't need to do the double check.
4382
4408
  if handle.cluster_yaml is not None:
4383
- _detect_abnormal_non_terminated_nodes(handle)
4409
+ try:
4410
+ _detect_abnormal_non_terminated_nodes(handle)
4411
+ except exceptions.ClusterStatusFetchingError as e:
4412
+ if purge:
4413
+ msg = common_utils.format_exception(e, use_bracket=True)
4414
+ logger.warning(
4415
+ 'Failed abnormal non-terminated nodes cleanup. '
4416
+ 'Skipping and cleaning up as purge is set. '
4417
+ f'Details: {msg}')
4418
+ logger.debug(f'Full exception details: {msg}',
4419
+ exc_info=True)
4420
+ else:
4421
+ raise
4384
4422
 
4385
4423
  if not terminate or remove_from_db:
4386
4424
  global_user_state.remove_cluster(handle.cluster_name,
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], async_call: bool):
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], async_call: bool):
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) -> server_common.RequestId:
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
- try:
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) -> 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 's3://'
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.source} --endpoint={endpoint_url}`'
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
- schedule_type=api_requests.ScheduleType.SHORT
75
- if jobs_logs_body.refresh else api_requests.ScheduleType.LONG,
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)
@@ -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
- # apparently
28
- # ExpiredTokenException
29
- # ExpiredToken
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 credentials_expiration_codes:
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
- # Do not re-raise the exception here because it looks awful
77
- # and we already print all the info in verbose
78
- raise SystemExit(1)
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
 
@@ -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. Error: '
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
- raise
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__} '
@@ -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:
@@ -464,6 +464,7 @@ class LocalUpBody(RequestBody):
464
464
  ssh_key: Optional[str] = None
465
465
  cleanup: bool = False
466
466
  context_name: Optional[str] = None
467
+ password: Optional[str] = None
467
468
 
468
469
 
469
470
  class ServeTerminateReplicaBody(RequestBody):
@@ -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
- curl -sfL https://get.k3s.io | K3S_TOKEN=$K3S_TOKEN sh - &&
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 [ $i -eq 3 ]; then
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
- curl -sfL https://get.k3s.io | K3S_URL=https://$MASTER_ADDR:6443 K3S_TOKEN=$K3S_TOKEN sh -"
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250325
3
+ Version: 1.0.0.dev20250327
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -193,6 +193,10 @@ Dynamic: summary
193
193
  <img alt="Downloads" src="https://img.shields.io/pypi/dm/skypilot">
194
194
  </a>
195
195
 
196
+ <a href="https://buildkite.com/skypilot-1/full-smoke-tests-run">
197
+ <img alt="Smoke Tests" src="https://badge.buildkite.com/d3aa9d2370e4a9ac4fb5e210381f955082a63a9a46673b197a.svg?theme=github&branch=master">
198
+ </a>
199
+
196
200
  </p>
197
201
 
198
202
  <h3 align="center">
@@ -1,12 +1,12 @@
1
- sky/__init__.py,sha256=jzzTreHALwZbTX4OWf07le6ulM_ZcXSls6qCczUw2yw,6428
1
+ sky/__init__.py,sha256=BYDBJqzOUvoRlsmFlhuipfcIbkiFbj_9FpQutf4nJI0,6428
2
2
  sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
3
- sky/authentication.py,sha256=QWybUjX-O6TXzCDSu2vtSgyeQb-OY9B6gDpT-jwYK9I,22700
3
+ sky/authentication.py,sha256=ND011K_-Ud1dVZF37A9KrwYir_ihJXcHc7iDWmuBc8Q,22872
4
4
  sky/check.py,sha256=iMGuM7yjUPRgDHc13Pf1_LSybBqIexq-6aXfnVcaI54,15898
5
- sky/cli.py,sha256=o1IHTY4YSJzsfkynTynaN1dB4RBPZIRZGWQ4rTnVVnQ,221956
5
+ sky/cli.py,sha256=qEyX_VHT96vXQH40BzTqQZXv4iqBg8SFlT5ezed8X7o,222226
6
6
  sky/cloud_stores.py,sha256=yo8xQGr8iabYGmn0E6o6jHsfJiomXCTCcR-WMLnNYTQ,26718
7
- sky/core.py,sha256=BpZ5v-2aQEUkE3izBfMRSVFrmuTWY5_X_siHRf_ZRtI,47817
7
+ sky/core.py,sha256=G3n6z0dyvoU4FJVGnnTu3kFdu_EtQC1l57er5voRAX0,47926
8
8
  sky/dag.py,sha256=Yl7Ry26Vql5cv4YMz8g9kOUgtoCihJnw7c8NgZYakMY,3242
9
- sky/exceptions.py,sha256=wSLZlhXRTg4EmB1a0GIusaq5izhAReCV1krN_q5pG2s,16727
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
@@ -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=EEjiF_n0HGH3TEjSbY6PQ8nczlhV2kSdUCXe0l8DmJg,3316
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=01QeV_YMRM-izuPyBDBF3YCeiTBQJ9Ye_VRiRjuNrc0,247583
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=o1IHTY4YSJzsfkynTynaN1dB4RBPZIRZGWQ4rTnVVnQ,221956
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=G-nrHjs6-Xq66zX9CHbDOuzVU-VM_rj2NkCGzS0eS0o,68524
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=AHbdq5HqxqxKYp3sOCvywXme_eLckYtn1x-1yhlNH7U,11522
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=FSWTfNqtRHoz5TFHD8R6lRqxat0RVLA_Dqi1NtR7mU0,233449
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=UIg2C0SkeGc_GXGudLWXoJePfPNO30n8qvqrcbgZCec,8018
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=tJEk5PcZ0i61j_4LfcMMbRhnONti5omRammzXswpfkU,29679
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=m49pS-SHGW7Au3bhDeTPsL8N5iRzbwOXzyEWRCc1Vho,3238
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=V5-0Zelt4Xo0vcqnD6PpsnaCS7vc3xosDelILDAKSW4,8885
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=x14q_0SZ5RGdyXELaLtYx7UAptcXdq4MnbepGbFEKX0,124368
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=6egfR6QSpd1WZP7K0joCQOrA0K6n7iTQbKL02T_RCOM,16494
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=SGnqa5ks5Og-F96S_PIUbKzuKAtTF5cYOrXIg5XWx_E,10179
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=NtfbovAECN2A_R8x4FiNPaBVPWeuwaOVuuGsnVOSk2g,10231
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.dev20250325.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
352
- skypilot_nightly-1.0.0.dev20250325.dist-info/METADATA,sha256=pGWGnlDTAfPlT84364EvUGjEyOPd11CmmCMKG-c-cx8,18438
353
- skypilot_nightly-1.0.0.dev20250325.dist-info/WHEEL,sha256=DK49LOLCYiurdXXOXwGJm6U4DkHkg4lcxjhqwRa0CP4,91
354
- skypilot_nightly-1.0.0.dev20250325.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
355
- skypilot_nightly-1.0.0.dev20250325.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
356
- skypilot_nightly-1.0.0.dev20250325.dist-info/RECORD,,
352
+ skypilot_nightly-1.0.0.dev20250327.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
353
+ skypilot_nightly-1.0.0.dev20250327.dist-info/METADATA,sha256=3g4J0v1jI_huAnPYHgau_M3csgHm14O7QuCNM4g6Sy0,18657
354
+ skypilot_nightly-1.0.0.dev20250327.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
355
+ skypilot_nightly-1.0.0.dev20250327.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
356
+ skypilot_nightly-1.0.0.dev20250327.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
357
+ skypilot_nightly-1.0.0.dev20250327.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.0.2)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5