skypilot-nightly 1.0.0.dev20250826__py3-none-any.whl → 1.0.0.dev20250827__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/authentication.py +3 -9
- sky/backends/backend_utils.py +30 -43
- sky/backends/cloud_vm_ray_backend.py +2 -2
- sky/client/cli/command.py +2 -1
- sky/client/common.py +41 -14
- sky/client/sdk.py +1 -1
- sky/clouds/aws.py +1 -1
- sky/clouds/cloud.py +15 -0
- sky/clouds/kubernetes.py +27 -0
- sky/clouds/ssh.py +2 -3
- sky/dashboard/out/404.html +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/global_user_state.py +103 -11
- sky/provision/kubernetes/config.py +2 -8
- sky/provision/kubernetes/instance.py +6 -0
- sky/provision/kubernetes/network_utils.py +3 -4
- sky/provision/kubernetes/utils.py +6 -5
- sky/provision/nebius/utils.py +15 -7
- sky/provision/vsphere/vsphere_utils.py +2 -8
- sky/schemas/api/responses.py +7 -0
- sky/serve/serve_utils.py +2 -2
- sky/serve/service_spec.py +2 -8
- sky/server/auth/authn.py +4 -0
- sky/server/common.py +7 -1
- sky/server/requests/executor.py +4 -0
- sky/server/server.py +18 -33
- sky/server/uvicorn.py +33 -0
- sky/setup_files/dependencies.py +1 -0
- sky/sky_logging.py +4 -1
- sky/skylet/events.py +2 -2
- sky/skypilot_config.py +4 -2
- sky/ssh_node_pools/core.py +3 -1
- sky/task.py +3 -9
- sky/users/server.py +6 -6
- sky/utils/common_utils.py +3 -2
- sky/utils/yaml_utils.py +35 -0
- sky/volumes/volume.py +8 -3
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.dist-info}/METADATA +2 -1
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.dist-info}/RECORD +60 -59
- /sky/dashboard/out/_next/static/{TPMkEeuj85tHTmIW7Gu3S → -eL7Ky3bxVivzeLHNB9U6}/_buildManifest.js +0 -0
- /sky/dashboard/out/_next/static/{TPMkEeuj85tHTmIW7Gu3S → -eL7Ky3bxVivzeLHNB9U6}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250826.dist-info → skypilot_nightly-1.0.0.dev20250827.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 = '01e261e45881118c963337e22cc819586eef9b43'
|
|
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.dev20250827'
|
|
41
41
|
__root_dir__ = directory_utils.get_sky_dir()
|
|
42
42
|
|
|
43
43
|
|
sky/authentication.py
CHANGED
|
@@ -25,7 +25,6 @@ import re
|
|
|
25
25
|
import socket
|
|
26
26
|
import subprocess
|
|
27
27
|
import sys
|
|
28
|
-
import typing
|
|
29
28
|
from typing import Any, Dict, Optional, Tuple
|
|
30
29
|
import uuid
|
|
31
30
|
|
|
@@ -37,7 +36,6 @@ from sky import exceptions
|
|
|
37
36
|
from sky import global_user_state
|
|
38
37
|
from sky import sky_logging
|
|
39
38
|
from sky import skypilot_config
|
|
40
|
-
from sky.adaptors import common as adaptors_common
|
|
41
39
|
from sky.adaptors import gcp
|
|
42
40
|
from sky.adaptors import ibm
|
|
43
41
|
from sky.adaptors import kubernetes
|
|
@@ -51,6 +49,7 @@ from sky.utils import config_utils
|
|
|
51
49
|
from sky.utils import kubernetes_enums
|
|
52
50
|
from sky.utils import subprocess_utils
|
|
53
51
|
from sky.utils import ux_utils
|
|
52
|
+
from sky.utils import yaml_utils
|
|
54
53
|
|
|
55
54
|
logger = sky_logging.init_logger(__name__)
|
|
56
55
|
|
|
@@ -67,11 +66,6 @@ MAX_TRIALS = 64
|
|
|
67
66
|
# the former dir is empheral.
|
|
68
67
|
_SSH_KEY_PATH_PREFIX = '~/.sky/clients/{user_hash}/ssh'
|
|
69
68
|
|
|
70
|
-
if typing.TYPE_CHECKING:
|
|
71
|
-
import yaml
|
|
72
|
-
else:
|
|
73
|
-
yaml = adaptors_common.LazyImport('yaml')
|
|
74
|
-
|
|
75
69
|
|
|
76
70
|
def get_ssh_key_and_lock_path(
|
|
77
71
|
user_hash: Optional[str] = None) -> Tuple[str, str, str]:
|
|
@@ -209,7 +203,7 @@ def configure_ssh_info(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
209
203
|
config['auth']['ssh_user'])
|
|
210
204
|
config_str = config_str.replace('skypilot:ssh_public_key_content',
|
|
211
205
|
public_key)
|
|
212
|
-
config =
|
|
206
|
+
config = yaml_utils.safe_load(config_str)
|
|
213
207
|
return config
|
|
214
208
|
|
|
215
209
|
|
|
@@ -289,7 +283,7 @@ def setup_gcp_authentication(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
289
283
|
os_login_username = None
|
|
290
284
|
if proc.returncode == 0:
|
|
291
285
|
try:
|
|
292
|
-
profile =
|
|
286
|
+
profile = yaml_utils.safe_load(proc.stdout)
|
|
293
287
|
username = profile['posixAccounts'][0]['username']
|
|
294
288
|
if username:
|
|
295
289
|
os_login_username = username
|
sky/backends/backend_utils.py
CHANGED
|
@@ -60,6 +60,7 @@ from sky.utils import subprocess_utils
|
|
|
60
60
|
from sky.utils import tempstore
|
|
61
61
|
from sky.utils import timeline
|
|
62
62
|
from sky.utils import ux_utils
|
|
63
|
+
from sky.utils import yaml_utils
|
|
63
64
|
from sky.workspaces import core as workspaces_core
|
|
64
65
|
|
|
65
66
|
if typing.TYPE_CHECKING:
|
|
@@ -484,8 +485,8 @@ def _replace_yaml_dicts(
|
|
|
484
485
|
if key in old_block:
|
|
485
486
|
_restore_block(value, old_block[key])
|
|
486
487
|
|
|
487
|
-
new_config =
|
|
488
|
-
old_config =
|
|
488
|
+
new_config = yaml_utils.safe_load(new_yaml)
|
|
489
|
+
old_config = yaml_utils.safe_load(old_yaml)
|
|
489
490
|
excluded_results = {}
|
|
490
491
|
# Find all key values excluded from restore
|
|
491
492
|
for exclude_restore_key_name_list in restore_key_names_exceptions:
|
|
@@ -2881,38 +2882,42 @@ def get_clusters(
|
|
|
2881
2882
|
A list of cluster records. If the cluster does not exist or has been
|
|
2882
2883
|
terminated, the record will be omitted from the returned list.
|
|
2883
2884
|
"""
|
|
2884
|
-
records = global_user_state.get_clusters()
|
|
2885
|
-
current_user = common_utils.get_current_user()
|
|
2886
|
-
|
|
2887
|
-
# Filter out clusters created by the controller.
|
|
2888
|
-
if (not env_options.Options.SHOW_DEBUG_INFO.get() and
|
|
2889
|
-
not _include_is_managed):
|
|
2890
|
-
records = [
|
|
2891
|
-
record for record in records if not record.get('is_managed', False)
|
|
2892
|
-
]
|
|
2893
2885
|
|
|
2894
|
-
|
|
2886
|
+
exclude_managed_clusters = False
|
|
2887
|
+
if not (_include_is_managed or env_options.Options.SHOW_DEBUG_INFO.get()):
|
|
2888
|
+
exclude_managed_clusters = True
|
|
2889
|
+
user_hashes_filter = None
|
|
2895
2890
|
if not all_users:
|
|
2896
|
-
|
|
2897
|
-
record for record in records
|
|
2898
|
-
if record['user_hash'] == current_user.id
|
|
2899
|
-
]
|
|
2900
|
-
|
|
2891
|
+
user_hashes_filter = {common_utils.get_current_user().id}
|
|
2901
2892
|
accessible_workspaces = workspaces_core.get_workspaces()
|
|
2902
2893
|
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
if cluster_workspace in accessible_workspaces:
|
|
2908
|
-
workspace_filtered_records.append(record)
|
|
2909
|
-
|
|
2910
|
-
records = workspace_filtered_records
|
|
2894
|
+
records = global_user_state.get_clusters(
|
|
2895
|
+
exclude_managed_clusters=exclude_managed_clusters,
|
|
2896
|
+
user_hashes_filter=user_hashes_filter,
|
|
2897
|
+
workspaces_filter=accessible_workspaces)
|
|
2911
2898
|
|
|
2912
2899
|
yellow = colorama.Fore.YELLOW
|
|
2913
2900
|
bright = colorama.Style.BRIGHT
|
|
2914
2901
|
reset = colorama.Style.RESET_ALL
|
|
2915
2902
|
|
|
2903
|
+
if cluster_names is not None:
|
|
2904
|
+
if isinstance(cluster_names, str):
|
|
2905
|
+
cluster_names = [cluster_names]
|
|
2906
|
+
cluster_names = _get_glob_clusters(cluster_names, silent=True)
|
|
2907
|
+
new_records = []
|
|
2908
|
+
not_exist_cluster_names = []
|
|
2909
|
+
for cluster_name in cluster_names:
|
|
2910
|
+
for record in records:
|
|
2911
|
+
if record['name'] == cluster_name:
|
|
2912
|
+
new_records.append(record)
|
|
2913
|
+
break
|
|
2914
|
+
else:
|
|
2915
|
+
not_exist_cluster_names.append(cluster_name)
|
|
2916
|
+
if not_exist_cluster_names:
|
|
2917
|
+
clusters_str = ', '.join(not_exist_cluster_names)
|
|
2918
|
+
logger.info(f'Cluster(s) not found: {bright}{clusters_str}{reset}.')
|
|
2919
|
+
records = new_records
|
|
2920
|
+
|
|
2916
2921
|
def _update_record_with_credentials_and_resources_str(
|
|
2917
2922
|
record: Optional[Dict[str, Any]]) -> None:
|
|
2918
2923
|
"""Add the credentials to the record.
|
|
@@ -2952,24 +2957,6 @@ def get_clusters(
|
|
|
2952
2957
|
credentials['ssh_private_key_content'] = f.read()
|
|
2953
2958
|
record['credentials'] = credentials
|
|
2954
2959
|
|
|
2955
|
-
if cluster_names is not None:
|
|
2956
|
-
if isinstance(cluster_names, str):
|
|
2957
|
-
cluster_names = [cluster_names]
|
|
2958
|
-
cluster_names = _get_glob_clusters(cluster_names, silent=True)
|
|
2959
|
-
new_records = []
|
|
2960
|
-
not_exist_cluster_names = []
|
|
2961
|
-
for cluster_name in cluster_names:
|
|
2962
|
-
for record in records:
|
|
2963
|
-
if record['name'] == cluster_name:
|
|
2964
|
-
new_records.append(record)
|
|
2965
|
-
break
|
|
2966
|
-
else:
|
|
2967
|
-
not_exist_cluster_names.append(cluster_name)
|
|
2968
|
-
if not_exist_cluster_names:
|
|
2969
|
-
clusters_str = ', '.join(not_exist_cluster_names)
|
|
2970
|
-
logger.info(f'Cluster(s) not found: {bright}{clusters_str}{reset}.')
|
|
2971
|
-
records = new_records
|
|
2972
|
-
|
|
2973
2960
|
def _update_records_with_resources(
|
|
2974
2961
|
records: List[Optional[Dict[str, Any]]]) -> None:
|
|
2975
2962
|
"""Add the resources to the record."""
|
|
@@ -22,7 +22,6 @@ from typing import (Any, Callable, Dict, Iterable, List, Optional, Set, Tuple,
|
|
|
22
22
|
|
|
23
23
|
import colorama
|
|
24
24
|
import psutil
|
|
25
|
-
import yaml
|
|
26
25
|
|
|
27
26
|
from sky import backends
|
|
28
27
|
from sky import catalog
|
|
@@ -77,6 +76,7 @@ from sky.utils import subprocess_utils
|
|
|
77
76
|
from sky.utils import timeline
|
|
78
77
|
from sky.utils import ux_utils
|
|
79
78
|
from sky.utils import volume as volume_lib
|
|
79
|
+
from sky.utils import yaml_utils
|
|
80
80
|
|
|
81
81
|
if typing.TYPE_CHECKING:
|
|
82
82
|
import grpc
|
|
@@ -2351,7 +2351,7 @@ class CloudVmRayResourceHandle(backends.backend.ResourceHandle):
|
|
|
2351
2351
|
# If the cluster yaml is not available,
|
|
2352
2352
|
# we skip updating the cluster info.
|
|
2353
2353
|
return
|
|
2354
|
-
config =
|
|
2354
|
+
config = yaml_utils.safe_load(yaml_str)
|
|
2355
2355
|
try:
|
|
2356
2356
|
cluster_info = provision_lib.get_cluster_info(
|
|
2357
2357
|
provider_name,
|
sky/client/cli/command.py
CHANGED
|
@@ -89,6 +89,7 @@ from sky.utils import status_lib
|
|
|
89
89
|
from sky.utils import subprocess_utils
|
|
90
90
|
from sky.utils import timeline
|
|
91
91
|
from sky.utils import ux_utils
|
|
92
|
+
from sky.utils import yaml_utils
|
|
92
93
|
from sky.utils.cli_utils import status_utils
|
|
93
94
|
from sky.volumes import utils as volumes_utils
|
|
94
95
|
from sky.volumes.client import sdk as volumes_sdk
|
|
@@ -589,7 +590,7 @@ def _check_yaml_only(
|
|
|
589
590
|
try:
|
|
590
591
|
with open(entrypoint, 'r', encoding='utf-8') as f:
|
|
591
592
|
try:
|
|
592
|
-
config = list(
|
|
593
|
+
config = list(yaml_utils.safe_load_all(f))
|
|
593
594
|
if config:
|
|
594
595
|
# FIXME(zongheng): in a chain DAG YAML it only returns the
|
|
595
596
|
# first section. OK for downstream but is weird.
|
sky/client/common.py
CHANGED
|
@@ -19,6 +19,7 @@ from sky.adaptors import common as adaptors_common
|
|
|
19
19
|
from sky.client import service_account_auth
|
|
20
20
|
from sky.data import data_utils
|
|
21
21
|
from sky.data import storage_utils
|
|
22
|
+
from sky.schemas.api import responses as api_responses
|
|
22
23
|
from sky.server import common as server_common
|
|
23
24
|
from sky.server.requests import payloads
|
|
24
25
|
from sky.skylet import constants
|
|
@@ -165,8 +166,12 @@ class UploadChunkParams:
|
|
|
165
166
|
log_file: str
|
|
166
167
|
|
|
167
168
|
|
|
168
|
-
def _upload_chunk_with_retry(params: UploadChunkParams) ->
|
|
169
|
-
"""Uploads a chunk of a zip file to the API server.
|
|
169
|
+
def _upload_chunk_with_retry(params: UploadChunkParams) -> str:
|
|
170
|
+
"""Uploads a chunk of a zip file to the API server.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Status of the upload.
|
|
174
|
+
"""
|
|
170
175
|
upload_logger = params.upload_logger
|
|
171
176
|
upload_logger.info(
|
|
172
177
|
f'Uploading chunk: {params.chunk_index + 1} / {params.total_chunks}')
|
|
@@ -195,13 +200,14 @@ def _upload_chunk_with_retry(params: UploadChunkParams) -> None:
|
|
|
195
200
|
data = response.json()
|
|
196
201
|
status = data.get('status')
|
|
197
202
|
msg = ('Uploaded chunk: '
|
|
198
|
-
f'{params.chunk_index + 1} / {params.total_chunks}'
|
|
199
|
-
|
|
203
|
+
f'{params.chunk_index + 1} / {params.total_chunks} '
|
|
204
|
+
f'(Status: {status})')
|
|
205
|
+
if status == api_responses.UploadStatus.UPLOADING.value:
|
|
200
206
|
missing_chunks = data.get('missing_chunks')
|
|
201
207
|
if missing_chunks:
|
|
202
208
|
msg += f' - Waiting for chunks: {missing_chunks}'
|
|
203
209
|
upload_logger.info(msg)
|
|
204
|
-
return
|
|
210
|
+
return status
|
|
205
211
|
elif attempt < max_attempts - 1:
|
|
206
212
|
upload_logger.error(
|
|
207
213
|
f'Failed to upload chunk: '
|
|
@@ -209,7 +215,12 @@ def _upload_chunk_with_retry(params: UploadChunkParams) -> None:
|
|
|
209
215
|
f'{response.content.decode("utf-8")}')
|
|
210
216
|
upload_logger.info(
|
|
211
217
|
f'Retrying... ({attempt + 1} / {max_attempts})')
|
|
212
|
-
|
|
218
|
+
if response.status_code == 503:
|
|
219
|
+
# If the server is temporarily unavailable,
|
|
220
|
+
# wait a little longer before retrying.
|
|
221
|
+
time.sleep(10)
|
|
222
|
+
else:
|
|
223
|
+
time.sleep(1)
|
|
213
224
|
else:
|
|
214
225
|
try:
|
|
215
226
|
response_details = response.json().get('detail')
|
|
@@ -225,6 +236,8 @@ def _upload_chunk_with_retry(params: UploadChunkParams) -> None:
|
|
|
225
236
|
ux_utils.error_message(error_msg + '\n',
|
|
226
237
|
params.log_file,
|
|
227
238
|
is_local=True))
|
|
239
|
+
# If we reach here, the upload failed.
|
|
240
|
+
return 'failed'
|
|
228
241
|
|
|
229
242
|
|
|
230
243
|
@contextlib.contextmanager
|
|
@@ -347,15 +360,29 @@ def upload_mounts_to_api_server(dag: 'sky.Dag',
|
|
|
347
360
|
log_file,
|
|
348
361
|
is_local=True))
|
|
349
362
|
|
|
363
|
+
upload_completed = False
|
|
350
364
|
with httpx.Client(timeout=timeout) as client:
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
365
|
+
total_retries = 3
|
|
366
|
+
for retry in range(total_retries):
|
|
367
|
+
chunk_params = [
|
|
368
|
+
UploadChunkParams(client, upload_id, chunk_index,
|
|
369
|
+
total_chunks, temp_zip_file.name,
|
|
370
|
+
upload_logger, log_file)
|
|
371
|
+
for chunk_index in range(total_chunks)
|
|
372
|
+
]
|
|
373
|
+
statuses = subprocess_utils.run_in_parallel(
|
|
374
|
+
_upload_chunk_with_retry, chunk_params)
|
|
375
|
+
if any(status == api_responses.UploadStatus.COMPLETED.value
|
|
376
|
+
for status in statuses):
|
|
377
|
+
upload_completed = True
|
|
378
|
+
break
|
|
379
|
+
else:
|
|
380
|
+
upload_logger.info(
|
|
381
|
+
f'No chunk upload returned completed status. '
|
|
382
|
+
'Retrying entire upload... '
|
|
383
|
+
f'({retry + 1} / {total_retries})')
|
|
384
|
+
if not upload_completed:
|
|
385
|
+
raise RuntimeError('Failed to upload files to API server.')
|
|
359
386
|
os.unlink(temp_zip_file.name)
|
|
360
387
|
upload_logger.info(f'Uploaded files: {upload_list}')
|
|
361
388
|
logger.info(
|
sky/client/sdk.py
CHANGED
|
@@ -571,7 +571,7 @@ def launch(
|
|
|
571
571
|
idle_minutes=idle_minutes_to_autostop,
|
|
572
572
|
wait_for=wait_for)
|
|
573
573
|
if resource.autostop_config is not None:
|
|
574
|
-
# For backward-
|
|
574
|
+
# For backward-compatibility, get the final autostop config for
|
|
575
575
|
# admin policy.
|
|
576
576
|
# TODO(aylei): remove this after 0.12.0
|
|
577
577
|
down = resource.autostop_config.down
|
sky/clouds/aws.py
CHANGED
|
@@ -933,7 +933,7 @@ class AWS(clouds.Cloud):
|
|
|
933
933
|
# `aws configure list` as cache key. Different `aws configure list` output
|
|
934
934
|
# can have same aws identity, our assumption is the output would be stable
|
|
935
935
|
# in real world, so the number of cache files would be limited.
|
|
936
|
-
# TODO(aylei): consider using a more stable cache key and
|
|
936
|
+
# TODO(aylei): consider using a more stable cache key and evaluate eviction.
|
|
937
937
|
cache_path = catalog_common.get_catalog_path(
|
|
938
938
|
f'aws/.cache/user-identity-{config_hash}.txt')
|
|
939
939
|
if os.path.exists(cache_path):
|
sky/clouds/cloud.py
CHANGED
|
@@ -396,6 +396,21 @@ class Cloud:
|
|
|
396
396
|
del label_key, label_value
|
|
397
397
|
return True, None
|
|
398
398
|
|
|
399
|
+
@classmethod
|
|
400
|
+
def is_volume_name_valid(cls,
|
|
401
|
+
volume_name: str) -> Tuple[bool, Optional[str]]:
|
|
402
|
+
"""Validates that the volume name is valid for this cloud.
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
A tuple of a boolean indicating whether the volume name is valid
|
|
406
|
+
and an optional string describing the reason if the volume name
|
|
407
|
+
is invalid.
|
|
408
|
+
"""
|
|
409
|
+
# If a cloud does not support volume, they are ignored. Only clouds
|
|
410
|
+
# that support volume implement this method.
|
|
411
|
+
del volume_name
|
|
412
|
+
return True, None
|
|
413
|
+
|
|
399
414
|
@timeline.event
|
|
400
415
|
def get_feasible_launchable_resources(
|
|
401
416
|
self,
|
sky/clouds/kubernetes.py
CHANGED
|
@@ -57,6 +57,8 @@ class Kubernetes(clouds.Cloud):
|
|
|
57
57
|
# where the suffix is 21 characters long.
|
|
58
58
|
_MAX_CLUSTER_NAME_LEN_LIMIT = 42
|
|
59
59
|
|
|
60
|
+
_MAX_VOLUME_NAME_LEN_LIMIT = 253
|
|
61
|
+
|
|
60
62
|
_SUPPORTS_SERVICE_ACCOUNT_ON_REMOTE = True
|
|
61
63
|
|
|
62
64
|
_DEFAULT_NUM_VCPUS = 2
|
|
@@ -1041,6 +1043,31 @@ class Kubernetes(clouds.Cloud):
|
|
|
1041
1043
|
identities.append(identity)
|
|
1042
1044
|
return identities
|
|
1043
1045
|
|
|
1046
|
+
@classmethod
|
|
1047
|
+
def is_volume_name_valid(cls,
|
|
1048
|
+
volume_name: str) -> Tuple[bool, Optional[str]]:
|
|
1049
|
+
"""Validates that the volume name is valid for this cloud.
|
|
1050
|
+
|
|
1051
|
+
Follows Kubernetes DNS-1123 subdomain rules:
|
|
1052
|
+
- must be <= 253 characters
|
|
1053
|
+
- must match: '[a-z0-9]([-a-z0-9]*[a-z0-9])?(.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*' # pylint: disable=line-too-long
|
|
1054
|
+
"""
|
|
1055
|
+
# Max length per DNS-1123 subdomain
|
|
1056
|
+
if len(volume_name) > cls._MAX_VOLUME_NAME_LEN_LIMIT:
|
|
1057
|
+
return (False, f'Volume name exceeds the maximum length of '
|
|
1058
|
+
f'{cls._MAX_VOLUME_NAME_LEN_LIMIT} characters '
|
|
1059
|
+
'(DNS-1123 subdomain).')
|
|
1060
|
+
|
|
1061
|
+
# DNS-1123 label: [a-z0-9]([-a-z0-9]*[a-z0-9])?
|
|
1062
|
+
label = r'[a-z0-9]([-a-z0-9]*[a-z0-9])?'
|
|
1063
|
+
# DNS-1123 subdomain: label(\.-separated label)*
|
|
1064
|
+
subdomain_pattern = rf'^{label}(\.{label})*$'
|
|
1065
|
+
if re.fullmatch(subdomain_pattern, volume_name) is None:
|
|
1066
|
+
return (False, 'Volume name must be a valid DNS-1123 subdomain: '
|
|
1067
|
+
'lowercase alphanumeric, "-", and "."; start/end with '
|
|
1068
|
+
'alphanumeric.')
|
|
1069
|
+
return True, None
|
|
1070
|
+
|
|
1044
1071
|
@classmethod
|
|
1045
1072
|
def is_label_valid(cls, label_key: str,
|
|
1046
1073
|
label_value: str) -> Tuple[bool, Optional[str]]:
|
sky/clouds/ssh.py
CHANGED
|
@@ -4,8 +4,6 @@ import os
|
|
|
4
4
|
import typing
|
|
5
5
|
from typing import Dict, List, Optional, Set, Tuple, Union
|
|
6
6
|
|
|
7
|
-
import yaml
|
|
8
|
-
|
|
9
7
|
from sky import sky_logging
|
|
10
8
|
from sky import skypilot_config
|
|
11
9
|
from sky.adaptors import kubernetes as kubernetes_adaptor
|
|
@@ -14,6 +12,7 @@ from sky.provision.kubernetes import utils as kubernetes_utils
|
|
|
14
12
|
from sky.utils import annotations
|
|
15
13
|
from sky.utils import common_utils
|
|
16
14
|
from sky.utils import registry
|
|
15
|
+
from sky.utils import yaml_utils
|
|
17
16
|
|
|
18
17
|
if typing.TYPE_CHECKING:
|
|
19
18
|
# Renaming to avoid shadowing variables.
|
|
@@ -66,7 +65,7 @@ class SSH(kubernetes.Kubernetes):
|
|
|
66
65
|
if os.path.exists(SSH_NODE_POOLS_PATH):
|
|
67
66
|
try:
|
|
68
67
|
with open(SSH_NODE_POOLS_PATH, 'r', encoding='utf-8') as f:
|
|
69
|
-
ssh_config =
|
|
68
|
+
ssh_config = yaml_utils.safe_load(f)
|
|
70
69
|
if ssh_config:
|
|
71
70
|
# Get cluster names and prepend 'ssh-' to match
|
|
72
71
|
# context naming convention
|
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-6e76f636a048e145.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/
|
|
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-6e76f636a048e145.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/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_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":"-eL7Ky3bxVivzeLHNB9U6","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/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-6e76f636a048e145.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-06afb50d25f7c61f.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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-06afb50d25f7c61f.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_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":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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/4676-9da7fdbde90b5549.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-049014c6d43d127b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/9037-89a84fd7fa31362d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-a0527109c2fab467.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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/4676-9da7fdbde90b5549.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-049014c6d43d127b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/9037-89a84fd7fa31362d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-a0527109c2fab467.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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-469814d711d63b1b.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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-469814d711d63b1b.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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/
|
|
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-6e76f636a048e145.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/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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/
|
|
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-6e76f636a048e145.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/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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-81351f95f3bec08e.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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-81351f95f3bec08e.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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-c320641c2bcbbea6.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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-c320641c2bcbbea6.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","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-6e76f636a048e145.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/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.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-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/jobs.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-6e76f636a048e145.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/jobs-7421e63ac35f8fce.js" defer=""></script><script src="/dashboard/_next/static/
|
|
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-6e76f636a048e145.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/jobs-7421e63ac35f8fce.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/-eL7Ky3bxVivzeLHNB9U6/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"-eL7Ky3bxVivzeLHNB9U6","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|