skypilot-nightly 1.0.0.dev20250424__py3-none-any.whl → 1.0.0.dev20250425__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 (25) hide show
  1. sky/__init__.py +2 -2
  2. sky/adaptors/aws.py +57 -4
  3. sky/adaptors/common.py +2 -1
  4. sky/adaptors/kubernetes.py +14 -9
  5. sky/clouds/aws.py +3 -4
  6. sky/clouds/gcp.py +5 -2
  7. sky/clouds/service_catalog/data_fetchers/fetch_aws.py +3 -2
  8. sky/dashboard/out/404.html +1 -1
  9. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  10. sky/dashboard/out/clusters/[cluster].html +1 -1
  11. sky/dashboard/out/clusters.html +1 -1
  12. sky/dashboard/out/index.html +1 -1
  13. sky/dashboard/out/jobs/[job].html +1 -1
  14. sky/dashboard/out/jobs.html +1 -1
  15. sky/data/storage.py +4 -4
  16. sky/provision/aws/config.py +30 -11
  17. sky/provision/aws/instance.py +20 -9
  18. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.dist-info}/METADATA +1 -1
  19. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.dist-info}/RECORD +25 -25
  20. /sky/dashboard/out/_next/static/{MqmRhu1oPMgLy6v25hibm → hTtTTWqHyRidxVG24ujEi}/_buildManifest.js +0 -0
  21. /sky/dashboard/out/_next/static/{MqmRhu1oPMgLy6v25hibm → hTtTTWqHyRidxVG24ujEi}/_ssgManifest.js +0 -0
  22. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.dist-info}/WHEEL +0 -0
  23. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.dist-info}/entry_points.txt +0 -0
  24. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.dist-info}/licenses/LICENSE +0 -0
  25. {skypilot_nightly-1.0.0.dev20250424.dist-info → skypilot_nightly-1.0.0.dev20250425.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 = '3d993746d92a6d4cc8802156663bce1a4bf15b92'
8
+ _SKYPILOT_COMMIT_SHA = 'e9e27ba0f154b7c292791c4e1290a5a55338e20b'
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.dev20250424'
38
+ __version__ = '1.0.0.dev20250425'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
sky/adaptors/aws.py CHANGED
@@ -31,12 +31,22 @@ This is informed by the following boto3 docs:
31
31
  import logging
32
32
  import threading
33
33
  import time
34
- from typing import Any, Callable
34
+ import typing
35
+ from typing import Callable, Literal, Optional, TypeVar
35
36
 
36
37
  from sky.adaptors import common
37
38
  from sky.utils import annotations
38
39
  from sky.utils import common_utils
39
40
 
41
+ if typing.TYPE_CHECKING:
42
+ import boto3
43
+ _ = boto3 # Supress pylint use before assignment error
44
+ import mypy_boto3_ec2
45
+ import mypy_boto3_iam
46
+ import mypy_boto3_s3
47
+ import mypy_boto3_service_quotas
48
+ import mypy_boto3_sts
49
+
40
50
  _IMPORT_ERROR_MESSAGE = ('Failed to import dependencies for AWS. '
41
51
  'Try pip install "skypilot[aws]"')
42
52
  boto3 = common.LazyImport('boto3', import_error_message=_IMPORT_ERROR_MESSAGE)
@@ -44,6 +54,8 @@ botocore = common.LazyImport('botocore',
44
54
  import_error_message=_IMPORT_ERROR_MESSAGE)
45
55
  _LAZY_MODULES = (boto3, botocore)
46
56
 
57
+ T = TypeVar('T')
58
+
47
59
  logger = logging.getLogger(__name__)
48
60
  _session_creation_lock = threading.RLock()
49
61
 
@@ -73,8 +85,8 @@ def _assert_kwargs_builtin_type(kwargs):
73
85
  f'kwargs should not contain none built-in types: {kwargs}')
74
86
 
75
87
 
76
- def _create_aws_object(creation_fn_or_cls: Callable[[], Any],
77
- object_name: str) -> Any:
88
+ def _create_aws_object(creation_fn_or_cls: Callable[[], T],
89
+ object_name: str) -> T:
78
90
  """Create an AWS object.
79
91
 
80
92
  Args:
@@ -123,6 +135,25 @@ def session(check_credentials: bool = True):
123
135
  return s
124
136
 
125
137
 
138
+ # New typing overloads can be added as needed.
139
+ @typing.overload
140
+ def resource(service_name: Literal['ec2'],
141
+ **kwargs) -> 'mypy_boto3_ec2.ServiceResource':
142
+ ...
143
+
144
+
145
+ @typing.overload
146
+ def resource(service_name: Literal['s3'],
147
+ **kwargs) -> 'mypy_boto3_s3.ServiceResource':
148
+ ...
149
+
150
+
151
+ @typing.overload
152
+ def resource(service_name: Literal['iam'],
153
+ **kwargs) -> 'mypy_boto3_iam.ServiceResource':
154
+ ...
155
+
156
+
126
157
  # Avoid caching the resource/client objects. If we are using the assumed role,
127
158
  # the credentials will be automatically rotated, but the cached resource/client
128
159
  # object will only refresh the credentials with a fixed 15 minutes interval,
@@ -142,7 +173,7 @@ def resource(service_name: str, **kwargs):
142
173
  """
143
174
  _assert_kwargs_builtin_type(kwargs)
144
175
 
145
- max_attempts = kwargs.pop('max_attempts', None)
176
+ max_attempts: Optional[int] = kwargs.pop('max_attempts', None)
146
177
  if max_attempts is not None:
147
178
  config = botocore_config().Config(
148
179
  retries={'max_attempts': max_attempts})
@@ -158,6 +189,28 @@ def resource(service_name: str, **kwargs):
158
189
  service_name, **kwargs), 'resource')
159
190
 
160
191
 
192
+ # New typing overloads can be added as needed.
193
+ @typing.overload
194
+ def client(service_name: Literal['s3'], **kwargs) -> 'mypy_boto3_s3.Client':
195
+ pass
196
+
197
+
198
+ @typing.overload
199
+ def client(service_name: Literal['ec2'], **kwargs) -> 'mypy_boto3_ec2.Client':
200
+ pass
201
+
202
+
203
+ @typing.overload
204
+ def client(service_name: Literal['sts'], **kwargs) -> 'mypy_boto3_sts.Client':
205
+ pass
206
+
207
+
208
+ @typing.overload
209
+ def client(service_name: Literal['service-quotas'],
210
+ **kwargs) -> 'mypy_boto3_service_quotas.Client':
211
+ pass
212
+
213
+
161
214
  def client(service_name: str, **kwargs):
162
215
  """Create an AWS client of a certain service.
163
216
 
sky/adaptors/common.py CHANGED
@@ -2,10 +2,11 @@
2
2
  import functools
3
3
  import importlib
4
4
  import threading
5
+ import types
5
6
  from typing import Any, Callable, Optional, Tuple
6
7
 
7
8
 
8
- class LazyImport:
9
+ class LazyImport(types.ModuleType):
9
10
  """Lazy importer for modules.
10
11
 
11
12
  This is mainly used in two cases:
@@ -70,21 +70,26 @@ def _load_config(context: Optional[str] = None):
70
70
  kubernetes.config.load_kube_config(context=context)
71
71
  except kubernetes.config.config_exception.ConfigException as e:
72
72
  suffix = common_utils.format_exception(e, use_bracket=True)
73
+ context_name = '(current-context)' if context is None else context
73
74
  # Check if exception was due to no current-context
74
75
  if 'Expected key current-context' in str(e):
75
- err_str = (
76
- f'Failed to load Kubernetes configuration for {context!r}. '
77
- 'Kubeconfig does not contain any valid context(s).'
78
- f'\n{suffix}\n'
79
- ' If you were running a local Kubernetes '
80
- 'cluster, run `sky local up` to start the cluster.')
76
+ err_str = ('Failed to load Kubernetes configuration for '
77
+ f'{context_name!r}. '
78
+ 'Kubeconfig does not contain any valid context(s).'
79
+ f'\n{suffix}\n'
80
+ ' If you were running a local Kubernetes '
81
+ 'cluster, run `sky local up` to start the cluster.')
81
82
  else:
82
83
  kubeconfig_path = os.environ.get('KUBECONFIG', '~/.kube/config')
83
84
  err_str = (
84
- f'Failed to load Kubernetes configuration for {context!r}. '
85
- 'Please check if your kubeconfig file exists at '
86
- f'{kubeconfig_path} and is valid.\n{suffix}')
85
+ f'Failed to load Kubernetes configuration for '
86
+ f'{context_name!r}. Please check if your kubeconfig file '
87
+ f'exists at {kubeconfig_path} and is valid.\n{suffix}')
87
88
  err_str += '\nTo disable Kubernetes for SkyPilot: run `sky check`.'
89
+ if context is None: # kubernetes defaults to current-context.
90
+ err_str += (
91
+ '\nHint: Kubernetes attempted to query the current-context '
92
+ 'set in kubeconfig. Check if the current-context is valid.')
88
93
  with ux_utils.print_exception_no_traceback():
89
94
  raise ValueError(err_str) from None
90
95
 
sky/clouds/aws.py CHANGED
@@ -312,13 +312,12 @@ class AWS(clouds.Cloud):
312
312
  'Example: ami-0729d913a335efca7')
313
313
  try:
314
314
  client = aws.client('ec2', region_name=region)
315
- image_info = client.describe_images(ImageIds=[image_id])
316
- image_info = image_info.get('Images', [])
315
+ image_info = client.describe_images(ImageIds=[image_id]).get(
316
+ 'Images', [])
317
317
  if not image_info:
318
318
  with ux_utils.print_exception_no_traceback():
319
319
  raise ValueError(image_not_found_message)
320
- image_info = image_info[0]
321
- image_size = image_info['BlockDeviceMappings'][0]['Ebs'][
320
+ image_size = image_info[0]['BlockDeviceMappings'][0]['Ebs'][
322
321
  'VolumeSize']
323
322
  except (aws.botocore_exceptions().NoCredentialsError,
324
323
  aws.botocore_exceptions().ProfileNotFound):
sky/clouds/gcp.py CHANGED
@@ -174,7 +174,10 @@ class GCP(clouds.Cloud):
174
174
  # Install the Google Cloud SDK:
175
175
  f'{_INDENT_PREFIX} $ pip install google-api-python-client\n'
176
176
  f'{_INDENT_PREFIX} $ conda install -c conda-forge '
177
- 'google-cloud-sdk -y')
177
+ 'google-cloud-sdk -y\n'
178
+ f'{_INDENT_PREFIX} If gcloud was recently installed with wget, API server'
179
+ ' may need to be restarted with following commands:\n'
180
+ f'{_INDENT_PREFIX} $ sky api stop; sky api start')
178
181
 
179
182
  _CREDENTIAL_HINT = (
180
183
  'Run the following commands:\n'
@@ -776,7 +779,7 @@ class GCP(clouds.Cloud):
776
779
  raise FileNotFoundError(file)
777
780
  except FileNotFoundError as e:
778
781
  return False, (
779
- f'Credentails are not set. '
782
+ f'Credentials are not set. '
780
783
  f'{cls._CREDENTIAL_HINT}\n'
781
784
  f'{cls._INDENT_PREFIX}Details: '
782
785
  f'{common_utils.format_exception(e, use_bracket=True)}')
@@ -13,7 +13,7 @@ import sys
13
13
  import textwrap
14
14
  import traceback
15
15
  import typing
16
- from typing import Dict, List, Optional, Set, Tuple, Union
16
+ from typing import List, Optional, Set, Tuple, Union
17
17
 
18
18
  import numpy as np
19
19
 
@@ -24,6 +24,7 @@ from sky.utils import log_utils
24
24
  from sky.utils import ux_utils
25
25
 
26
26
  if typing.TYPE_CHECKING:
27
+ from mypy_boto3_ec2 import type_defs as ec2_type_defs
27
28
  import pandas as pd
28
29
  else:
29
30
  pd = adaptors_common.LazyImport('pandas')
@@ -192,7 +193,7 @@ def _get_spot_pricing_table(region: str) -> 'pd.DataFrame':
192
193
  paginator = client.get_paginator('describe_spot_price_history')
193
194
  response_iterator = paginator.paginate(ProductDescriptions=['Linux/UNIX'],
194
195
  StartTime=datetime.datetime.utcnow())
195
- ret: List[Dict[str, str]] = []
196
+ ret: List['ec2_type_defs.SpotPriceTypeDef'] = []
196
197
  for response in response_iterator:
197
198
  # response['SpotPriceHistory'] is a list of dicts, each dict is like:
198
199
  # {
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-6ac338bc2239cb45.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-6ac338bc2239cb45.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/236-2db3ee3fba33dd9e.js" defer=""></script><script src="/dashboard/_next/static/chunks/37-0a572fe0dbb89c4d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-f383db7389368ea7.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/236-2db3ee3fba33dd9e.js" defer=""></script><script src="/dashboard/_next/static/chunks/37-0a572fe0dbb89c4d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-f383db7389368ea7.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="preload" href="/dashboard/skypilot.svg" as="image" fetchpriority="high"/><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/37-0a572fe0dbb89c4d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="min-h-screen bg-gray-50"><div class="fixed top-0 left-0 right-0 z-50 shadow-sm"><div class="fixed top-0 left-0 right-0 bg-white z-30 h-14 px-4 border-b border-gray-200 shadow-sm"><div class="flex items-center h-full"><div class="flex items-center space-x-4 mr-6"><a class="flex items-center px-1 pt-1 h-full" href="/dashboard"><div class="h-20 w-20 flex items-center justify-center"><img alt="SkyPilot Logo" fetchpriority="high" width="80" height="80" decoding="async" data-nimg="1" class="w-full h-full object-contain" style="color:transparent" src="/dashboard/skypilot.svg"/></div></a></div><div class="flex items-center space-x-2 md:space-x-6 mr-6"><a class="inline-flex items-center border-b-2 border-transparent text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/clusters"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg><span>Clusters</span></a><a class="inline-flex items-center border-b-2 border-transparent hover:text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/jobs"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path><rect width="20" height="14" x="2" y="6" rx="2"></rect></svg><span>Jobs</span></a><div class="inline-flex items-center px-1 pt-1 text-gray-400"><svg class="w-4 h-4" viewBox="0 0 423.683 423.683" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><g><path d="M54.376,287.577h310.459c26.48,0,48.02-13.979,48.02-40.453c0-17.916-10.001-34.07-25.559-42.292 c-19.021-72.951-86.061-125.196-162.002-125.223v-3.431h-3.854V61.814h3.854v-9.569h-31.38v9.569h3.854v14.363h-3.854v3.431 c-75.941,0.026-142.97,52.272-161.988,125.217c-15.56,8.216-25.573,24.376-25.573,42.291 C6.36,273.597,27.896,287.577,54.376,287.577z M47.676,227.145l7.214-2.424l1.617-7.447 c13.884-64.232,71.707-110.862,137.467-110.862h31.274c65.763,0,123.582,46.63,137.473,110.862l1.607,7.447l7.223,2.424 c8.678,2.92,14.506,10.946,14.506,19.979c0,11.703-9.517,13.647-21.221,13.647H54.376c-11.7,0-21.22-1.944-21.22-13.647 C33.162,238.091,38.984,230.065,47.676,227.145z M423.683,334.602v36.836H0v-36.836h25.348v-18.418h372.99v18.418H423.683z"></path></g></g></svg><span class="ml-2">Services</span><span class="text-xs ml-2 px-1.5 py-0.5 bg-gray-100 text-gray-500 rounded">Soon</span></div></div><div class="flex items-center space-x-1 ml-auto"><a href="https://skypilot.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-2 py-1 text-gray-600 hover:text-blue-600 transition-colors duration-150 cursor-pointer" title="Docs"><span class="mr-1">Docs</span><svg class="w-3.5 h-3.5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg></a><div class="border-l border-gray-200 h-6 mx-1"></div><a href="https://github.com/skypilot-org/skypilot" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="GitHub"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://slack.skypilot.co/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Slack"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path transform="scale(0.85) translate(1.8, 1.8)" d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z"></path></svg></a><a href="https://github.com/skypilot-org/skypilot/issues/new" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Leave Feedback"><svg class="w-5 h-5" stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g><path fill="none" d="M0 0h24v24H0z"></path><path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455zM4 18.385L5.763 17H20V5H4v13.385zM11 13h2v2h-2v-2zm0-6h2v5h-2V7z"></path></g></svg></a></div></div></div></div><div class="transition-all duration-200 ease-in-out min-h-screen" style="padding-top:56px"><main class="p-6"><div class="flex items-center justify-between mb-4 h-5"><div class="text-base"><a class="text-sky-blue hover:underline leading-none" href="/dashboard/clusters">Sky Clusters</a></div><div class="flex items-center"><button class="justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent h-10 px-4 py-2 text-sky-blue hover:text-sky-blue-bright flex items-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-cw h-4 w-4 mr-1.5"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path></svg><span>Refresh</span></button></div></div><div><div class="rounded-lg border bg-card text-card-foreground shadow-sm"><div class="relative w-full overflow-auto"><table class="w-full caption-bottom text-base"><thead class="[&amp;_tr]:border-b"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Status</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Cluster</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">User</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Resources</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Region</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Started</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Actions</th></tr></thead><tbody class="[&amp;_tr:last-child]:border-0"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><td class="p-4 align-middle [&amp;:has([role=checkbox])]:pr-0 text-center py-6 text-gray-500" colSpan="8">No active clusters</td></tr></tbody></table></div></div></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="preload" href="/dashboard/skypilot.svg" as="image" fetchpriority="high"/><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/37-0a572fe0dbb89c4d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="min-h-screen bg-gray-50"><div class="fixed top-0 left-0 right-0 z-50 shadow-sm"><div class="fixed top-0 left-0 right-0 bg-white z-30 h-14 px-4 border-b border-gray-200 shadow-sm"><div class="flex items-center h-full"><div class="flex items-center space-x-4 mr-6"><a class="flex items-center px-1 pt-1 h-full" href="/dashboard"><div class="h-20 w-20 flex items-center justify-center"><img alt="SkyPilot Logo" fetchpriority="high" width="80" height="80" decoding="async" data-nimg="1" class="w-full h-full object-contain" style="color:transparent" src="/dashboard/skypilot.svg"/></div></a></div><div class="flex items-center space-x-2 md:space-x-6 mr-6"><a class="inline-flex items-center border-b-2 border-transparent text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/clusters"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg><span>Clusters</span></a><a class="inline-flex items-center border-b-2 border-transparent hover:text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/jobs"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path><rect width="20" height="14" x="2" y="6" rx="2"></rect></svg><span>Jobs</span></a><div class="inline-flex items-center px-1 pt-1 text-gray-400"><svg class="w-4 h-4" viewBox="0 0 423.683 423.683" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><g><path d="M54.376,287.577h310.459c26.48,0,48.02-13.979,48.02-40.453c0-17.916-10.001-34.07-25.559-42.292 c-19.021-72.951-86.061-125.196-162.002-125.223v-3.431h-3.854V61.814h3.854v-9.569h-31.38v9.569h3.854v14.363h-3.854v3.431 c-75.941,0.026-142.97,52.272-161.988,125.217c-15.56,8.216-25.573,24.376-25.573,42.291 C6.36,273.597,27.896,287.577,54.376,287.577z M47.676,227.145l7.214-2.424l1.617-7.447 c13.884-64.232,71.707-110.862,137.467-110.862h31.274c65.763,0,123.582,46.63,137.473,110.862l1.607,7.447l7.223,2.424 c8.678,2.92,14.506,10.946,14.506,19.979c0,11.703-9.517,13.647-21.221,13.647H54.376c-11.7,0-21.22-1.944-21.22-13.647 C33.162,238.091,38.984,230.065,47.676,227.145z M423.683,334.602v36.836H0v-36.836h25.348v-18.418h372.99v18.418H423.683z"></path></g></g></svg><span class="ml-2">Services</span><span class="text-xs ml-2 px-1.5 py-0.5 bg-gray-100 text-gray-500 rounded">Soon</span></div></div><div class="flex items-center space-x-1 ml-auto"><a href="https://skypilot.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-2 py-1 text-gray-600 hover:text-blue-600 transition-colors duration-150 cursor-pointer" title="Docs"><span class="mr-1">Docs</span><svg class="w-3.5 h-3.5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg></a><div class="border-l border-gray-200 h-6 mx-1"></div><a href="https://github.com/skypilot-org/skypilot" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="GitHub"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://slack.skypilot.co/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Slack"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path transform="scale(0.85) translate(1.8, 1.8)" d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z"></path></svg></a><a href="https://github.com/skypilot-org/skypilot/issues/new" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Leave Feedback"><svg class="w-5 h-5" stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g><path fill="none" d="M0 0h24v24H0z"></path><path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455zM4 18.385L5.763 17H20V5H4v13.385zM11 13h2v2h-2v-2zm0-6h2v5h-2V7z"></path></g></svg></a></div></div></div></div><div class="transition-all duration-200 ease-in-out min-h-screen" style="padding-top:56px"><main class="p-6"><div class="flex items-center justify-between mb-4 h-5"><div class="text-base"><a class="text-sky-blue hover:underline leading-none" href="/dashboard/clusters">Sky Clusters</a></div><div class="flex items-center"><button class="justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent h-10 px-4 py-2 text-sky-blue hover:text-sky-blue-bright flex items-center"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-cw h-4 w-4 mr-1.5"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path></svg><span>Refresh</span></button></div></div><div><div class="rounded-lg border bg-card text-card-foreground shadow-sm"><div class="relative w-full overflow-auto"><table class="w-full caption-bottom text-base"><thead class="[&amp;_tr]:border-b"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Status</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Cluster</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">User</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Resources</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Region</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Started</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Actions</th></tr></thead><tbody class="[&amp;_tr:last-child]:border-0"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><td class="p-4 align-middle [&amp;:has([role=checkbox])]:pr-0 text-center py-6 text-gray-500" colSpan="8">No active clusters</td></tr></tbody></table></div></div></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-f9f039532ca8cbc4.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-f9f039532ca8cbc4.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-1c519e1afc523dc9.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-1c519e1afc523dc9.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div>Loading...</div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="preload" href="/dashboard/skypilot.svg" as="image" fetchpriority="high"/><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/236-2db3ee3fba33dd9e.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="min-h-screen bg-gray-50"><div class="fixed top-0 left-0 right-0 z-50 shadow-sm"><div class="fixed top-0 left-0 right-0 bg-white z-30 h-14 px-4 border-b border-gray-200 shadow-sm"><div class="flex items-center h-full"><div class="flex items-center space-x-4 mr-6"><a class="flex items-center px-1 pt-1 h-full" href="/dashboard"><div class="h-20 w-20 flex items-center justify-center"><img alt="SkyPilot Logo" fetchpriority="high" width="80" height="80" decoding="async" data-nimg="1" class="w-full h-full object-contain" style="color:transparent" src="/dashboard/skypilot.svg"/></div></a></div><div class="flex items-center space-x-2 md:space-x-6 mr-6"><a class="inline-flex items-center border-b-2 border-transparent hover:text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/clusters"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg><span>Clusters</span></a><a class="inline-flex items-center border-b-2 border-transparent text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/jobs"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path><rect width="20" height="14" x="2" y="6" rx="2"></rect></svg><span>Jobs</span></a><div class="inline-flex items-center px-1 pt-1 text-gray-400"><svg class="w-4 h-4" viewBox="0 0 423.683 423.683" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><g><path d="M54.376,287.577h310.459c26.48,0,48.02-13.979,48.02-40.453c0-17.916-10.001-34.07-25.559-42.292 c-19.021-72.951-86.061-125.196-162.002-125.223v-3.431h-3.854V61.814h3.854v-9.569h-31.38v9.569h3.854v14.363h-3.854v3.431 c-75.941,0.026-142.97,52.272-161.988,125.217c-15.56,8.216-25.573,24.376-25.573,42.291 C6.36,273.597,27.896,287.577,54.376,287.577z M47.676,227.145l7.214-2.424l1.617-7.447 c13.884-64.232,71.707-110.862,137.467-110.862h31.274c65.763,0,123.582,46.63,137.473,110.862l1.607,7.447l7.223,2.424 c8.678,2.92,14.506,10.946,14.506,19.979c0,11.703-9.517,13.647-21.221,13.647H54.376c-11.7,0-21.22-1.944-21.22-13.647 C33.162,238.091,38.984,230.065,47.676,227.145z M423.683,334.602v36.836H0v-36.836h25.348v-18.418h372.99v18.418H423.683z"></path></g></g></svg><span class="ml-2">Services</span><span class="text-xs ml-2 px-1.5 py-0.5 bg-gray-100 text-gray-500 rounded">Soon</span></div></div><div class="flex items-center space-x-1 ml-auto"><a href="https://skypilot.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-2 py-1 text-gray-600 hover:text-blue-600 transition-colors duration-150 cursor-pointer" title="Docs"><span class="mr-1">Docs</span><svg class="w-3.5 h-3.5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg></a><div class="border-l border-gray-200 h-6 mx-1"></div><a href="https://github.com/skypilot-org/skypilot" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="GitHub"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://slack.skypilot.co/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Slack"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path transform="scale(0.85) translate(1.8, 1.8)" d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z"></path></svg></a><a href="https://github.com/skypilot-org/skypilot/issues/new" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Leave Feedback"><svg class="w-5 h-5" stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g><path fill="none" d="M0 0h24v24H0z"></path><path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455zM4 18.385L5.763 17H20V5H4v13.385zM11 13h2v2h-2v-2zm0-6h2v5h-2V7z"></path></g></svg></a></div></div></div></div><div class="transition-all duration-200 ease-in-out min-h-screen" style="padding-top:56px"><main class="p-6"><div class="flex items-center justify-between mb-4 h-5"><div class="text-base"><a class="text-sky-blue hover:underline leading-none" href="/dashboard/jobs">Managed Jobs</a></div><div class="flex items-center space-x-2"><button class="inline-flex items-center justify-center whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent h-9 rounded-md px-3 text-sky-blue hover:text-sky-blue-bright" title="Refresh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-cw h-4 w-4 mr-1.5"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path></svg><span>Refresh</span></button></div></div><div class="relative"><div class="flex flex-col space-y-1 mb-1"><div class="flex flex-wrap items-center text-sm mb-1"><span class="mr-2 text-sm font-medium">Statuses:</span><div class="flex flex-wrap gap-2 items-center"></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm"><div class="relative w-full overflow-auto"><table class="w-full caption-bottom text-base"><thead class="[&amp;_tr]:border-b"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">ID</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Name</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">User</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Submitted</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Duration</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Status</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Resources</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Cluster</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Region</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Recoveries</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Details</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Logs</th></tr></thead><tbody class="[&amp;_tr:last-child]:border-0"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><td class="p-4 align-middle [&amp;:has([role=checkbox])]:pr-0 text-center py-6" colSpan="12"><div class="flex flex-col items-center space-y-4"><p class="text-gray-500">No active jobs</p></div></td></tr></tbody></table></div></div></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"MqmRhu1oPMgLy6v25hibm","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="preload" href="/dashboard/skypilot.svg" as="image" fetchpriority="high"/><meta name="next-head-count" content="3"/><link rel="preload" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/c6933bbb2ce7f4dd.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-830f59b8404e96b8.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js" defer=""></script><script src="/dashboard/_next/static/chunks/678-206dddca808e6d16.js" defer=""></script><script src="/dashboard/_next/static/chunks/312-c3c8845990db8ffc.js" defer=""></script><script src="/dashboard/_next/static/chunks/979-7bf73a4c7cea0f5c.js" defer=""></script><script src="/dashboard/_next/static/chunks/845-9e60713e0c441abc.js" defer=""></script><script src="/dashboard/_next/static/chunks/236-2db3ee3fba33dd9e.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="min-h-screen bg-gray-50"><div class="fixed top-0 left-0 right-0 z-50 shadow-sm"><div class="fixed top-0 left-0 right-0 bg-white z-30 h-14 px-4 border-b border-gray-200 shadow-sm"><div class="flex items-center h-full"><div class="flex items-center space-x-4 mr-6"><a class="flex items-center px-1 pt-1 h-full" href="/dashboard"><div class="h-20 w-20 flex items-center justify-center"><img alt="SkyPilot Logo" fetchpriority="high" width="80" height="80" decoding="async" data-nimg="1" class="w-full h-full object-contain" style="color:transparent" src="/dashboard/skypilot.svg"/></div></a></div><div class="flex items-center space-x-2 md:space-x-6 mr-6"><a class="inline-flex items-center border-b-2 border-transparent hover:text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/clusters"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg><span>Clusters</span></a><a class="inline-flex items-center border-b-2 border-transparent text-blue-600 px-1 pt-1 space-x-2" href="/dashboard/jobs"><svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"></path><rect width="20" height="14" x="2" y="6" rx="2"></rect></svg><span>Jobs</span></a><div class="inline-flex items-center px-1 pt-1 text-gray-400"><svg class="w-4 h-4" viewBox="0 0 423.683 423.683" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"><g><path d="M54.376,287.577h310.459c26.48,0,48.02-13.979,48.02-40.453c0-17.916-10.001-34.07-25.559-42.292 c-19.021-72.951-86.061-125.196-162.002-125.223v-3.431h-3.854V61.814h3.854v-9.569h-31.38v9.569h3.854v14.363h-3.854v3.431 c-75.941,0.026-142.97,52.272-161.988,125.217c-15.56,8.216-25.573,24.376-25.573,42.291 C6.36,273.597,27.896,287.577,54.376,287.577z M47.676,227.145l7.214-2.424l1.617-7.447 c13.884-64.232,71.707-110.862,137.467-110.862h31.274c65.763,0,123.582,46.63,137.473,110.862l1.607,7.447l7.223,2.424 c8.678,2.92,14.506,10.946,14.506,19.979c0,11.703-9.517,13.647-21.221,13.647H54.376c-11.7,0-21.22-1.944-21.22-13.647 C33.162,238.091,38.984,230.065,47.676,227.145z M423.683,334.602v36.836H0v-36.836h25.348v-18.418h372.99v18.418H423.683z"></path></g></g></svg><span class="ml-2">Services</span><span class="text-xs ml-2 px-1.5 py-0.5 bg-gray-100 text-gray-500 rounded">Soon</span></div></div><div class="flex items-center space-x-1 ml-auto"><a href="https://skypilot.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-2 py-1 text-gray-600 hover:text-blue-600 transition-colors duration-150 cursor-pointer" title="Docs"><span class="mr-1">Docs</span><svg class="w-3.5 h-3.5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg></a><div class="border-l border-gray-200 h-6 mx-1"></div><a href="https://github.com/skypilot-org/skypilot" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="GitHub"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg></a><a href="https://slack.skypilot.co/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Slack"><svg class="w-5 h-5" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path transform="scale(0.85) translate(1.8, 1.8)" d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z"></path></svg></a><a href="https://github.com/skypilot-org/skypilot/issues/new" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center p-2 rounded-full text-gray-600 hover:bg-gray-100 transition-colors duration-150 cursor-pointer" title="Leave Feedback"><svg class="w-5 h-5" stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g><path fill="none" d="M0 0h24v24H0z"></path><path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455zM4 18.385L5.763 17H20V5H4v13.385zM11 13h2v2h-2v-2zm0-6h2v5h-2V7z"></path></g></svg></a></div></div></div></div><div class="transition-all duration-200 ease-in-out min-h-screen" style="padding-top:56px"><main class="p-6"><div class="flex items-center justify-between mb-4 h-5"><div class="text-base"><a class="text-sky-blue hover:underline leading-none" href="/dashboard/jobs">Managed Jobs</a></div><div class="flex items-center space-x-2"><button class="inline-flex items-center justify-center whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent h-9 rounded-md px-3 text-sky-blue hover:text-sky-blue-bright" title="Refresh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rotate-cw h-4 w-4 mr-1.5"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path></svg><span>Refresh</span></button></div></div><div class="relative"><div class="flex flex-col space-y-1 mb-1"><div class="flex flex-wrap items-center text-sm mb-1"><span class="mr-2 text-sm font-medium">Statuses:</span><div class="flex flex-wrap gap-2 items-center"></div></div></div><div class="rounded-lg border bg-card text-card-foreground shadow-sm"><div class="relative w-full overflow-auto"><table class="w-full caption-bottom text-base"><thead class="[&amp;_tr]:border-b"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">ID</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Name</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">User</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Submitted</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Duration</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Status</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Resources</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Cluster</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Region</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0 sortable whitespace-nowrap">Recoveries</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Details</th><th class="h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&amp;:has([role=checkbox])]:pr-0">Logs</th></tr></thead><tbody class="[&amp;_tr:last-child]:border-0"><tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted"><td class="p-4 align-middle [&amp;:has([role=checkbox])]:pr-0 text-center py-6" colSpan="12"><div class="flex flex-col items-center space-y-4"><p class="text-gray-500">No active jobs</p></div></td></tr></tbody></table></div></div></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"hTtTTWqHyRidxVG24ujEi","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/data/storage.py CHANGED
@@ -38,8 +38,8 @@ from sky.utils import status_lib
38
38
  from sky.utils import ux_utils
39
39
 
40
40
  if typing.TYPE_CHECKING:
41
- import boto3 # type: ignore
42
41
  from google.cloud import storage # type: ignore
42
+ import mypy_boto3_s3
43
43
 
44
44
  logger = sky_logging.init_logger(__name__)
45
45
 
@@ -1363,7 +1363,7 @@ class S3Store(AbstractStore):
1363
1363
  is_sky_managed: Optional[bool] = None,
1364
1364
  sync_on_reconstruction: bool = True,
1365
1365
  _bucket_sub_path: Optional[str] = None):
1366
- self.client: 'boto3.client.Client'
1366
+ self.client: 'mypy_boto3_s3.Client'
1367
1367
  self.bucket: 'StorageHandle'
1368
1368
  # TODO(romilb): This is purely a stopgap fix for
1369
1369
  # https://github.com/skypilot-org/skypilot/issues/3405
@@ -3295,7 +3295,7 @@ class R2Store(AbstractStore):
3295
3295
  is_sky_managed: Optional[bool] = None,
3296
3296
  sync_on_reconstruction: Optional[bool] = True,
3297
3297
  _bucket_sub_path: Optional[str] = None):
3298
- self.client: 'boto3.client.Client'
3298
+ self.client: 'mypy_boto3_s3.Client'
3299
3299
  self.bucket: 'StorageHandle'
3300
3300
  super().__init__(name, source, region, is_sky_managed,
3301
3301
  sync_on_reconstruction, _bucket_sub_path)
@@ -4700,7 +4700,7 @@ class NebiusStore(AbstractStore):
4700
4700
  is_sky_managed: Optional[bool] = None,
4701
4701
  sync_on_reconstruction: bool = True,
4702
4702
  _bucket_sub_path: Optional[str] = None):
4703
- self.client: 'boto3.client.Client'
4703
+ self.client: 'mypy_boto3_s3.Client'
4704
4704
  self.bucket: 'StorageHandle'
4705
4705
  super().__init__(name, source, region, is_sky_managed,
4706
4706
  sync_on_reconstruction, _bucket_sub_path)
@@ -11,6 +11,7 @@ import copy
11
11
  import json
12
12
  import logging
13
13
  import time
14
+ import typing
14
15
  from typing import Any, Dict, List, Optional, Set, Tuple
15
16
 
16
17
  import colorama
@@ -23,6 +24,10 @@ from sky.provision.aws import utils
23
24
  from sky.utils import annotations
24
25
  from sky.utils import common_utils
25
26
 
27
+ if typing.TYPE_CHECKING:
28
+ import mypy_boto3_ec2
29
+ from mypy_boto3_ec2 import type_defs as ec2_type_defs
30
+
26
31
  logger = sky_logging.init_logger(__name__)
27
32
 
28
33
  RAY = 'ray-autoscaler'
@@ -223,7 +228,8 @@ def _configure_iam_role(iam) -> Dict[str, Any]:
223
228
 
224
229
 
225
230
  @annotations.lru_cache(scope='request', maxsize=128) # Keep bounded.
226
- def _get_route_tables(ec2, vpc_id: Optional[str], region: str,
231
+ def _get_route_tables(ec2: 'mypy_boto3_ec2.ServiceResource',
232
+ vpc_id: Optional[str], region: str,
227
233
  main: bool) -> List[Any]:
228
234
  """Get route tables associated with a VPC and region
229
235
 
@@ -248,7 +254,8 @@ def _get_route_tables(ec2, vpc_id: Optional[str], region: str,
248
254
  'RouteTables', [])
249
255
 
250
256
 
251
- def _is_subnet_public(ec2, subnet_id, vpc_id: Optional[str]) -> bool:
257
+ def _is_subnet_public(ec2: 'mypy_boto3_ec2.ServiceResource', subnet_id,
258
+ vpc_id: Optional[str]) -> bool:
252
259
  """Checks if a subnet is public by existence of a route to an IGW.
253
260
 
254
261
  Conventionally, public subnets connect to a IGW, and private subnets to a
@@ -441,10 +448,14 @@ def _usable_subnets(
441
448
  return subnets, first_subnet_vpc_id
442
449
 
443
450
 
444
- def _vpc_id_from_security_group_ids(ec2, sg_ids: List[str]) -> Any:
451
+ def _vpc_id_from_security_group_ids(ec2: 'mypy_boto3_ec2.ServiceResource',
452
+ sg_ids: List[str]) -> Any:
445
453
  # sort security group IDs to support deterministic unit test stubbing
446
454
  sg_ids = sorted(set(sg_ids))
447
- filters = [{'Name': 'group-id', 'Values': sg_ids}]
455
+ filters: List['ec2_type_defs.FilterTypeDef'] = [{
456
+ 'Name': 'group-id',
457
+ 'Values': sg_ids
458
+ }]
448
459
  security_groups = ec2.security_groups.filter(Filters=filters)
449
460
  vpc_ids = [sg.vpc_id for sg in security_groups]
450
461
  vpc_ids = list(set(vpc_ids))
@@ -462,7 +473,8 @@ def _vpc_id_from_security_group_ids(ec2, sg_ids: List[str]) -> Any:
462
473
  return vpc_ids[0]
463
474
 
464
475
 
465
- def _get_vpc_id_by_name(ec2, vpc_name: str, region: str) -> str:
476
+ def _get_vpc_id_by_name(ec2: 'mypy_boto3_ec2.ServiceResource', vpc_name: str,
477
+ region: str) -> str:
466
478
  """Returns the VPC ID of the unique VPC with a given name.
467
479
 
468
480
  Exits with code 1 if:
@@ -470,7 +482,10 @@ def _get_vpc_id_by_name(ec2, vpc_name: str, region: str) -> str:
470
482
  - More than 1 VPC with the given name are found in the current region.
471
483
  """
472
484
  # Look in the 'Name' tag (shown as Name column in console).
473
- filters = [{'Name': 'tag:Name', 'Values': [vpc_name]}]
485
+ filters: List['ec2_type_defs.FilterTypeDef'] = [{
486
+ 'Name': 'tag:Name',
487
+ 'Values': [vpc_name]
488
+ }]
474
489
  vpcs = list(ec2.vpcs.filter(Filters=filters))
475
490
  if not vpcs:
476
491
  _skypilot_log_error_and_exit_for_failover(
@@ -486,8 +501,9 @@ def _get_vpc_id_by_name(ec2, vpc_name: str, region: str) -> str:
486
501
  return vpcs[0].id
487
502
 
488
503
 
489
- def _get_subnet_and_vpc_id(ec2, security_group_ids: Optional[List[str]],
490
- region: str, availability_zone: Optional[str],
504
+ def _get_subnet_and_vpc_id(ec2: 'mypy_boto3_ec2.ServiceResource',
505
+ security_group_ids: Optional[List[str]], region: str,
506
+ availability_zone: Optional[str],
491
507
  use_internal_ips: bool,
492
508
  vpc_name: Optional[str]) -> Tuple[Any, str]:
493
509
  if vpc_name is not None:
@@ -514,7 +530,8 @@ def _get_subnet_and_vpc_id(ec2, security_group_ids: Optional[List[str]],
514
530
  return subnets, vpc_id
515
531
 
516
532
 
517
- def _configure_security_group(ec2, vpc_id: str, expected_sg_name: str,
533
+ def _configure_security_group(ec2: 'mypy_boto3_ec2.ServiceResource',
534
+ vpc_id: str, expected_sg_name: str,
518
535
  extended_ip_rules: List) -> List[str]:
519
536
  security_group = _get_or_create_vpc_security_group(ec2, vpc_id,
520
537
  expected_sg_name)
@@ -551,7 +568,8 @@ def _configure_security_group(ec2, vpc_id: str, expected_sg_name: str,
551
568
  return sg_ids
552
569
 
553
570
 
554
- def _get_or_create_vpc_security_group(ec2, vpc_id: str,
571
+ def _get_or_create_vpc_security_group(ec2: 'mypy_boto3_ec2.ServiceResource',
572
+ vpc_id: str,
555
573
  expected_sg_name: str) -> Any:
556
574
  """Find or create a security group in the specified VPC.
557
575
 
@@ -612,7 +630,8 @@ def _get_or_create_vpc_security_group(ec2, vpc_id: str,
612
630
  return security_group
613
631
 
614
632
 
615
- def _get_security_group_from_vpc_id(ec2, vpc_id: str,
633
+ def _get_security_group_from_vpc_id(ec2: 'mypy_boto3_ec2.ServiceResource',
634
+ vpc_id: str,
616
635
  group_name: str) -> Optional[Any]:
617
636
  """Get security group by VPC ID and group name."""
618
637
  existing_groups = list(
@@ -9,6 +9,7 @@ import logging
9
9
  from multiprocessing import pool
10
10
  import re
11
11
  import time
12
+ import typing
12
13
  from typing import Any, Callable, Dict, List, Optional, Set, TypeVar
13
14
 
14
15
  from sky import sky_logging
@@ -23,6 +24,11 @@ from sky.utils import resources_utils
23
24
  from sky.utils import status_lib
24
25
  from sky.utils import ux_utils
25
26
 
27
+ if typing.TYPE_CHECKING:
28
+ from botocore import waiter as botowaiter
29
+ import mypy_boto3_ec2
30
+ from mypy_boto3_ec2 import type_defs as ec2_type_defs
31
+
26
32
  logger = sky_logging.init_logger(__name__)
27
33
 
28
34
  _T = TypeVar('_T')
@@ -55,7 +61,9 @@ _RESUME_PER_INSTANCE_TIMEOUT = 120 # 2 minutes
55
61
  # https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer_within_the_same_AWS_Region
56
62
 
57
63
 
58
- def _default_ec2_resource(region: str, check_credentials: bool = True) -> Any:
64
+ def _default_ec2_resource(
65
+ region: str,
66
+ check_credentials: bool = True) -> 'mypy_boto3_ec2.ServiceResource':
59
67
  if not hasattr(aws, 'version'):
60
68
  # For backward compatibility, reload the module if the aws module was
61
69
  # imported before and stale. Used for, e.g., a live jobs controller
@@ -99,7 +107,8 @@ def _default_ec2_resource(region: str, check_credentials: bool = True) -> Any:
99
107
  check_credentials=check_credentials)
100
108
 
101
109
 
102
- def _cluster_name_filter(cluster_name_on_cloud: str) -> List[Dict[str, Any]]:
110
+ def _cluster_name_filter(
111
+ cluster_name_on_cloud: str) -> List['ec2_type_defs.FilterTypeDef']:
103
112
  return [{
104
113
  'Name': f'tag:{constants.TAG_RAY_CLUSTER_NAME}',
105
114
  'Values': [cluster_name_on_cloud],
@@ -282,7 +291,7 @@ def run_instances(region: str, cluster_name_on_cloud: str,
282
291
 
283
292
  # sort tags by key to support deterministic unit test stubbing
284
293
  tags = dict(sorted(copy.deepcopy(config.tags).items()))
285
- filters = [{
294
+ filters: List['ec2_type_defs.FilterTypeDef'] = [{
286
295
  'Name': 'instance-state-name',
287
296
  'Values': ['pending', 'running', 'stopping', 'stopped'],
288
297
  }, {
@@ -551,7 +560,8 @@ def run_instances(region: str, cluster_name_on_cloud: str,
551
560
  created_instance_ids=created_instance_ids)
552
561
 
553
562
 
554
- def _filter_instances(ec2, filters: List[Dict[str, Any]],
563
+ def _filter_instances(ec2: 'mypy_boto3_ec2.ServiceResource',
564
+ filters: List['ec2_type_defs.FilterTypeDef'],
555
565
  included_instances: Optional[List[str]],
556
566
  excluded_instances: Optional[List[str]]):
557
567
  instances = ec2.instances.filter(Filters=filters)
@@ -616,7 +626,7 @@ def stop_instances(
616
626
  assert provider_config is not None, (cluster_name_on_cloud, provider_config)
617
627
  region = provider_config['region']
618
628
  ec2 = _default_ec2_resource(region)
619
- filters: List[Dict[str, Any]] = [
629
+ filters: List['ec2_type_defs.FilterTypeDef'] = [
620
630
  {
621
631
  'Name': 'instance-state-name',
622
632
  'Values': ['pending', 'running'],
@@ -653,7 +663,7 @@ def terminate_instances(
653
663
  managed_by_skypilot = provider_config['security_group'].get(
654
664
  'ManagedBySkyPilot', True)
655
665
  ec2 = _default_ec2_resource(region)
656
- filters = [
666
+ filters: List['ec2_type_defs.FilterTypeDef'] = [
657
667
  {
658
668
  'Name': 'instance-state-name',
659
669
  # exclude 'shutting-down' or 'terminated' states
@@ -751,7 +761,7 @@ def open_ports(
751
761
  region = provider_config['region']
752
762
  ec2 = _default_ec2_resource(region)
753
763
  sg_name = provider_config['security_group']['GroupName']
754
- filters = [
764
+ filters: List['ec2_type_defs.FilterTypeDef'] = [
755
765
  {
756
766
  'Name': 'instance-state-name',
757
767
  # exclude 'shutting-down' or 'terminated' states
@@ -875,7 +885,7 @@ def wait_instances(region: str, cluster_name_on_cloud: str,
875
885
  ec2 = _default_ec2_resource(region)
876
886
  client = ec2.meta.client
877
887
 
878
- filters = [
888
+ filters: List['ec2_type_defs.FilterTypeDef'] = [
879
889
  {
880
890
  'Name': f'tag:{constants.TAG_RAY_CLUSTER_NAME}',
881
891
  'Values': [cluster_name_on_cloud],
@@ -904,6 +914,7 @@ def wait_instances(region: str, cluster_name_on_cloud: str,
904
914
  raise RuntimeError(
905
915
  f'No instances found for cluster {cluster_name_on_cloud}.')
906
916
 
917
+ waiter: 'botowaiter.Waiter'
907
918
  if state == status_lib.ClusterStatus.UP:
908
919
  waiter = client.get_waiter('instance_running')
909
920
  elif state == status_lib.ClusterStatus.STOPPED:
@@ -922,7 +933,7 @@ def get_cluster_info(
922
933
  provider_config: Optional[Dict[str, Any]] = None) -> common.ClusterInfo:
923
934
  """See sky/provision/__init__.py"""
924
935
  ec2 = _default_ec2_resource(region)
925
- filters = [
936
+ filters: List['ec2_type_defs.FilterTypeDef'] = [
926
937
  {
927
938
  'Name': 'instance-state-name',
928
939
  'Values': ['running'],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250424
3
+ Version: 1.0.0.dev20250425
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,4 +1,4 @@
1
- sky/__init__.py,sha256=d4SsJ8gs1CCFCs4JPveMwCm3edz36WuF6-b1GsvACBU,6428
1
+ sky/__init__.py,sha256=VrEo4Ets-aqVc_PrmYSDD--DzjMLu6fOMyuoAB105cg,6428
2
2
  sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
3
3
  sky/authentication.py,sha256=ND011K_-Ud1dVZF37A9KrwYir_ihJXcHc7iDWmuBc8Q,22872
4
4
  sky/check.py,sha256=PPNQnaaZBA9_aogJpN4gnG4XWnTqkd74c-rBYDkDRDY,16101
@@ -16,16 +16,16 @@ sky/sky_logging.py,sha256=Nmc29vvg-GgKRZcajNrGlkuCIFxrVqefdXTPiS7Y-9o,5914
16
16
  sky/skypilot_config.py,sha256=e1F6oShfQoEazEKZV-yqsBpQOHlLSW8fl0t3utOh8Ts,20379
17
17
  sky/task.py,sha256=j0198ihAObG1BbzUAI9OroduORe69919rKHGdC0kFyU,56996
18
18
  sky/adaptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- sky/adaptors/aws.py,sha256=6Qe_gvq8NZ4cHgD_5a6g3BSPsOd08wfww-QbLqyVd6A,7383
19
+ sky/adaptors/aws.py,sha256=4caUTO5nxZQyDVPyQdoPljaF-Lz_Fa6NEnu3FfmLZd4,8633
20
20
  sky/adaptors/azure.py,sha256=7l5jobSTsTUcTo3ptrgOpRgngHY92U64eQBPxvDe1HA,21986
21
21
  sky/adaptors/cloudflare.py,sha256=8XFjBKMusnR7EmteEGAsAAQUG4J0lDlqk7lkaum_5-4,8276
22
- sky/adaptors/common.py,sha256=o17TOFNLm1t0lQvZSJCF1C6RjD6ykKrQ-q1BLPX41XI,3027
22
+ sky/adaptors/common.py,sha256=-Qy2_QIGssDtRrakDX8pmnGkvDLtm3ejIsPtkMq8UT0,3058
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
26
  sky/adaptors/gcp.py,sha256=oEb9jClEtApw6PQnxdxDYxOCYsedvM3aiko1EW1FDVo,3501
27
27
  sky/adaptors/ibm.py,sha256=7YbHrWbYcZsJDgxMBNZr1yBI03mjs_C3pnCTCz-MNtQ,5068
28
- sky/adaptors/kubernetes.py,sha256=ICkKQEFv5LahZYwX8pliCke1m9xj1aHrDmnvyAZ1tYw,7080
28
+ sky/adaptors/kubernetes.py,sha256=FIPzhhiwpnpRqMlDHO2XGhBlHce_ZktRdg7xTYRTmmM,7473
29
29
  sky/adaptors/nebius.py,sha256=PMDuqJ3SWLUUqtUgYLpCHOBJ-xucqptGforknSZr-54,6546
30
30
  sky/adaptors/oci.py,sha256=xJt6J9xBSFIENa6FwEt1V1sZE8puAZ_vPEoGlyQACPs,2839
31
31
  sky/adaptors/runpod.py,sha256=4Nt_BfZhJAKQNA3wO8cxvvNI8x4NsDGHu_4EhRDlGYQ,225
@@ -47,13 +47,13 @@ sky/client/cli.py,sha256=fjiwc4joOwWTjrS-qifWFH3eiqj_0uaXTSngZpWrp94,229301
47
47
  sky/client/common.py,sha256=E_5cjxd8fWRB7fU1yfIbiyQf-IyVhpD5KkB7Fl3cQEI,15215
48
48
  sky/client/sdk.py,sha256=j7DlaRudq7PpIkXX0UVj5iJBS9l2LTJ68Vgnd5mMdrM,71163
49
49
  sky/clouds/__init__.py,sha256=OW6mJ-9hpJSBORCgt2LippLQEYZHNfnBW1mooRNNvxo,1416
50
- sky/clouds/aws.py,sha256=Y5azSWJSSWq32CD6jhP5xTFlk-vg3sE4dMWcm5AQiQQ,54638
50
+ sky/clouds/aws.py,sha256=knUiTLsdVTF5Gc7YONkuF58HjOlzqwsuJrD22Q1nIB4,54583
51
51
  sky/clouds/azure.py,sha256=Zpo6ftWz_B30mX7N-An7JVO-8v7aU3f9cw1iH9phvwE,32251
52
52
  sky/clouds/cloud.py,sha256=22sfoOyGYjsBj88RHp-eHHs6aqi0xDb8q_9o_v6SIFM,36690
53
53
  sky/clouds/cudo.py,sha256=_UkLEtwJsfDMKlmJfML5W3rA8VArba4x8YGIdnvgZoM,13226
54
54
  sky/clouds/do.py,sha256=-jVrq5qXxaOROT2R2U0XoYiMfLT0J1wGNodzjzcTUSI,11586
55
55
  sky/clouds/fluidstack.py,sha256=jIqW1MLe55MVME1PATZm8e6_FsiTnJawW7OdytPW0aM,12666
56
- sky/clouds/gcp.py,sha256=aDkVXRl2hjrYVp8S0BLkkbvRF4Fl996uAsv7yOkN9wQ,57108
56
+ sky/clouds/gcp.py,sha256=IDYae-KrwBnTJUvsmakbQz0pdmn8lEbLtFoMVg5MAaM,57315
57
57
  sky/clouds/ibm.py,sha256=XtuPN8QgrwJdb1qb_b-7KwAE2tf_N9wh9eEfi2tcg-s,22013
58
58
  sky/clouds/kubernetes.py,sha256=K2O44w3LsIb6SqJFYyDmWd7HpK4K-cGHgrZ2BacdJJE,36754
59
59
  sky/clouds/lambda_cloud.py,sha256=H32vd30OfjXriH9SibVATrJZfZcCBTiWAXHfliGeMZk,12804
@@ -86,7 +86,7 @@ sky/clouds/service_catalog/vast_catalog.py,sha256=3QfbFx7b2UIjrMbvjPyhuc7ppaKC3h
86
86
  sky/clouds/service_catalog/vsphere_catalog.py,sha256=OV3Czi3vwRSW4lqVPHxU_GND0ox322gmhv3kb11Q8AM,4412
87
87
  sky/clouds/service_catalog/data_fetchers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  sky/clouds/service_catalog/data_fetchers/analyze.py,sha256=VdksJQs3asFE8H5T3ZV1FJas2xD9WEX6c-V5p7y-wp4,2084
89
- sky/clouds/service_catalog/data_fetchers/fetch_aws.py,sha256=Zj4bqWPiDcT_ZFyHxQw_k7ORxWZrx91euar9kL0VPaI,23343
89
+ sky/clouds/service_catalog/data_fetchers/fetch_aws.py,sha256=OtMBQkfh6wIKGbaWt6cEDGdiDYsPKdNG5s4Wa9oz0xI,23413
90
90
  sky/clouds/service_catalog/data_fetchers/fetch_azure.py,sha256=7YVnoGDGGZI2TK02bj_LOoD4E5J5CFl6eqz2XlR4Vy8,12790
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
@@ -101,14 +101,12 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
101
101
  sky/clouds/utils/gcp_utils.py,sha256=YtuS4EoAMvcRnGPgE_WLENPOPWIdvhp7dLceTw_zfas,7114
102
102
  sky/clouds/utils/oci_utils.py,sha256=0YxhgZdeIHQUI1AZ86YuswsZg5HdVCIVfSTRJsSHYI0,6396
103
103
  sky/clouds/utils/scp_utils.py,sha256=MqawUhhFHHxVnn29nOI4gJ_nF665ich4Po7bsy1afsA,15948
104
- sky/dashboard/out/404.html,sha256=t158HWP5xLthv6RqkLF3YF75lYJhfBcRaCrD_uYnw84,2296
105
- sky/dashboard/out/clusters.html,sha256=4_DPmWy7meqHPuY-IsKdHAKlnFchGPhzz1iANWy8TLY,11739
104
+ sky/dashboard/out/404.html,sha256=mJSAqioj8wok9kxfY8AX8aWF1SAWns7pqrKSOpyRkds,2296
105
+ sky/dashboard/out/clusters.html,sha256=pTQFp7Q1AoXGLwP5yAjlPlzjal4hxrae9CLLSVY4gDs,11739
106
106
  sky/dashboard/out/favicon.ico,sha256=TOQ3bobTJzBo24JY6SBgVR3uoYxKd9XMtP9IL_bWS1k,42245
107
- sky/dashboard/out/index.html,sha256=NckjjI37X-6M2tEifoHwM-pPfMpw8gxaD-tmie3pGUA,1407
108
- sky/dashboard/out/jobs.html,sha256=baRqaSZW04b9-vHqo5nMNtNknAxf18b02mJuSU9jw5A,12829
107
+ sky/dashboard/out/index.html,sha256=0rYE6peTCESfpLS3rW5kjKblnRXt3asWtW9kRMWsw2g,1407
108
+ sky/dashboard/out/jobs.html,sha256=UXLiC0-mB5mWfD4O6fRAI2ZEWw-RjVFV1-3IPIktL7w,12829
109
109
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
110
- sky/dashboard/out/_next/static/MqmRhu1oPMgLy6v25hibm/_buildManifest.js,sha256=7uuHw3t0SwdYow3LY25GpA5209nWYOYSjxRWmQ5if60,1048
111
- sky/dashboard/out/_next/static/MqmRhu1oPMgLy6v25hibm/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
112
110
  sky/dashboard/out/_next/static/chunks/236-2db3ee3fba33dd9e.js,sha256=c6zARNqhT9VG1xQb_IXT_tuCvfGsglNIWWn93eCDkZo,24840
113
111
  sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js,sha256=H8yGnoxM_IYM2kU-A7mESi4aV4Ph3PxbIdnM2v5Kd3M,25150
114
112
  sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js,sha256=1w7y8HAPvOZ-KtEzw8mdTqqZvxUEMPJ8U-capQ-SH0c,8107
@@ -130,15 +128,17 @@ sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.
130
128
  sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-6ac338bc2239cb45.js,sha256=ciMtxEIartNtC_Y66ZBfZj0todScMGOZ4XchdgesEwo,8913
131
129
  sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-1c519e1afc523dc9.js,sha256=oMjs5t_YqMrm-nDMPyazBuKyCKocY-Hp1pgWQ4_ncDc,13420
132
130
  sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css,sha256=V9pn7LZ7uXLy3EQjFl-5MydGktBkn2yM4SWccJF9Sm0,31944
133
- sky/dashboard/out/clusters/[cluster].html,sha256=Aap1z2apJcRV8VUMVOko3wCWA3m4upi0bk13j1tdQRk,1984
134
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=P8lhi18cyPHxiB4oQQ2CFNDrX4Pafak8u0JGCGBKAg4,1653
135
- sky/dashboard/out/jobs/[job].html,sha256=VhZM8qzdDUzB_GNXNTm05wy0sMrbPBQak2J1AJ0XWc8,1621
131
+ sky/dashboard/out/_next/static/hTtTTWqHyRidxVG24ujEi/_buildManifest.js,sha256=7uuHw3t0SwdYow3LY25GpA5209nWYOYSjxRWmQ5if60,1048
132
+ sky/dashboard/out/_next/static/hTtTTWqHyRidxVG24ujEi/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
133
+ sky/dashboard/out/clusters/[cluster].html,sha256=NEpq3j_TbNa6A6X4jIMn-G13Uh6TnOARkg_7IeEzrgI,1984
134
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=pbRWYGD-4njCD-lDRXBuIKsnyhvNdDFLIVmb3biTDvA,1653
135
+ sky/dashboard/out/jobs/[job].html,sha256=QvZzBM-UA24qH7JRmG3wtkhptKRUCVtrRNq4T_lFXq8,1621
136
136
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
137
137
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
138
138
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
139
139
  sky/data/data_utils.py,sha256=CNYPM963qby5ddW0DZNbhiWXkqgB9MHh_jrC5DoBctM,33437
140
140
  sky/data/mounting_utils.py,sha256=6f1d0EeBj4dY-LQPwh8EtI6yoEHZawDgHaC8LChDS2s,21946
141
- sky/data/storage.py,sha256=0gZHw73py4fW-2iyyuQxa3E7bwqMg5-Dh3-aEKf2PuQ,236592
141
+ sky/data/storage.py,sha256=xumCpKDW-FELA0m0IXSrRpaAS2zV162NJWfy-ugCRjc,236587
142
142
  sky/data/storage_utils.py,sha256=u8PTKUkE7qYwr1GgAJ45pI5YUkhUaPQPRUz_CZZo_HI,13785
143
143
  sky/jobs/__init__.py,sha256=qoI53-xXE0-SOkrLWigvhgFXjk7dWE0OTqGPYIk-kmM,1458
144
144
  sky/jobs/constants.py,sha256=FLPAT02CmG7PLVPpYOUlbw1s_LgRdQiwdg2YBg8joFA,3305
@@ -165,8 +165,8 @@ sky/provision/logging.py,sha256=_sx_TH6nLt0FF3myS5pEZbiMhXyl4s1XwMidu_TTBUw,2091
165
165
  sky/provision/metadata_utils.py,sha256=LrxeV4wD2QPzNdXV_npj8q-pr35FatxBBjF_jSbpOT0,4013
166
166
  sky/provision/provisioner.py,sha256=xsdwfHxTmcHMAH-dyt0UsVHEgbweAlRImwVUQj7SZok,29953
167
167
  sky/provision/aws/__init__.py,sha256=mxq8PeWJqUtalDozTNpbtENErRZ1ktEs8uf2aG9UUgU,731
168
- sky/provision/aws/config.py,sha256=fGOkkn89EpVFYp4x0LTIauBem2Vsqcy8faEadS8l0nE,25979
169
- sky/provision/aws/instance.py,sha256=_fIwghcdVb5eKKSld8D81tZpc-PAaMm7pvkTPWgVqaA,40891
168
+ sky/provision/aws/config.py,sha256=2PifaPQpD-2Kxqd6843sCUIjEhJR3lI3cJRXE1ox_ls,26728
169
+ sky/provision/aws/instance.py,sha256=TObnNcylnAfPhgiA1prSD2sQKbUoUsBA986r9nKStTU,41434
170
170
  sky/provision/aws/utils.py,sha256=LrjeQ09zA7GoMv9Nt8TlL2A3VqqChsgJ9bL-Q5VLaao,3401
171
171
  sky/provision/azure/__init__.py,sha256=87cgk1_Ws7n9rqaDDPv-HpfrkVeSQMdFQnhnXwyx9g4,548
172
172
  sky/provision/azure/azure-config-template.json,sha256=jrjAgOtpe0e6FSg3vsVqHKQqJe0w-HeWOFT1HuwzS2c,4712
@@ -385,9 +385,9 @@ sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488
385
385
  sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=HPVgNt-wbCVPd9dpDFiA7t2mzQLpjXHJ61eiwRbEr-c,10378
386
386
  sky/utils/kubernetes/rsync_helper.sh,sha256=eaQOyvDq_RmcRHBqB9tH6LyDuYC310IVp97C5nqrTQg,1793
387
387
  sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
388
- skypilot_nightly-1.0.0.dev20250424.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
389
- skypilot_nightly-1.0.0.dev20250424.dist-info/METADATA,sha256=-0THW8I1d5Y7aEV7he2IPAcVf_PmOSEbgG7dqdsJOiQ,18691
390
- skypilot_nightly-1.0.0.dev20250424.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
391
- skypilot_nightly-1.0.0.dev20250424.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
392
- skypilot_nightly-1.0.0.dev20250424.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
393
- skypilot_nightly-1.0.0.dev20250424.dist-info/RECORD,,
388
+ skypilot_nightly-1.0.0.dev20250425.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
389
+ skypilot_nightly-1.0.0.dev20250425.dist-info/METADATA,sha256=G9KA9aIoCuWd3DGn5Rg-4IeFD1U48KITV5u8pYN-f_I,18691
390
+ skypilot_nightly-1.0.0.dev20250425.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
391
+ skypilot_nightly-1.0.0.dev20250425.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
392
+ skypilot_nightly-1.0.0.dev20250425.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
393
+ skypilot_nightly-1.0.0.dev20250425.dist-info/RECORD,,