skypilot-nightly 1.0.0.dev20251019__py3-none-any.whl → 1.0.0.dev20251021__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.
Potentially problematic release.
This version of skypilot-nightly might be problematic. Click here for more details.
- sky/__init__.py +2 -2
- sky/adaptors/kubernetes.py +61 -0
- sky/backends/backend_utils.py +11 -11
- sky/backends/cloud_vm_ray_backend.py +15 -4
- sky/client/cli/command.py +39 -10
- sky/client/cli/flags.py +4 -2
- sky/client/sdk.py +26 -3
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-3c431f6c9086e487.js → webpack-66f23594d38c7f16.js} +1 -1
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/data/storage.py +2 -2
- sky/global_user_state.py +20 -20
- sky/jobs/server/server.py +10 -1
- sky/provision/kubernetes/network.py +9 -6
- sky/provision/provisioner.py +8 -0
- sky/serve/server/server.py +1 -0
- sky/server/common.py +9 -2
- sky/server/constants.py +1 -1
- sky/server/daemons.py +4 -2
- sky/server/requests/executor.py +10 -8
- sky/server/requests/payloads.py +2 -1
- sky/server/requests/preconditions.py +9 -4
- sky/server/requests/requests.py +118 -34
- sky/server/server.py +57 -24
- sky/server/stream_utils.py +127 -38
- sky/server/uvicorn.py +18 -17
- sky/utils/asyncio_utils.py +63 -3
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/METADATA +35 -36
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/RECORD +49 -49
- /sky/dashboard/out/_next/static/{8e35zdobdd0bK_Nkba03m → jDc1PlRsl9Cc5FQUMLBu8}/_buildManifest.js +0 -0
- /sky/dashboard/out/_next/static/{8e35zdobdd0bK_Nkba03m → jDc1PlRsl9Cc5FQUMLBu8}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20251019.dist-info → skypilot_nightly-1.0.0.dev20251021.dist-info}/top_level.txt +0 -0
sky/__init__.py
CHANGED
|
@@ -7,7 +7,7 @@ import urllib.request
|
|
|
7
7
|
from sky.utils import directory_utils
|
|
8
8
|
|
|
9
9
|
# Replaced with the current commit when building the wheels.
|
|
10
|
-
_SKYPILOT_COMMIT_SHA = '
|
|
10
|
+
_SKYPILOT_COMMIT_SHA = 'a39d748f667e752cd30584e4523d5e2b6dd836a0'
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def _get_git_commit():
|
|
@@ -37,7 +37,7 @@ def _get_git_commit():
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
__commit__ = _get_git_commit()
|
|
40
|
-
__version__ = '1.0.0.
|
|
40
|
+
__version__ = '1.0.0.dev20251021'
|
|
41
41
|
__root_dir__ = directory_utils.get_sky_dir()
|
|
42
42
|
|
|
43
43
|
|
sky/adaptors/kubernetes.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Kubernetes adaptors"""
|
|
2
|
+
import functools
|
|
2
3
|
import logging
|
|
3
4
|
import os
|
|
4
5
|
import platform
|
|
@@ -162,8 +163,58 @@ def list_kube_config_contexts():
|
|
|
162
163
|
return kubernetes.config.list_kube_config_contexts(_get_config_file())
|
|
163
164
|
|
|
164
165
|
|
|
166
|
+
class ClientWrapper:
|
|
167
|
+
"""Wrapper around the kubernetes API clients.
|
|
168
|
+
|
|
169
|
+
This is needed because we cache kubernetes.client.ApiClient and other typed
|
|
170
|
+
clients (e.g. kubernetes.client.CoreV1Api) and lru_cache.cache_clear() does
|
|
171
|
+
not call close() on the client to cleanup external resources like
|
|
172
|
+
semaphores. This decorator wraps the client with __del__ to ensure the
|
|
173
|
+
external state of kubernetes clients are properly cleaned up on GC.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
def __init__(self, client):
|
|
177
|
+
self._client = client
|
|
178
|
+
|
|
179
|
+
def __getattr__(self, name):
|
|
180
|
+
"""Delegate to the underlying client"""
|
|
181
|
+
return getattr(self._client, name)
|
|
182
|
+
|
|
183
|
+
def __del__(self):
|
|
184
|
+
"""Clean up the underlying client"""
|
|
185
|
+
try:
|
|
186
|
+
real_client = None
|
|
187
|
+
if isinstance(self._client, kubernetes.client.ApiClient):
|
|
188
|
+
real_client = self._client
|
|
189
|
+
elif isinstance(self._client, kubernetes.watch.Watch):
|
|
190
|
+
real_client = getattr(self._client, '_api_client', None)
|
|
191
|
+
else:
|
|
192
|
+
# Otherwise, the client is a typed client, the typed client
|
|
193
|
+
# is generated by codegen and all of them should have an
|
|
194
|
+
# 'api_client' attribute referring to the real client.
|
|
195
|
+
real_client = getattr(self._client, 'api_client', None)
|
|
196
|
+
if real_client is not None:
|
|
197
|
+
real_client.close()
|
|
198
|
+
else:
|
|
199
|
+
logger.debug(f'No client found for {self._client}')
|
|
200
|
+
except Exception as e: # pylint: disable=broad-except
|
|
201
|
+
logger.debug(f'Error closing Kubernetes client: {e}')
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def wrap_kubernetes_client(func):
|
|
205
|
+
"""Wraps kubernetes API clients for proper cleanup."""
|
|
206
|
+
|
|
207
|
+
@functools.wraps(func)
|
|
208
|
+
def wrapper(*args, **kwargs):
|
|
209
|
+
obj = func(*args, **kwargs)
|
|
210
|
+
return ClientWrapper(obj)
|
|
211
|
+
|
|
212
|
+
return wrapper
|
|
213
|
+
|
|
214
|
+
|
|
165
215
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
166
216
|
@annotations.lru_cache(scope='request')
|
|
217
|
+
@wrap_kubernetes_client
|
|
167
218
|
def core_api(context: Optional[str] = None):
|
|
168
219
|
_load_config(context)
|
|
169
220
|
return kubernetes.client.CoreV1Api()
|
|
@@ -171,6 +222,7 @@ def core_api(context: Optional[str] = None):
|
|
|
171
222
|
|
|
172
223
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
173
224
|
@annotations.lru_cache(scope='request')
|
|
225
|
+
@wrap_kubernetes_client
|
|
174
226
|
def storage_api(context: Optional[str] = None):
|
|
175
227
|
_load_config(context)
|
|
176
228
|
return kubernetes.client.StorageV1Api()
|
|
@@ -178,6 +230,7 @@ def storage_api(context: Optional[str] = None):
|
|
|
178
230
|
|
|
179
231
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
180
232
|
@annotations.lru_cache(scope='request')
|
|
233
|
+
@wrap_kubernetes_client
|
|
181
234
|
def auth_api(context: Optional[str] = None):
|
|
182
235
|
_load_config(context)
|
|
183
236
|
return kubernetes.client.RbacAuthorizationV1Api()
|
|
@@ -185,6 +238,7 @@ def auth_api(context: Optional[str] = None):
|
|
|
185
238
|
|
|
186
239
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
187
240
|
@annotations.lru_cache(scope='request')
|
|
241
|
+
@wrap_kubernetes_client
|
|
188
242
|
def networking_api(context: Optional[str] = None):
|
|
189
243
|
_load_config(context)
|
|
190
244
|
return kubernetes.client.NetworkingV1Api()
|
|
@@ -192,6 +246,7 @@ def networking_api(context: Optional[str] = None):
|
|
|
192
246
|
|
|
193
247
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
194
248
|
@annotations.lru_cache(scope='request')
|
|
249
|
+
@wrap_kubernetes_client
|
|
195
250
|
def custom_objects_api(context: Optional[str] = None):
|
|
196
251
|
_load_config(context)
|
|
197
252
|
return kubernetes.client.CustomObjectsApi()
|
|
@@ -199,6 +254,7 @@ def custom_objects_api(context: Optional[str] = None):
|
|
|
199
254
|
|
|
200
255
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
201
256
|
@annotations.lru_cache(scope='global')
|
|
257
|
+
@wrap_kubernetes_client
|
|
202
258
|
def node_api(context: Optional[str] = None):
|
|
203
259
|
_load_config(context)
|
|
204
260
|
return kubernetes.client.NodeV1Api()
|
|
@@ -206,6 +262,7 @@ def node_api(context: Optional[str] = None):
|
|
|
206
262
|
|
|
207
263
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
208
264
|
@annotations.lru_cache(scope='request')
|
|
265
|
+
@wrap_kubernetes_client
|
|
209
266
|
def apps_api(context: Optional[str] = None):
|
|
210
267
|
_load_config(context)
|
|
211
268
|
return kubernetes.client.AppsV1Api()
|
|
@@ -213,6 +270,7 @@ def apps_api(context: Optional[str] = None):
|
|
|
213
270
|
|
|
214
271
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
215
272
|
@annotations.lru_cache(scope='request')
|
|
273
|
+
@wrap_kubernetes_client
|
|
216
274
|
def batch_api(context: Optional[str] = None):
|
|
217
275
|
_load_config(context)
|
|
218
276
|
return kubernetes.client.BatchV1Api()
|
|
@@ -220,6 +278,7 @@ def batch_api(context: Optional[str] = None):
|
|
|
220
278
|
|
|
221
279
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
222
280
|
@annotations.lru_cache(scope='request')
|
|
281
|
+
@wrap_kubernetes_client
|
|
223
282
|
def api_client(context: Optional[str] = None):
|
|
224
283
|
_load_config(context)
|
|
225
284
|
return kubernetes.client.ApiClient()
|
|
@@ -227,6 +286,7 @@ def api_client(context: Optional[str] = None):
|
|
|
227
286
|
|
|
228
287
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
229
288
|
@annotations.lru_cache(scope='request')
|
|
289
|
+
@wrap_kubernetes_client
|
|
230
290
|
def custom_resources_api(context: Optional[str] = None):
|
|
231
291
|
_load_config(context)
|
|
232
292
|
return kubernetes.client.CustomObjectsApi()
|
|
@@ -234,6 +294,7 @@ def custom_resources_api(context: Optional[str] = None):
|
|
|
234
294
|
|
|
235
295
|
@_api_logging_decorator('urllib3', logging.ERROR)
|
|
236
296
|
@annotations.lru_cache(scope='request')
|
|
297
|
+
@wrap_kubernetes_client
|
|
237
298
|
def watch(context: Optional[str] = None):
|
|
238
299
|
_load_config(context)
|
|
239
300
|
return kubernetes.watch.Watch()
|
sky/backends/backend_utils.py
CHANGED
|
@@ -3128,12 +3128,12 @@ def refresh_cluster_records() -> None:
|
|
|
3128
3128
|
# request info in backend_utils.py.
|
|
3129
3129
|
# Refactor this to use some other info to
|
|
3130
3130
|
# determine if a launch is in progress.
|
|
3131
|
-
requests = requests_lib.get_request_tasks(
|
|
3132
|
-
req_filter=requests_lib.RequestTaskFilter(
|
|
3133
|
-
status=[requests_lib.RequestStatus.RUNNING],
|
|
3134
|
-
include_request_names=['sky.launch']))
|
|
3135
3131
|
cluster_names_with_launch_request = {
|
|
3136
|
-
request.cluster_name for request in
|
|
3132
|
+
request.cluster_name for request in requests_lib.get_request_tasks(
|
|
3133
|
+
req_filter=requests_lib.RequestTaskFilter(
|
|
3134
|
+
status=[requests_lib.RequestStatus.RUNNING],
|
|
3135
|
+
include_request_names=['sky.launch'],
|
|
3136
|
+
fields=['cluster_name']))
|
|
3137
3137
|
}
|
|
3138
3138
|
cluster_names_without_launch_request = (cluster_names -
|
|
3139
3139
|
cluster_names_with_launch_request)
|
|
@@ -3356,13 +3356,13 @@ def get_clusters(
|
|
|
3356
3356
|
# request info in backend_utils.py.
|
|
3357
3357
|
# Refactor this to use some other info to
|
|
3358
3358
|
# determine if a launch is in progress.
|
|
3359
|
-
requests = requests_lib.get_request_tasks(
|
|
3360
|
-
req_filter=requests_lib.RequestTaskFilter(
|
|
3361
|
-
status=[requests_lib.RequestStatus.RUNNING],
|
|
3362
|
-
include_request_names=['sky.launch'],
|
|
3363
|
-
cluster_names=cluster_names))
|
|
3364
3359
|
cluster_names_with_launch_request = {
|
|
3365
|
-
request.cluster_name for request in
|
|
3360
|
+
request.cluster_name for request in requests_lib.get_request_tasks(
|
|
3361
|
+
req_filter=requests_lib.RequestTaskFilter(
|
|
3362
|
+
status=[requests_lib.RequestStatus.RUNNING],
|
|
3363
|
+
include_request_names=['sky.launch'],
|
|
3364
|
+
cluster_names=cluster_names,
|
|
3365
|
+
fields=['cluster_name']))
|
|
3366
3366
|
}
|
|
3367
3367
|
# Preserve the index of the cluster name as it appears on "records"
|
|
3368
3368
|
cluster_names_without_launch_request = [
|
|
@@ -2471,6 +2471,9 @@ class CloudVmRayResourceHandle(backends.backend.ResourceHandle):
|
|
|
2471
2471
|
def get_cluster_name(self):
|
|
2472
2472
|
return self.cluster_name
|
|
2473
2473
|
|
|
2474
|
+
def get_cluster_name_on_cloud(self):
|
|
2475
|
+
return self.cluster_name_on_cloud
|
|
2476
|
+
|
|
2474
2477
|
def _use_internal_ips(self):
|
|
2475
2478
|
"""Returns whether to use internal IPs for SSH connections."""
|
|
2476
2479
|
# Directly load the `use_internal_ips` flag from the cluster yaml
|
|
@@ -2954,6 +2957,12 @@ class CloudVmRayResourceHandle(backends.backend.ResourceHandle):
|
|
|
2954
2957
|
def cluster_yaml(self, value: Optional[str]):
|
|
2955
2958
|
self._cluster_yaml = value
|
|
2956
2959
|
|
|
2960
|
+
@property
|
|
2961
|
+
def instance_ids(self):
|
|
2962
|
+
if self.cached_cluster_info is not None:
|
|
2963
|
+
return self.cached_cluster_info.instance_ids()
|
|
2964
|
+
return None
|
|
2965
|
+
|
|
2957
2966
|
@property
|
|
2958
2967
|
def ssh_user(self):
|
|
2959
2968
|
if self.cached_cluster_info is not None:
|
|
@@ -3623,9 +3632,10 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
|
3623
3632
|
gap_seconds = _RETRY_UNTIL_UP_INIT_GAP_SECONDS
|
|
3624
3633
|
retry_message = ux_utils.retry_message(
|
|
3625
3634
|
f'Retry after {gap_seconds:.0f}s ')
|
|
3626
|
-
hint_message = (
|
|
3627
|
-
|
|
3628
|
-
|
|
3635
|
+
hint_message = (
|
|
3636
|
+
f'\n{retry_message} '
|
|
3637
|
+
f'{ux_utils.provision_hint(cluster_name)}'
|
|
3638
|
+
f'{colorama.Style.RESET_ALL}')
|
|
3629
3639
|
|
|
3630
3640
|
# Add cluster event for retry.
|
|
3631
3641
|
global_user_state.add_cluster_event(
|
|
@@ -3654,7 +3664,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
|
3654
3664
|
logger.error(
|
|
3655
3665
|
ux_utils.error_message(
|
|
3656
3666
|
'Failed to provision resources. '
|
|
3657
|
-
f'{ux_utils.
|
|
3667
|
+
f'{ux_utils.provision_hint(cluster_name)}'))
|
|
3658
3668
|
error_message += (
|
|
3659
3669
|
'\nTo keep retrying until the cluster is up, use '
|
|
3660
3670
|
'the `--retry-until-up` flag.')
|
|
@@ -3713,6 +3723,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
|
3713
3723
|
# manually or by the cloud provider.
|
|
3714
3724
|
# Optimize the case where the cluster's IPs can be retrieved
|
|
3715
3725
|
# from cluster_info.
|
|
3726
|
+
handle.cached_cluster_info = cluster_info
|
|
3716
3727
|
handle.docker_user = cluster_info.docker_user
|
|
3717
3728
|
handle.update_cluster_ips(max_attempts=_FETCH_IP_MAX_ATTEMPTS,
|
|
3718
3729
|
cluster_info=cluster_info)
|
sky/client/cli/command.py
CHANGED
|
@@ -2150,6 +2150,12 @@ def queue(clusters: List[str], skip_finished: bool, all_users: bool):
|
|
|
2150
2150
|
is_flag=True,
|
|
2151
2151
|
default=False,
|
|
2152
2152
|
help='Stream the cluster provisioning logs (provision.log).')
|
|
2153
|
+
@click.option('--worker',
|
|
2154
|
+
'-w',
|
|
2155
|
+
default=None,
|
|
2156
|
+
type=int,
|
|
2157
|
+
help='The worker ID to stream the logs from. '
|
|
2158
|
+
'If not set, stream the logs of the head node.')
|
|
2153
2159
|
@click.option(
|
|
2154
2160
|
'--sync-down',
|
|
2155
2161
|
'-s',
|
|
@@ -2187,6 +2193,7 @@ def logs(
|
|
|
2187
2193
|
cluster: str,
|
|
2188
2194
|
job_ids: Tuple[str, ...],
|
|
2189
2195
|
provision: bool,
|
|
2196
|
+
worker: Optional[int],
|
|
2190
2197
|
sync_down: bool,
|
|
2191
2198
|
status: bool, # pylint: disable=redefined-outer-name
|
|
2192
2199
|
follow: bool,
|
|
@@ -2216,6 +2223,13 @@ def logs(
|
|
|
2216
2223
|
4. If the job fails or fetching the logs fails, the command will exit with
|
|
2217
2224
|
a non-zero return code.
|
|
2218
2225
|
"""
|
|
2226
|
+
if worker is not None:
|
|
2227
|
+
if not provision:
|
|
2228
|
+
raise click.UsageError(
|
|
2229
|
+
'--worker can only be used with --provision.')
|
|
2230
|
+
if worker < 1:
|
|
2231
|
+
raise click.UsageError('--worker must be a positive integer.')
|
|
2232
|
+
|
|
2219
2233
|
if provision and (sync_down or status or job_ids):
|
|
2220
2234
|
raise click.UsageError(
|
|
2221
2235
|
'--provision cannot be combined with job log options '
|
|
@@ -2235,7 +2249,11 @@ def logs(
|
|
|
2235
2249
|
|
|
2236
2250
|
if provision:
|
|
2237
2251
|
# Stream provision logs
|
|
2238
|
-
sys.exit(
|
|
2252
|
+
sys.exit(
|
|
2253
|
+
sdk.tail_provision_logs(cluster_name=cluster,
|
|
2254
|
+
worker=worker,
|
|
2255
|
+
follow=follow,
|
|
2256
|
+
tail=tail))
|
|
2239
2257
|
|
|
2240
2258
|
if sync_down:
|
|
2241
2259
|
with rich_utils.client_status(
|
|
@@ -3251,9 +3269,11 @@ def _down_or_stop_clusters(
|
|
|
3251
3269
|
request_id = sdk.autostop(name, idle_minutes_to_autostop,
|
|
3252
3270
|
wait_for, down)
|
|
3253
3271
|
request_ids.append(request_id)
|
|
3272
|
+
progress.stop()
|
|
3254
3273
|
_async_call_or_wait(
|
|
3255
3274
|
request_id, async_call,
|
|
3256
3275
|
server_constants.REQUEST_NAME_PREFIX + operation)
|
|
3276
|
+
progress.start()
|
|
3257
3277
|
except (exceptions.NotSupportedError, exceptions.ClusterNotUpError,
|
|
3258
3278
|
exceptions.CloudError) as e:
|
|
3259
3279
|
message = str(e)
|
|
@@ -3281,9 +3301,11 @@ def _down_or_stop_clusters(
|
|
|
3281
3301
|
else:
|
|
3282
3302
|
request_id = sdk.stop(name, purge=purge)
|
|
3283
3303
|
request_ids.append(request_id)
|
|
3304
|
+
progress.stop()
|
|
3284
3305
|
_async_call_or_wait(
|
|
3285
3306
|
request_id, async_call,
|
|
3286
3307
|
server_constants.REQUEST_NAME_PREFIX + operation)
|
|
3308
|
+
progress.start()
|
|
3287
3309
|
if not async_call:
|
|
3288
3310
|
# Remove the cluster from the SSH config file as soon as it
|
|
3289
3311
|
# is stopped or downed.
|
|
@@ -3317,6 +3339,10 @@ def _down_or_stop_clusters(
|
|
|
3317
3339
|
progress.start()
|
|
3318
3340
|
|
|
3319
3341
|
with progress:
|
|
3342
|
+
# we write a new line here to avoid the "Waiting for 'sky.down'
|
|
3343
|
+
# request to be scheduled" message from being printed on the same line
|
|
3344
|
+
# as the "Terminating <num> clusters..." message
|
|
3345
|
+
click.echo('')
|
|
3320
3346
|
subprocess_utils.run_in_parallel(_down_or_stop, clusters)
|
|
3321
3347
|
progress.live.transient = False
|
|
3322
3348
|
# Make sure the progress bar not mess up the terminal.
|
|
@@ -6169,19 +6195,22 @@ def api_logs(request_id: Optional[str], server_logs: bool,
|
|
|
6169
6195
|
**_get_shell_complete_args(_complete_api_request))
|
|
6170
6196
|
@flags.all_option('Cancel all your requests.')
|
|
6171
6197
|
@flags.all_users_option('Cancel all requests from all users.')
|
|
6198
|
+
@flags.yes_option()
|
|
6172
6199
|
@usage_lib.entrypoint
|
|
6173
6200
|
# pylint: disable=redefined-builtin
|
|
6174
|
-
def api_cancel(request_ids: Optional[List[str]], all: bool, all_users: bool
|
|
6201
|
+
def api_cancel(request_ids: Optional[List[str]], all: bool, all_users: bool,
|
|
6202
|
+
yes: bool):
|
|
6175
6203
|
"""Cancel a request running on SkyPilot API server."""
|
|
6176
6204
|
if all or all_users:
|
|
6177
|
-
|
|
6178
|
-
|
|
6179
|
-
|
|
6180
|
-
|
|
6181
|
-
|
|
6182
|
-
|
|
6183
|
-
|
|
6184
|
-
|
|
6205
|
+
if not yes:
|
|
6206
|
+
keyword = 'ALL USERS\'' if all_users else 'YOUR'
|
|
6207
|
+
user_input = click.prompt(
|
|
6208
|
+
f'This will cancel all {keyword} requests.\n'
|
|
6209
|
+
f'To proceed, please type {colorama.Style.BRIGHT}'
|
|
6210
|
+
f'\'cancel all requests\'{colorama.Style.RESET_ALL}',
|
|
6211
|
+
type=str)
|
|
6212
|
+
if user_input != 'cancel all requests':
|
|
6213
|
+
raise click.Abort()
|
|
6185
6214
|
request_ids = None
|
|
6186
6215
|
cancelled_request_ids = sdk.get(
|
|
6187
6216
|
sdk.api_cancel(request_ids=request_ids, all_users=all_users))
|
sky/client/cli/flags.py
CHANGED
|
@@ -284,8 +284,10 @@ def config_option(expose_value: bool):
|
|
|
284
284
|
return return_option_decorator
|
|
285
285
|
|
|
286
286
|
|
|
287
|
-
def yes_option():
|
|
287
|
+
def yes_option(helptext: Optional[str] = None):
|
|
288
288
|
"""A decorator for the --yes/-y option."""
|
|
289
|
+
if helptext is None:
|
|
290
|
+
helptext = 'Skip confirmation prompt.'
|
|
289
291
|
|
|
290
292
|
def return_option_decorator(func):
|
|
291
293
|
return click.option('--yes',
|
|
@@ -293,7 +295,7 @@ def yes_option():
|
|
|
293
295
|
is_flag=True,
|
|
294
296
|
default=False,
|
|
295
297
|
required=False,
|
|
296
|
-
help=
|
|
298
|
+
help=helptext)(func)
|
|
297
299
|
|
|
298
300
|
return return_option_decorator
|
|
299
301
|
|
sky/client/sdk.py
CHANGED
|
@@ -925,6 +925,7 @@ def tail_logs(
|
|
|
925
925
|
@annotations.client_api
|
|
926
926
|
@rest.retry_transient_errors()
|
|
927
927
|
def tail_provision_logs(cluster_name: str,
|
|
928
|
+
worker: Optional[int] = None,
|
|
928
929
|
follow: bool = True,
|
|
929
930
|
tail: int = 0,
|
|
930
931
|
output_stream: Optional['io.TextIOBase'] = None) -> int:
|
|
@@ -932,17 +933,31 @@ def tail_provision_logs(cluster_name: str,
|
|
|
932
933
|
|
|
933
934
|
Args:
|
|
934
935
|
cluster_name: name of the cluster.
|
|
936
|
+
worker: worker id in multi-node cluster.
|
|
937
|
+
If None, stream the logs of the head node.
|
|
935
938
|
follow: follow the logs.
|
|
936
939
|
tail: lines from end to tail.
|
|
937
940
|
output_stream: optional stream to write logs.
|
|
938
941
|
Returns:
|
|
939
942
|
Exit code 0 on streaming success; raises on HTTP error.
|
|
940
943
|
"""
|
|
941
|
-
body = payloads.
|
|
944
|
+
body = payloads.ProvisionLogsBody(cluster_name=cluster_name)
|
|
945
|
+
|
|
946
|
+
if worker is not None:
|
|
947
|
+
remote_api_version = versions.get_remote_api_version()
|
|
948
|
+
if remote_api_version is not None and remote_api_version >= 21:
|
|
949
|
+
if worker < 1:
|
|
950
|
+
raise ValueError('Worker must be a positive integer.')
|
|
951
|
+
body.worker = worker
|
|
952
|
+
else:
|
|
953
|
+
raise exceptions.APINotSupportedError(
|
|
954
|
+
'Worker node provision logs are not supported in your API '
|
|
955
|
+
'server. Please upgrade to a newer API server to use it.')
|
|
942
956
|
params = {
|
|
943
957
|
'follow': str(follow).lower(),
|
|
944
958
|
'tail': tail,
|
|
945
959
|
}
|
|
960
|
+
|
|
946
961
|
response = server_common.make_authenticated_request(
|
|
947
962
|
'POST',
|
|
948
963
|
'/provision_logs',
|
|
@@ -951,13 +966,21 @@ def tail_provision_logs(cluster_name: str,
|
|
|
951
966
|
stream=True,
|
|
952
967
|
timeout=(client_common.API_SERVER_REQUEST_CONNECTION_TIMEOUT_SECONDS,
|
|
953
968
|
None))
|
|
969
|
+
# Check for HTTP errors before streaming the response
|
|
970
|
+
if response.status_code != 200:
|
|
971
|
+
with ux_utils.print_exception_no_traceback():
|
|
972
|
+
raise exceptions.CommandError(response.status_code,
|
|
973
|
+
'tail_provision_logs',
|
|
974
|
+
'Failed to stream provision logs',
|
|
975
|
+
response.text)
|
|
976
|
+
|
|
954
977
|
# Log request is idempotent when tail is 0, thus can resume previous
|
|
955
978
|
# streaming point on retry.
|
|
956
979
|
# request_id=None here because /provision_logs does not create an async
|
|
957
980
|
# request. Instead, it streams a plain file from the server. This does NOT
|
|
958
981
|
# violate the stream_response doc warning about None in multi-user
|
|
959
|
-
# environments: we are not asking stream_response to select
|
|
960
|
-
# request
|
|
982
|
+
# environments: we are not asking stream_response to select "the latest
|
|
983
|
+
# request". We already have the HTTP response to stream; request_id=None
|
|
961
984
|
# merely disables the follow-up GET. It is also necessary for --no-follow
|
|
962
985
|
# to return cleanly after printing the tailed lines. If we provided a
|
|
963
986
|
# non-None request_id here, the get(request_id) in stream_response(
|
sky/dashboard/out/404.html
CHANGED
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/_next/static/chunks/{webpack-3c431f6c9086e487.js → webpack-66f23594d38c7f16.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(){"use strict";var t,e,n,r,c,o,u,i,f,a={},s={};function d(t){var e=s[t];if(void 0!==e)return e.exports;var n=s[t]={exports:{}},r=!0;try{a[t](n,n.exports,d),r=!1}finally{r&&delete s[t]}return n.exports}d.m=a,t=[],d.O=function(e,n,r,c){if(n){c=c||0;for(var o=t.length;o>0&&t[o-1][2]>c;o--)t[o]=t[o-1];t[o]=[n,r,c];return}for(var u=1/0,o=0;o<t.length;o++){for(var n=t[o][0],r=t[o][1],c=t[o][2],i=!0,f=0;f<n.length;f++)u>=c&&Object.keys(d.O).every(function(t){return d.O[t](n[f])})?n.splice(f--,1):(i=!1,c<u&&(u=c));if(i){t.splice(o--,1);var a=r();void 0!==a&&(e=a)}}return e},d.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return d.d(e,{a:e}),e},n=Object.getPrototypeOf?function(t){return Object.getPrototypeOf(t)}:function(t){return t.__proto__},d.t=function(t,r){if(1&r&&(t=this(t)),8&r||"object"==typeof t&&t&&(4&r&&t.__esModule||16&r&&"function"==typeof t.then))return t;var c=Object.create(null);d.r(c);var o={};e=e||[null,n({}),n([]),n(n)];for(var u=2&r&&t;"object"==typeof u&&!~e.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(e){o[e]=function(){return t[e]}});return o.default=function(){return t},d.d(c,o),c},d.d=function(t,e){for(var n in e)d.o(e,n)&&!d.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},d.f={},d.e=function(t){return Promise.all(Object.keys(d.f).reduce(function(e,n){return d.f[n](t,e),e},[]))},d.u=function(t){return 2350===t?"static/chunks/2350.fab69e61bac57b23.js":2369===t?"static/chunks/2369.fc20f0c2c8ed9fe7.js":3937===t?"static/chunks/3937.210053269f121201.js":9025===t?"static/chunks/9025.c12318fb6a1a9093.js":4937===t?"static/chunks/4937.a2baa2df5572a276.js":3294===t?"static/chunks/3294.1fafbf42b3bcebff.js":8640===t?"static/chunks/8640.5b9475a2d18c5416.js":
|
|
1
|
+
!function(){"use strict";var t,e,n,r,c,o,u,i,f,a={},s={};function d(t){var e=s[t];if(void 0!==e)return e.exports;var n=s[t]={exports:{}},r=!0;try{a[t](n,n.exports,d),r=!1}finally{r&&delete s[t]}return n.exports}d.m=a,t=[],d.O=function(e,n,r,c){if(n){c=c||0;for(var o=t.length;o>0&&t[o-1][2]>c;o--)t[o]=t[o-1];t[o]=[n,r,c];return}for(var u=1/0,o=0;o<t.length;o++){for(var n=t[o][0],r=t[o][1],c=t[o][2],i=!0,f=0;f<n.length;f++)u>=c&&Object.keys(d.O).every(function(t){return d.O[t](n[f])})?n.splice(f--,1):(i=!1,c<u&&(u=c));if(i){t.splice(o--,1);var a=r();void 0!==a&&(e=a)}}return e},d.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return d.d(e,{a:e}),e},n=Object.getPrototypeOf?function(t){return Object.getPrototypeOf(t)}:function(t){return t.__proto__},d.t=function(t,r){if(1&r&&(t=this(t)),8&r||"object"==typeof t&&t&&(4&r&&t.__esModule||16&r&&"function"==typeof t.then))return t;var c=Object.create(null);d.r(c);var o={};e=e||[null,n({}),n([]),n(n)];for(var u=2&r&&t;"object"==typeof u&&!~e.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(e){o[e]=function(){return t[e]}});return o.default=function(){return t},d.d(c,o),c},d.d=function(t,e){for(var n in e)d.o(e,n)&&!d.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},d.f={},d.e=function(t){return Promise.all(Object.keys(d.f).reduce(function(e,n){return d.f[n](t,e),e},[]))},d.u=function(t){return 2350===t?"static/chunks/2350.fab69e61bac57b23.js":2369===t?"static/chunks/2369.fc20f0c2c8ed9fe7.js":3937===t?"static/chunks/3937.210053269f121201.js":9025===t?"static/chunks/9025.c12318fb6a1a9093.js":4937===t?"static/chunks/4937.a2baa2df5572a276.js":3294===t?"static/chunks/3294.1fafbf42b3bcebff.js":8640===t?"static/chunks/8640.5b9475a2d18c5416.js":2755===t?"static/chunks/2755.97300e1362fe7c98.js":9847===t?"static/chunks/9847.3aaca6bb33455140.js":4725===t?"static/chunks/4725.10f7a9a5d3ea8208.js":3785===t?"static/chunks/3785.a19328ba41517b8b.js":9360===t?"static/chunks/9360.71e83b2ddc844ec2.js":"static/chunks/"+t+"-"+({616:"3d59f75e2ccf9321",1121:"d0782b9251f0fcd3",1141:"3b40c39626f99c89",1272:"1ef0bf0237faccdb",1871:"49141c317f3a9020",3015:"7e0e8f06bb2f881c",3850:"ff4a9a69d978632b",5739:"d67458fcb1386c92",6130:"2be46d70a38f1e82",6135:"4b4d5e824b7f9d3c",6601:"06114c982db410b6",6856:"5fdc9b851a18acdb",6989:"01359c57e018caa4",6990:"f6818c84ed8f1c86",7359:"c8d04e06886000b3",7411:"b15471acd2cba716",8969:"66237729cdf9749e"})[t]+".js"},d.miniCssF=function(t){},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(t){if("object"==typeof window)return window}}(),d.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r={},c="_N_E:",d.l=function(t,e,n,o){if(r[t]){r[t].push(e);return}if(void 0!==n)for(var u,i,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var s=f[a];if(s.getAttribute("src")==t||s.getAttribute("data-webpack")==c+n){u=s;break}}u||(i=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,d.nc&&u.setAttribute("nonce",d.nc),u.setAttribute("data-webpack",c+n),u.src=d.tu(t)),r[t]=[e];var b=function(e,n){u.onerror=u.onload=null,clearTimeout(l);var c=r[t];if(delete r[t],u.parentNode&&u.parentNode.removeChild(u),c&&c.forEach(function(t){return t(n)}),e)return e(n)},l=setTimeout(b.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=b.bind(null,u.onerror),u.onload=b.bind(null,u.onload),i&&document.head.appendChild(u)},d.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},d.tt=function(){return void 0===o&&(o={createScriptURL:function(t){return t}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},d.tu=function(t){return d.tt().createScriptURL(t)},d.p="/dashboard/_next/",u={2272:0},d.f.j=function(t,e){var n=d.o(u,t)?u[t]:void 0;if(0!==n){if(n)e.push(n[2]);else if(2272!=t){var r=new Promise(function(e,r){n=u[t]=[e,r]});e.push(n[2]=r);var c=d.p+d.u(t),o=Error();d.l(c,function(e){if(d.o(u,t)&&(0!==(n=u[t])&&(u[t]=void 0),n)){var r=e&&("load"===e.type?"missing":e.type),c=e&&e.target&&e.target.src;o.message="Loading chunk "+t+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+t,t)}else u[t]=0}},d.O.j=function(t){return 0===u[t]},i=function(t,e){var n,r,c=e[0],o=e[1],i=e[2],f=0;if(c.some(function(t){return 0!==u[t]})){for(n in o)d.o(o,n)&&(d.m[n]=o[n]);if(i)var a=i(d)}for(t&&t(e);f<c.length;f++)r=c[f],d.o(u,r)&&u[r]&&u[r][0](),u[r]=0;return d.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),f.push=i.bind(null,f.push.bind(f)),d.nc=void 0}();
|
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-8f058b0346db2aff.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-5fdc9b851a18acdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-49141c317f3a9020.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-477555ab7c0b13d8.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/clusters.html
CHANGED
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-2f61f65487f6d8ff.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/config.html
CHANGED
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/index.html
CHANGED
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-553b8b5cb65e100b.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/infra.html
CHANGED
|
@@ -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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-910a22500c50596f.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-
|
|
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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.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-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-e5c9ce6a24fc0de4.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/jDc1PlRsl9Cc5FQUMLBu8/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"jDc1PlRsl9Cc5FQUMLBu8","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|