skypilot-nightly 1.0.0.dev20250812__py3-none-any.whl → 1.0.0.dev20250815__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 +4 -2
- sky/adaptors/nebius.py +43 -1
- sky/backends/backend_utils.py +74 -7
- sky/backends/cloud_vm_ray_backend.py +169 -29
- sky/catalog/cudo_catalog.py +1 -1
- sky/catalog/data_fetchers/fetch_cudo.py +1 -1
- sky/catalog/data_fetchers/fetch_nebius.py +6 -3
- sky/client/cli/command.py +62 -85
- sky/client/common.py +1 -1
- sky/client/sdk.py +69 -19
- sky/client/sdk_async.py +5 -4
- sky/clouds/aws.py +52 -1
- sky/clouds/kubernetes.py +15 -5
- sky/clouds/nebius.py +3 -1
- sky/dag.py +1 -0
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/I-djf3wB8zZl_bI67BOyZ/_buildManifest.js +1 -0
- sky/dashboard/out/_next/static/chunks/1141-a96678fed5043c12.js +1 -0
- sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
- sky/dashboard/out/_next/static/chunks/3015-77d22ae2fad4071c.js +1 -0
- sky/dashboard/out/_next/static/chunks/3785.8ce85b31e5c602e9.js +1 -0
- sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +21 -0
- sky/dashboard/out/_next/static/chunks/4509-fa63866741388427.js +1 -0
- sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +10 -0
- sky/dashboard/out/_next/static/chunks/4725.68d5ce4d6bcb7991.js +1 -0
- sky/dashboard/out/_next/static/chunks/6014.d466a44b73af8348.js +6 -0
- sky/dashboard/out/_next/static/chunks/{6135-85426374db04811e.js → 6135-4b4d5e824b7f9d3c.js} +1 -1
- sky/dashboard/out/_next/static/chunks/6633-efe924b9b8136699.js +40 -0
- sky/dashboard/out/_next/static/chunks/6856-58370d8c9a79f72b.js +1 -0
- sky/dashboard/out/_next/static/chunks/{6989-6129c1cfbcf51063.js → 6989-01359c57e018caa4.js} +1 -1
- sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +1 -0
- sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +6 -0
- sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +18 -0
- sky/dashboard/out/_next/static/chunks/7557-5855617d0421ed55.js +1 -0
- sky/dashboard/out/_next/static/chunks/8310.4ae62d5937045bf3.js +31 -0
- sky/dashboard/out/_next/static/chunks/8838.e7953f42af2b0544.js +45 -0
- sky/dashboard/out/_next/static/chunks/8969-6d493b1e2fa45826.js +1 -0
- sky/dashboard/out/_next/static/chunks/{1871-980a395e92633a5c.js → 9037-f71c3c42670a4be0.js} +2 -2
- sky/dashboard/out/_next/static/chunks/9277.71481d5b2e606e33.js +51 -0
- sky/dashboard/out/_next/static/chunks/pages/{_app-491a4d699d95e808.js → _app-ce361c6959bc2001.js} +2 -2
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/{[job]-078751bad714c017.js → [job]-6d43d6a6bd1d4c77.js} +2 -2
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-30c5954a7b1f67d7.js +16 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters-fa94c3548b5834aa.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-13d53fffc03ccb52.js → [context]-5264c5645299cde9.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{infra-fc9222e26c8e2f0d.js → infra-83991650ae4bd083.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-ad2cd5aab787bc15.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-f5ccf5d39d87aebe.js → [pool]-7d4182df6625fe10.js} +2 -7
- sky/dashboard/out/_next/static/chunks/pages/jobs-c6a6a8a737ad7e2d.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/users-d112a9b3d854abb2.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/volumes-b87fec189298a0c0.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-f72f73bcef9541dc.js → [name]-8a86ca4c98812df9.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/workspaces-74ef46fc370f7c71.js +1 -0
- sky/dashboard/out/_next/static/chunks/webpack-aba778a6d6eb496d.js +1 -0
- 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 +11 -1
- sky/exceptions.py +5 -0
- sky/execution.py +13 -10
- sky/global_user_state.py +191 -8
- sky/jobs/constants.py +1 -1
- sky/jobs/controller.py +0 -1
- sky/jobs/recovery_strategy.py +3 -3
- sky/jobs/scheduler.py +35 -87
- sky/jobs/server/core.py +82 -22
- sky/jobs/server/utils.py +1 -1
- sky/jobs/state.py +7 -5
- sky/jobs/utils.py +167 -8
- sky/provision/__init__.py +1 -0
- sky/provision/aws/config.py +25 -0
- sky/provision/aws/instance.py +37 -13
- sky/provision/azure/instance.py +2 -0
- sky/provision/cudo/cudo_wrapper.py +1 -1
- sky/provision/cudo/instance.py +2 -0
- sky/provision/do/instance.py +2 -0
- sky/provision/fluidstack/instance.py +2 -0
- sky/provision/gcp/instance.py +2 -0
- sky/provision/hyperbolic/instance.py +2 -1
- sky/provision/kubernetes/instance.py +133 -0
- sky/provision/lambda_cloud/instance.py +2 -0
- sky/provision/nebius/instance.py +2 -0
- sky/provision/nebius/utils.py +101 -86
- sky/provision/oci/instance.py +2 -0
- sky/provision/paperspace/instance.py +2 -1
- sky/provision/paperspace/utils.py +1 -1
- sky/provision/provisioner.py +13 -8
- sky/provision/runpod/instance.py +2 -0
- sky/provision/runpod/utils.py +1 -1
- sky/provision/scp/instance.py +2 -0
- sky/provision/vast/instance.py +2 -0
- sky/provision/vsphere/instance.py +2 -0
- sky/resources.py +6 -7
- sky/schemas/__init__.py +0 -0
- sky/schemas/api/__init__.py +0 -0
- sky/schemas/api/responses.py +70 -0
- sky/schemas/db/global_user_state/006_provision_log.py +41 -0
- sky/schemas/generated/__init__.py +0 -0
- sky/schemas/generated/autostopv1_pb2.py +36 -0
- sky/schemas/generated/autostopv1_pb2.pyi +43 -0
- sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
- sky/serve/constants.py +3 -7
- sky/serve/replica_managers.py +138 -117
- sky/serve/serve_state.py +42 -0
- sky/serve/serve_utils.py +58 -36
- sky/serve/server/impl.py +15 -19
- sky/serve/service.py +82 -33
- sky/server/constants.py +1 -1
- sky/server/requests/payloads.py +6 -0
- sky/server/requests/serializers/decoders.py +12 -2
- sky/server/requests/serializers/encoders.py +10 -2
- sky/server/server.py +64 -16
- sky/setup_files/dependencies.py +11 -10
- sky/skylet/autostop_lib.py +38 -5
- sky/skylet/constants.py +3 -1
- sky/skylet/services.py +44 -0
- sky/skylet/skylet.py +49 -4
- sky/task.py +19 -16
- sky/templates/aws-ray.yml.j2 +2 -2
- sky/templates/jobs-controller.yaml.j2 +6 -0
- sky/templates/kubernetes-ray.yml.j2 +1 -0
- sky/utils/command_runner.py +1 -1
- sky/utils/common_utils.py +20 -0
- sky/utils/config_utils.py +29 -5
- sky/utils/controller_utils.py +86 -0
- sky/utils/db/db_utils.py +17 -0
- sky/utils/db/migration_utils.py +1 -1
- sky/utils/log_utils.py +14 -5
- sky/utils/resources_utils.py +25 -1
- sky/utils/schemas.py +6 -0
- sky/utils/ux_utils.py +36 -5
- sky/volumes/server/core.py +2 -2
- sky/volumes/server/server.py +2 -2
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/METADATA +5 -7
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/RECORD +151 -142
- sky/dashboard/out/_next/static/Fuy7OzApYTUMz2QgoP7dP/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/1141-a8a8f1adba34c892.js +0 -11
- sky/dashboard/out/_next/static/chunks/1559-6c00e20454194859.js +0 -30
- sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +0 -15
- sky/dashboard/out/_next/static/chunks/2641.142718b6b78a6f9b.js +0 -1
- sky/dashboard/out/_next/static/chunks/3785.6003d293cb83eab4.js +0 -1
- sky/dashboard/out/_next/static/chunks/4725.29550342bd53afd8.js +0 -1
- sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +0 -15
- sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +0 -13
- sky/dashboard/out/_next/static/chunks/6601-06114c982db410b6.js +0 -1
- sky/dashboard/out/_next/static/chunks/691.5eeedf82cc243343.js +0 -55
- sky/dashboard/out/_next/static/chunks/6990-0f886f16e0d55ff8.js +0 -1
- sky/dashboard/out/_next/static/chunks/8056-5bdeda81199c0def.js +0 -1
- sky/dashboard/out/_next/static/chunks/8252.62b0d23aed618bb2.js +0 -16
- sky/dashboard/out/_next/static/chunks/8969-c9686994ddafcf01.js +0 -1
- sky/dashboard/out/_next/static/chunks/9159-11421c0f2909236f.js +0 -1
- sky/dashboard/out/_next/static/chunks/9360.85b0b1b4054574dd.js +0 -31
- sky/dashboard/out/_next/static/chunks/9666.cd4273f2a5c5802c.js +0 -1
- sky/dashboard/out/_next/static/chunks/9847.757720f3b40c0aa5.js +0 -30
- sky/dashboard/out/_next/static/chunks/9984.c5564679e467d245.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-da9cc0901349c2e9.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-b30460f683e6ba96.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-154f55cf8af55be5.js +0 -11
- sky/dashboard/out/_next/static/chunks/pages/jobs-cdc60fb5d371e16a.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/users-7ed36e44e779d5c7.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/volumes-c9695d657f78b5dc.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/workspaces-8f67be60165724cc.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-7fd0cf9dbecff10f.js +0 -1
- /sky/dashboard/out/_next/static/{Fuy7OzApYTUMz2QgoP7dP → I-djf3wB8zZl_bI67BOyZ}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250812.dist-info → skypilot_nightly-1.0.0.dev20250815.dist-info}/top_level.txt +0 -0
sky/utils/log_utils.py
CHANGED
|
@@ -47,13 +47,16 @@ class RayUpLineProcessor(LineProcessor):
|
|
|
47
47
|
RUNTIME_SETUP = 1
|
|
48
48
|
PULLING_DOCKER_IMAGES = 2
|
|
49
49
|
|
|
50
|
-
def __init__(self, log_path: str):
|
|
50
|
+
def __init__(self, log_path: str, cluster_name: Optional[str] = None):
|
|
51
51
|
self.log_path = log_path
|
|
52
|
+
self.cluster_name = cluster_name
|
|
52
53
|
|
|
53
54
|
def __enter__(self) -> None:
|
|
54
55
|
self.state = self.ProvisionStatus.LAUNCH
|
|
55
56
|
self.status_display = rich_utils.safe_status(
|
|
56
|
-
ux_utils.spinner_message('Launching',
|
|
57
|
+
ux_utils.spinner_message('Launching',
|
|
58
|
+
self.log_path,
|
|
59
|
+
cluster_name=self.cluster_name))
|
|
57
60
|
self.status_display.start()
|
|
58
61
|
|
|
59
62
|
def process_line(self, log_line: str) -> None:
|
|
@@ -62,19 +65,25 @@ class RayUpLineProcessor(LineProcessor):
|
|
|
62
65
|
logger.info(' Head VM is up.')
|
|
63
66
|
self.status_display.update(
|
|
64
67
|
ux_utils.spinner_message(
|
|
65
|
-
'Launching - Preparing SkyPilot runtime',
|
|
68
|
+
'Launching - Preparing SkyPilot runtime',
|
|
69
|
+
self.log_path,
|
|
70
|
+
cluster_name=self.cluster_name))
|
|
66
71
|
self.state = self.ProvisionStatus.RUNTIME_SETUP
|
|
67
72
|
if ('Pulling from' in log_line and
|
|
68
73
|
self.state == self.ProvisionStatus.RUNTIME_SETUP):
|
|
69
74
|
self.status_display.update(
|
|
70
75
|
ux_utils.spinner_message(
|
|
71
|
-
'Launching - Initializing docker container',
|
|
76
|
+
'Launching - Initializing docker container',
|
|
77
|
+
self.log_path,
|
|
78
|
+
cluster_name=self.cluster_name))
|
|
72
79
|
self.state = self.ProvisionStatus.PULLING_DOCKER_IMAGES
|
|
73
80
|
if ('Status: Downloaded newer image' in log_line and
|
|
74
81
|
self.state == self.ProvisionStatus.PULLING_DOCKER_IMAGES):
|
|
75
82
|
self.status_display.update(
|
|
76
83
|
ux_utils.spinner_message(
|
|
77
|
-
'Launching - Preparing SkyPilot runtime',
|
|
84
|
+
'Launching - Preparing SkyPilot runtime',
|
|
85
|
+
self.log_path,
|
|
86
|
+
cluster_name=self.cluster_name))
|
|
78
87
|
self.state = self.ProvisionStatus.RUNTIME_SETUP
|
|
79
88
|
|
|
80
89
|
def __exit__(self, except_type: Optional[Type[BaseException]],
|
sky/utils/resources_utils.py
CHANGED
|
@@ -5,7 +5,7 @@ import itertools
|
|
|
5
5
|
import json
|
|
6
6
|
import math
|
|
7
7
|
import typing
|
|
8
|
-
from typing import Dict, List, Optional, Set, Union
|
|
8
|
+
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
|
9
9
|
|
|
10
10
|
from sky import skypilot_config
|
|
11
11
|
from sky.skylet import constants
|
|
@@ -435,3 +435,27 @@ def parse_time_minutes(time: str) -> int:
|
|
|
435
435
|
continue
|
|
436
436
|
|
|
437
437
|
raise ValueError(f'Invalid time format: {time}')
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
def normalize_any_of_resources_config(
|
|
441
|
+
any_of: List[Dict[str, Any]]) -> Tuple[str, ...]:
|
|
442
|
+
"""Normalize a list of any_of resources config to a canonical form.
|
|
443
|
+
|
|
444
|
+
Args:
|
|
445
|
+
any_of: A list of any_of resources config.
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
A normalized tuple representation that can be compared for equality.
|
|
449
|
+
Two lists with the same resource configurations in different orders
|
|
450
|
+
will produce the same normalized result.
|
|
451
|
+
"""
|
|
452
|
+
if not any_of:
|
|
453
|
+
return tuple()
|
|
454
|
+
|
|
455
|
+
# Convert each config to JSON string with sorted keys, then sort the list
|
|
456
|
+
normalized_configs = [
|
|
457
|
+
json.dumps(config, sort_keys=True, separators=(',', ':'))
|
|
458
|
+
for config in any_of
|
|
459
|
+
]
|
|
460
|
+
|
|
461
|
+
return tuple(sorted(normalized_configs))
|
sky/utils/schemas.py
CHANGED
|
@@ -1205,6 +1205,9 @@ def get_config_schema():
|
|
|
1205
1205
|
'disk_encrypted': {
|
|
1206
1206
|
'type': 'boolean',
|
|
1207
1207
|
},
|
|
1208
|
+
'ssh_user': {
|
|
1209
|
+
'type': 'string',
|
|
1210
|
+
},
|
|
1208
1211
|
'security_group_name':
|
|
1209
1212
|
(_PROPERTY_NAME_OR_CLUSTER_NAME_TO_PROPERTY),
|
|
1210
1213
|
'vpc_name': {
|
|
@@ -1532,6 +1535,9 @@ def get_config_schema():
|
|
|
1532
1535
|
'requests_retention_hours': {
|
|
1533
1536
|
'type': 'integer',
|
|
1534
1537
|
},
|
|
1538
|
+
'cluster_event_retention_hours': {
|
|
1539
|
+
'type': 'number',
|
|
1540
|
+
},
|
|
1535
1541
|
}
|
|
1536
1542
|
}
|
|
1537
1543
|
|
sky/utils/ux_utils.py
CHANGED
|
@@ -26,9 +26,16 @@ BOLD = '\033[1m'
|
|
|
26
26
|
RESET_BOLD = '\033[0m'
|
|
27
27
|
|
|
28
28
|
# Log path hint in the spinner during launching
|
|
29
|
+
# (old, kept for backward compatibility)
|
|
29
30
|
_LOG_PATH_HINT = (f'{colorama.Style.DIM}View logs: sky api logs -l '
|
|
30
31
|
'{log_path}'
|
|
31
32
|
f'{colorama.Style.RESET_ALL}')
|
|
33
|
+
# Log hint: recommend sky logs --provision <cluster_name>
|
|
34
|
+
_PROVISION_LOG_HINT = (
|
|
35
|
+
f'{colorama.Style.DIM}View logs: '
|
|
36
|
+
f'{BOLD}sky logs --provision {{cluster_name}}{RESET_BOLD}'
|
|
37
|
+
f'{colorama.Style.RESET_ALL}')
|
|
38
|
+
# Legacy path hint retained for local-only cases where we don't have cluster
|
|
32
39
|
_LOG_PATH_HINT_LOCAL = (f'{colorama.Style.DIM}View logs: '
|
|
33
40
|
'{log_path}'
|
|
34
41
|
f'{colorama.Style.RESET_ALL}')
|
|
@@ -126,7 +133,10 @@ class RedirectOutputForProcess:
|
|
|
126
133
|
|
|
127
134
|
def log_path_hint(log_path: Union[str, 'pathlib.Path'],
|
|
128
135
|
is_local: bool = False) -> str:
|
|
129
|
-
"""Gets the log path hint for the given log path.
|
|
136
|
+
"""Gets the log path hint for the given log path.
|
|
137
|
+
|
|
138
|
+
Kept for backward compatibility when only paths are available.
|
|
139
|
+
"""
|
|
130
140
|
log_path = str(log_path)
|
|
131
141
|
expanded_home = os.path.expanduser('~')
|
|
132
142
|
if log_path.startswith(expanded_home):
|
|
@@ -139,6 +149,12 @@ def log_path_hint(log_path: Union[str, 'pathlib.Path'],
|
|
|
139
149
|
return _LOG_PATH_HINT.format(log_path=log_path)
|
|
140
150
|
|
|
141
151
|
|
|
152
|
+
def provision_hint(cluster_name: Optional[str]) -> Optional[str]:
|
|
153
|
+
if not cluster_name:
|
|
154
|
+
return None
|
|
155
|
+
return _PROVISION_LOG_HINT.format(cluster_name=cluster_name)
|
|
156
|
+
|
|
157
|
+
|
|
142
158
|
def starting_message(message: str) -> str:
|
|
143
159
|
"""Gets the starting message for the given message."""
|
|
144
160
|
# We have to reset the color before the message, because sometimes if a
|
|
@@ -150,7 +166,8 @@ def starting_message(message: str) -> str:
|
|
|
150
166
|
def finishing_message(message: str,
|
|
151
167
|
log_path: Optional[Union[str, 'pathlib.Path']] = None,
|
|
152
168
|
is_local: bool = False,
|
|
153
|
-
follow_up_message: Optional[str] = None
|
|
169
|
+
follow_up_message: Optional[str] = None,
|
|
170
|
+
cluster_name: Optional[str] = None) -> str:
|
|
154
171
|
"""Gets the finishing message for the given message.
|
|
155
172
|
|
|
156
173
|
Args:
|
|
@@ -168,6 +185,9 @@ def finishing_message(message: str,
|
|
|
168
185
|
success_prefix = (f'{colorama.Style.RESET_ALL}{colorama.Fore.GREEN}✓ '
|
|
169
186
|
f'{message}{colorama.Style.RESET_ALL}{follow_up_message}'
|
|
170
187
|
f'{colorama.Style.RESET_ALL}')
|
|
188
|
+
hint = provision_hint(cluster_name)
|
|
189
|
+
if hint:
|
|
190
|
+
return f'{success_prefix} {hint}'
|
|
171
191
|
if log_path is None:
|
|
172
192
|
return success_prefix
|
|
173
193
|
path_hint = log_path_hint(log_path, is_local)
|
|
@@ -176,13 +196,17 @@ def finishing_message(message: str,
|
|
|
176
196
|
|
|
177
197
|
def error_message(message: str,
|
|
178
198
|
log_path: Optional[Union[str, 'pathlib.Path']] = None,
|
|
179
|
-
is_local: bool = False
|
|
199
|
+
is_local: bool = False,
|
|
200
|
+
cluster_name: Optional[str] = None) -> str:
|
|
180
201
|
"""Gets the error message for the given message."""
|
|
181
202
|
# We have to reset the color before the message, because sometimes if a
|
|
182
203
|
# previous spinner with dimmed color overflows in a narrow terminal, the
|
|
183
204
|
# color might be messed up.
|
|
184
205
|
error_prefix = (f'{colorama.Style.RESET_ALL}{colorama.Fore.RED}⨯'
|
|
185
206
|
f'{colorama.Style.RESET_ALL} {message}')
|
|
207
|
+
hint = provision_hint(cluster_name)
|
|
208
|
+
if hint:
|
|
209
|
+
return f'{error_prefix} {hint}'
|
|
186
210
|
if log_path is None:
|
|
187
211
|
return error_prefix
|
|
188
212
|
path_hint = log_path_hint(log_path, is_local)
|
|
@@ -200,9 +224,16 @@ def retry_message(message: str) -> str:
|
|
|
200
224
|
|
|
201
225
|
def spinner_message(message: str,
|
|
202
226
|
log_path: Optional[Union[str, 'pathlib.Path']] = None,
|
|
203
|
-
is_local: bool = False
|
|
204
|
-
|
|
227
|
+
is_local: bool = False,
|
|
228
|
+
cluster_name: Optional[str] = None) -> str:
|
|
229
|
+
"""Gets the spinner message for the given message and log path.
|
|
230
|
+
|
|
231
|
+
If cluster_name is provided, recommend `sky logs --provision <cluster>`.
|
|
232
|
+
"""
|
|
205
233
|
colored_spinner = f'[bold cyan]{message}[/]'
|
|
234
|
+
hint = provision_hint(cluster_name)
|
|
235
|
+
if hint:
|
|
236
|
+
return f'{colored_spinner} {hint}'
|
|
206
237
|
if log_path is None:
|
|
207
238
|
return colored_spinner
|
|
208
239
|
path_hint = log_path_hint(log_path, is_local)
|
sky/volumes/server/core.py
CHANGED
|
@@ -7,12 +7,12 @@ import uuid
|
|
|
7
7
|
|
|
8
8
|
import filelock
|
|
9
9
|
|
|
10
|
-
import sky
|
|
11
10
|
from sky import global_user_state
|
|
12
11
|
from sky import models
|
|
13
12
|
from sky import provision
|
|
14
13
|
from sky import sky_logging
|
|
15
14
|
from sky.utils import common_utils
|
|
15
|
+
from sky.utils import registry
|
|
16
16
|
from sky.utils import rich_utils
|
|
17
17
|
from sky.utils import status_lib
|
|
18
18
|
from sky.utils import ux_utils
|
|
@@ -180,7 +180,7 @@ def volume_apply(name: str, volume_type: str, cloud: str, region: Optional[str],
|
|
|
180
180
|
with rich_utils.safe_status(ux_utils.spinner_message('Creating volume')):
|
|
181
181
|
# Reuse the method for cluster name on cloud to
|
|
182
182
|
# generate the storage name on cloud.
|
|
183
|
-
cloud_obj =
|
|
183
|
+
cloud_obj = registry.CLOUD_REGISTRY.from_str(cloud)
|
|
184
184
|
assert cloud_obj is not None
|
|
185
185
|
name_uuid = str(uuid.uuid4())[:6]
|
|
186
186
|
name_on_cloud = common_utils.make_cluster_name_on_cloud(
|
sky/volumes/server/server.py
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import fastapi
|
|
4
4
|
|
|
5
|
-
import sky
|
|
6
5
|
from sky import clouds
|
|
7
6
|
from sky import sky_logging
|
|
8
7
|
from sky.server.requests import executor
|
|
9
8
|
from sky.server.requests import payloads
|
|
10
9
|
from sky.server.requests import requests as requests_lib
|
|
10
|
+
from sky.utils import registry
|
|
11
11
|
from sky.utils import volume
|
|
12
12
|
from sky.volumes.server import core
|
|
13
13
|
|
|
@@ -55,7 +55,7 @@ async def volume_apply(request: fastapi.Request,
|
|
|
55
55
|
if volume_type not in supported_volume_types:
|
|
56
56
|
raise fastapi.HTTPException(
|
|
57
57
|
status_code=400, detail=f'Invalid volume type: {volume_type}')
|
|
58
|
-
cloud =
|
|
58
|
+
cloud = registry.CLOUD_REGISTRY.from_str(volume_cloud)
|
|
59
59
|
if cloud is None:
|
|
60
60
|
raise fastapi.HTTPException(status_code=400,
|
|
61
61
|
detail=f'Invalid cloud: {volume_cloud}')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: skypilot-nightly
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev20250815
|
|
4
4
|
Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
|
|
5
5
|
Author: SkyPilot Team
|
|
6
6
|
License: Apache 2.0
|
|
@@ -104,9 +104,8 @@ Provides-Extra: ssh
|
|
|
104
104
|
Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "ssh"
|
|
105
105
|
Requires-Dist: websockets; extra == "ssh"
|
|
106
106
|
Provides-Extra: remote
|
|
107
|
-
Requires-Dist: grpcio
|
|
108
|
-
Requires-Dist:
|
|
109
|
-
Requires-Dist: protobuf!=3.19.5,>=3.15.3; extra == "remote"
|
|
107
|
+
Requires-Dist: grpcio>=1.63.0; extra == "remote"
|
|
108
|
+
Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "remote"
|
|
110
109
|
Provides-Extra: runpod
|
|
111
110
|
Requires-Dist: runpod>=1.6.1; extra == "runpod"
|
|
112
111
|
Provides-Extra: fluidstack
|
|
@@ -169,9 +168,8 @@ Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
|
|
|
169
168
|
Requires-Dist: websockets; extra == "all"
|
|
170
169
|
Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
|
|
171
170
|
Requires-Dist: websockets; extra == "all"
|
|
172
|
-
Requires-Dist: grpcio
|
|
173
|
-
Requires-Dist:
|
|
174
|
-
Requires-Dist: protobuf!=3.19.5,>=3.15.3; extra == "all"
|
|
171
|
+
Requires-Dist: grpcio>=1.63.0; extra == "all"
|
|
172
|
+
Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
|
|
175
173
|
Requires-Dist: runpod>=1.6.1; extra == "all"
|
|
176
174
|
Requires-Dist: cudo-compute>=0.1.10; extra == "all"
|
|
177
175
|
Requires-Dist: pydo>=0.3.0; extra == "all"
|