skypilot-nightly 1.0.0.dev20250216__py3-none-any.whl → 1.0.0.dev20250218__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.
Files changed (172) hide show
  1. sky/__init__.py +48 -22
  2. sky/adaptors/aws.py +2 -1
  3. sky/adaptors/azure.py +4 -4
  4. sky/adaptors/cloudflare.py +4 -4
  5. sky/adaptors/kubernetes.py +8 -8
  6. sky/authentication.py +42 -45
  7. sky/backends/backend.py +2 -2
  8. sky/backends/backend_utils.py +108 -221
  9. sky/backends/cloud_vm_ray_backend.py +283 -282
  10. sky/benchmark/benchmark_utils.py +6 -2
  11. sky/check.py +40 -28
  12. sky/cli.py +1213 -1116
  13. sky/client/__init__.py +1 -0
  14. sky/client/cli.py +5644 -0
  15. sky/client/common.py +345 -0
  16. sky/client/sdk.py +1757 -0
  17. sky/cloud_stores.py +12 -6
  18. sky/clouds/__init__.py +0 -2
  19. sky/clouds/aws.py +20 -13
  20. sky/clouds/azure.py +5 -3
  21. sky/clouds/cloud.py +1 -1
  22. sky/clouds/cudo.py +2 -1
  23. sky/clouds/do.py +7 -3
  24. sky/clouds/fluidstack.py +3 -2
  25. sky/clouds/gcp.py +10 -8
  26. sky/clouds/ibm.py +8 -7
  27. sky/clouds/kubernetes.py +7 -6
  28. sky/clouds/lambda_cloud.py +8 -7
  29. sky/clouds/oci.py +4 -3
  30. sky/clouds/paperspace.py +2 -1
  31. sky/clouds/runpod.py +2 -1
  32. sky/clouds/scp.py +8 -7
  33. sky/clouds/service_catalog/__init__.py +3 -3
  34. sky/clouds/service_catalog/aws_catalog.py +7 -1
  35. sky/clouds/service_catalog/common.py +4 -2
  36. sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +2 -2
  37. sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +1 -0
  38. sky/clouds/utils/oci_utils.py +1 -1
  39. sky/clouds/vast.py +2 -1
  40. sky/clouds/vsphere.py +2 -1
  41. sky/core.py +263 -99
  42. sky/dag.py +4 -0
  43. sky/data/mounting_utils.py +2 -1
  44. sky/data/storage.py +97 -35
  45. sky/data/storage_utils.py +69 -9
  46. sky/exceptions.py +138 -5
  47. sky/execution.py +47 -50
  48. sky/global_user_state.py +105 -22
  49. sky/jobs/__init__.py +12 -14
  50. sky/jobs/client/__init__.py +0 -0
  51. sky/jobs/client/sdk.py +296 -0
  52. sky/jobs/constants.py +30 -1
  53. sky/jobs/controller.py +12 -6
  54. sky/jobs/dashboard/dashboard.py +2 -6
  55. sky/jobs/recovery_strategy.py +22 -29
  56. sky/jobs/server/__init__.py +1 -0
  57. sky/jobs/{core.py → server/core.py} +101 -34
  58. sky/jobs/server/dashboard_utils.py +64 -0
  59. sky/jobs/server/server.py +182 -0
  60. sky/jobs/utils.py +32 -23
  61. sky/models.py +27 -0
  62. sky/optimizer.py +22 -22
  63. sky/provision/__init__.py +6 -3
  64. sky/provision/aws/config.py +2 -2
  65. sky/provision/aws/instance.py +1 -1
  66. sky/provision/azure/instance.py +1 -1
  67. sky/provision/cudo/instance.py +1 -1
  68. sky/provision/do/instance.py +1 -1
  69. sky/provision/do/utils.py +0 -5
  70. sky/provision/fluidstack/fluidstack_utils.py +4 -3
  71. sky/provision/fluidstack/instance.py +4 -2
  72. sky/provision/gcp/instance.py +1 -1
  73. sky/provision/instance_setup.py +2 -2
  74. sky/provision/kubernetes/constants.py +8 -0
  75. sky/provision/kubernetes/instance.py +1 -1
  76. sky/provision/kubernetes/utils.py +67 -76
  77. sky/provision/lambda_cloud/instance.py +3 -15
  78. sky/provision/logging.py +1 -1
  79. sky/provision/oci/instance.py +7 -4
  80. sky/provision/paperspace/instance.py +1 -1
  81. sky/provision/provisioner.py +3 -2
  82. sky/provision/runpod/instance.py +1 -1
  83. sky/provision/vast/instance.py +1 -1
  84. sky/provision/vsphere/instance.py +2 -11
  85. sky/resources.py +63 -47
  86. sky/serve/__init__.py +6 -10
  87. sky/serve/client/__init__.py +0 -0
  88. sky/serve/client/sdk.py +366 -0
  89. sky/serve/constants.py +3 -0
  90. sky/serve/replica_managers.py +10 -10
  91. sky/serve/serve_utils.py +56 -36
  92. sky/serve/server/__init__.py +0 -0
  93. sky/serve/{core.py → server/core.py} +37 -17
  94. sky/serve/server/server.py +117 -0
  95. sky/serve/service.py +8 -1
  96. sky/server/__init__.py +1 -0
  97. sky/server/common.py +442 -0
  98. sky/server/constants.py +21 -0
  99. sky/server/html/log.html +174 -0
  100. sky/server/requests/__init__.py +0 -0
  101. sky/server/requests/executor.py +462 -0
  102. sky/server/requests/payloads.py +481 -0
  103. sky/server/requests/queues/__init__.py +0 -0
  104. sky/server/requests/queues/mp_queue.py +76 -0
  105. sky/server/requests/requests.py +567 -0
  106. sky/server/requests/serializers/__init__.py +0 -0
  107. sky/server/requests/serializers/decoders.py +192 -0
  108. sky/server/requests/serializers/encoders.py +166 -0
  109. sky/server/server.py +1095 -0
  110. sky/server/stream_utils.py +144 -0
  111. sky/setup_files/MANIFEST.in +1 -0
  112. sky/setup_files/dependencies.py +12 -4
  113. sky/setup_files/setup.py +1 -1
  114. sky/sky_logging.py +9 -13
  115. sky/skylet/autostop_lib.py +2 -2
  116. sky/skylet/constants.py +46 -12
  117. sky/skylet/events.py +5 -6
  118. sky/skylet/job_lib.py +78 -66
  119. sky/skylet/log_lib.py +17 -11
  120. sky/skypilot_config.py +79 -94
  121. sky/task.py +119 -73
  122. sky/templates/aws-ray.yml.j2 +4 -4
  123. sky/templates/azure-ray.yml.j2 +3 -2
  124. sky/templates/cudo-ray.yml.j2 +3 -2
  125. sky/templates/fluidstack-ray.yml.j2 +3 -2
  126. sky/templates/gcp-ray.yml.j2 +3 -2
  127. sky/templates/ibm-ray.yml.j2 +3 -2
  128. sky/templates/jobs-controller.yaml.j2 +1 -12
  129. sky/templates/kubernetes-ray.yml.j2 +3 -2
  130. sky/templates/lambda-ray.yml.j2 +3 -2
  131. sky/templates/oci-ray.yml.j2 +3 -2
  132. sky/templates/paperspace-ray.yml.j2 +3 -2
  133. sky/templates/runpod-ray.yml.j2 +3 -2
  134. sky/templates/scp-ray.yml.j2 +3 -2
  135. sky/templates/skypilot-server-kubernetes-proxy.sh +36 -0
  136. sky/templates/vsphere-ray.yml.j2 +4 -2
  137. sky/templates/websocket_proxy.py +64 -0
  138. sky/usage/constants.py +8 -0
  139. sky/usage/usage_lib.py +45 -11
  140. sky/utils/accelerator_registry.py +33 -53
  141. sky/utils/admin_policy_utils.py +2 -1
  142. sky/utils/annotations.py +51 -0
  143. sky/utils/cli_utils/status_utils.py +33 -3
  144. sky/utils/cluster_utils.py +356 -0
  145. sky/utils/command_runner.py +69 -14
  146. sky/utils/common.py +74 -0
  147. sky/utils/common_utils.py +133 -93
  148. sky/utils/config_utils.py +204 -0
  149. sky/utils/control_master_utils.py +2 -3
  150. sky/utils/controller_utils.py +133 -147
  151. sky/utils/dag_utils.py +72 -24
  152. sky/utils/kubernetes/deploy_remote_cluster.sh +2 -2
  153. sky/utils/kubernetes/exec_kubeconfig_converter.py +73 -0
  154. sky/utils/kubernetes/kubernetes_deploy_utils.py +228 -0
  155. sky/utils/log_utils.py +83 -23
  156. sky/utils/message_utils.py +81 -0
  157. sky/utils/registry.py +127 -0
  158. sky/utils/resources_utils.py +2 -2
  159. sky/utils/rich_utils.py +213 -34
  160. sky/utils/schemas.py +19 -2
  161. sky/{status_lib.py → utils/status_lib.py} +12 -7
  162. sky/utils/subprocess_utils.py +51 -35
  163. sky/utils/timeline.py +7 -2
  164. sky/utils/ux_utils.py +95 -25
  165. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/METADATA +8 -3
  166. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/RECORD +170 -132
  167. sky/clouds/cloud_registry.py +0 -76
  168. sky/utils/cluster_yaml_utils.py +0 -24
  169. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/LICENSE +0 -0
  170. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/WHEEL +0 -0
  171. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/entry_points.txt +0 -0
  172. {skypilot_nightly-1.0.0.dev20250216.dist-info → skypilot_nightly-1.0.0.dev20250218.dist-info}/top_level.txt +0 -0
@@ -23,8 +23,8 @@ from sky import backends
23
23
  from sky import clouds
24
24
  from sky import data
25
25
  from sky import global_user_state
26
+ from sky import optimizer
26
27
  from sky import sky_logging
27
- from sky import status_lib
28
28
  from sky.backends import backend_utils
29
29
  from sky.benchmark import benchmark_state
30
30
  from sky.data import storage as storage_lib
@@ -34,6 +34,7 @@ from sky.skylet import log_lib
34
34
  from sky.utils import common_utils
35
35
  from sky.utils import log_utils
36
36
  from sky.utils import rich_utils
37
+ from sky.utils import status_lib
37
38
  from sky.utils import subprocess_utils
38
39
  from sky.utils import ux_utils
39
40
 
@@ -100,7 +101,9 @@ def _get_optimized_resources(
100
101
  task = sky.Task()
101
102
  task.set_resources(resources)
102
103
 
103
- dag = sky.optimize(dag, quiet=True)
104
+ # Do not use `sky.optimize` here, as this should be called on the API
105
+ # server side.
106
+ dag = optimizer.Optimizer.optimize(dag, quiet=True)
104
107
  task = dag.tasks[0]
105
108
  optimized_resources.append(task.best_resources)
106
109
  return optimized_resources
@@ -183,6 +186,7 @@ def _create_benchmark_bucket() -> Tuple[str, str]:
183
186
  # Create a benchmark bucket.
184
187
  logger.info(f'Creating a bucket {bucket_name} to save the benchmark logs.')
185
188
  storage = data.Storage(bucket_name, source=None, persistent=True)
189
+ storage.construct()
186
190
  storage.add_store(bucket_type)
187
191
 
188
192
  # Save the bucket name and type to the config.
sky/check.py CHANGED
@@ -6,22 +6,28 @@ from typing import Dict, Iterable, List, Optional, Tuple, Union
6
6
 
7
7
  import click
8
8
  import colorama
9
- import rich
10
9
 
11
10
  from sky import clouds as sky_clouds
12
11
  from sky import exceptions
13
12
  from sky import global_user_state
14
13
  from sky import skypilot_config
15
14
  from sky.adaptors import cloudflare
15
+ from sky.utils import registry
16
+ from sky.utils import rich_utils
16
17
  from sky.utils import ux_utils
17
18
 
19
+ CHECK_MARK_EMOJI = '\U00002714' # Heavy check mark unicode
20
+ PARTY_POPPER_EMOJI = '\U0001F389' # Party popper unicode
21
+
18
22
 
19
23
  def check(
20
24
  quiet: bool = False,
21
25
  verbose: bool = False,
22
26
  clouds: Optional[Iterable[str]] = None,
23
- ) -> None:
24
- echo = (lambda *_args, **_kwargs: None) if quiet else click.echo
27
+ ) -> List[str]:
28
+ echo = (lambda *_args, **_kwargs: None
29
+ ) if quiet else lambda *args, **kwargs: click.echo(
30
+ *args, **kwargs, color=True)
25
31
  echo('Checking credentials to enable clouds for SkyPilot.')
26
32
  enabled_clouds = []
27
33
  disabled_clouds = []
@@ -30,14 +36,13 @@ def check(
30
36
  cloud_tuple: Tuple[str, Union[sky_clouds.Cloud,
31
37
  ModuleType]]) -> None:
32
38
  cloud_repr, cloud = cloud_tuple
33
- echo(f' Checking {cloud_repr}...', nl=False)
34
- try:
35
- ok, reason = cloud.check_credentials()
36
- except Exception: # pylint: disable=broad-except
37
- # Catch all exceptions to prevent a single cloud from blocking the
38
- # check for other clouds.
39
- ok, reason = False, traceback.format_exc()
40
- echo('\r', nl=False)
39
+ with rich_utils.safe_status(f'Checking {cloud_repr}...'):
40
+ try:
41
+ ok, reason = cloud.check_credentials()
42
+ except Exception: # pylint: disable=broad-except
43
+ # Catch all exceptions to prevent a single cloud from blocking
44
+ # the check for other clouds.
45
+ ok, reason = False, traceback.format_exc()
41
46
  status_msg = 'enabled' if ok else 'disabled'
42
47
  styles = {'fg': 'green', 'bold': False} if ok else {'dim': True}
43
48
  echo(' ' + click.style(f'{cloud_repr}: {status_msg}', **styles) +
@@ -61,12 +66,12 @@ def check(
61
66
  if cloud_name.lower().startswith('cloudflare'):
62
67
  return cloudflare.SKY_CHECK_NAME, cloudflare
63
68
  else:
64
- cloud_obj = sky_clouds.CLOUD_REGISTRY.from_str(cloud_name)
69
+ cloud_obj = registry.CLOUD_REGISTRY.from_str(cloud_name)
65
70
  assert cloud_obj is not None, f'Cloud {cloud_name!r} not found'
66
71
  return repr(cloud_obj), cloud_obj
67
72
 
68
73
  def get_all_clouds():
69
- return tuple([repr(c) for c in sky_clouds.CLOUD_REGISTRY.values()] +
74
+ return tuple([repr(c) for c in registry.CLOUD_REGISTRY.values()] +
70
75
  [cloudflare.SKY_CHECK_NAME])
71
76
 
72
77
  if clouds is not None:
@@ -94,7 +99,7 @@ def check(
94
99
  for cloud_tuple in sorted(clouds_to_check):
95
100
  check_one_cloud(cloud_tuple)
96
101
 
97
- # Cloudflare is not a real cloud in sky_clouds.CLOUD_REGISTRY, and should
102
+ # Cloudflare is not a real cloud in registry.CLOUD_REGISTRY, and should
98
103
  # not be inserted into the DB (otherwise `sky launch` and other code would
99
104
  # error out when it's trying to look it up in the registry).
100
105
  enabled_clouds_set = {
@@ -154,11 +159,14 @@ def check(
154
159
 
155
160
  # Pretty print for UX.
156
161
  if not quiet:
157
- enabled_clouds_str = '\n :heavy_check_mark: '.join(
158
- [''] +
159
- [_format_enabled_cloud(c) for c in sorted(all_enabled_clouds)])
160
- rich.print('\n[green]:tada: Enabled clouds :tada:'
161
- f'{enabled_clouds_str}[/green]')
162
+ enabled_clouds_str = '\n ' + '\n '.join([
163
+ _format_enabled_cloud(cloud)
164
+ for cloud in sorted(all_enabled_clouds)
165
+ ])
166
+ echo(f'\n{colorama.Fore.GREEN}{PARTY_POPPER_EMOJI} '
167
+ f'Enabled clouds {PARTY_POPPER_EMOJI}'
168
+ f'{colorama.Style.RESET_ALL}{enabled_clouds_str}')
169
+ return enabled_clouds
162
170
 
163
171
 
164
172
  def get_cached_enabled_clouds_or_refresh(
@@ -205,7 +213,7 @@ def get_cloud_credential_file_mounts(
205
213
  # enabled clouds because users may have partial credentials for some
206
214
  # clouds to access their specific resources (e.g. cloud storage) but
207
215
  # not have the complete credentials to pass sky check.
208
- clouds = sky_clouds.CLOUD_REGISTRY.values()
216
+ clouds = registry.CLOUD_REGISTRY.values()
209
217
  file_mounts = {}
210
218
  for cloud in clouds:
211
219
  if (excluded_clouds is not None and
@@ -226,11 +234,15 @@ def get_cloud_credential_file_mounts(
226
234
 
227
235
 
228
236
  def _format_enabled_cloud(cloud_name: str) -> str:
237
+
238
+ def _green_color(cloud_name: str) -> str:
239
+ return f'{colorama.Fore.GREEN}{cloud_name}{colorama.Style.RESET_ALL}'
240
+
229
241
  if cloud_name == repr(sky_clouds.Kubernetes()):
230
242
  # Get enabled contexts for Kubernetes
231
243
  existing_contexts = sky_clouds.Kubernetes.existing_allowed_contexts()
232
244
  if not existing_contexts:
233
- return cloud_name
245
+ return _green_color(cloud_name)
234
246
 
235
247
  # Check if allowed_contexts is explicitly set in config
236
248
  allowed_contexts = skypilot_config.get_nested(
@@ -240,15 +252,15 @@ def _format_enabled_cloud(cloud_name: str) -> str:
240
252
  if allowed_contexts is not None:
241
253
  contexts_formatted = []
242
254
  for i, context in enumerate(existing_contexts):
243
- # TODO: We should use ux_utils.INDENT_SYMBOL and
244
- # INDENT_LAST_SYMBOL but, they are formatted for colorama, while
245
- # here we are using rich. We should migrate this file to
246
- # use colorama as we do in the rest of the codebase.
247
- symbol = ('└── ' if i == len(existing_contexts) - 1 else '├── ')
255
+ symbol = (ux_utils.INDENT_LAST_SYMBOL
256
+ if i == len(existing_contexts) -
257
+ 1 else ux_utils.INDENT_SYMBOL)
248
258
  contexts_formatted.append(f'\n {symbol}{context}')
249
259
  context_info = f'Allowed contexts:{"".join(contexts_formatted)}'
250
260
  else:
251
261
  context_info = f'Active context: {existing_contexts[0]}'
252
262
 
253
- return f'{cloud_name}[/green][dim]\n {context_info}[/dim][green]'
254
- return cloud_name
263
+ return (f'{_green_color(cloud_name)}\n'
264
+ f' {colorama.Style.DIM}{context_info}'
265
+ f'{colorama.Style.RESET_ALL}')
266
+ return _green_color(cloud_name)