skypilot-nightly 1.0.0.dev20250909__py3-none-any.whl → 1.0.0.dev20250910__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 +19 -4
- sky/backends/backend_utils.py +35 -1
- sky/backends/cloud_vm_ray_backend.py +2 -2
- sky/client/sdk.py +20 -0
- sky/client/sdk_async.py +18 -16
- sky/clouds/aws.py +3 -1
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-d4fabc08788e14af.js → webpack-1d7e11230da3ca89.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 +5 -1
- sky/execution.py +21 -14
- sky/jobs/constants.py +3 -0
- sky/jobs/controller.py +732 -310
- sky/jobs/recovery_strategy.py +251 -129
- sky/jobs/scheduler.py +247 -174
- sky/jobs/server/core.py +20 -4
- sky/jobs/server/utils.py +2 -2
- sky/jobs/state.py +702 -511
- sky/jobs/utils.py +94 -39
- sky/provision/aws/config.py +4 -1
- sky/provision/gcp/config.py +6 -1
- sky/provision/kubernetes/utils.py +17 -8
- sky/provision/provisioner.py +1 -0
- sky/serve/replica_managers.py +0 -7
- sky/serve/serve_utils.py +5 -0
- sky/serve/server/impl.py +1 -2
- sky/serve/service.py +0 -2
- sky/server/common.py +8 -3
- sky/server/config.py +43 -24
- sky/server/constants.py +1 -0
- sky/server/daemons.py +7 -11
- sky/server/requests/serializers/encoders.py +1 -1
- sky/server/server.py +8 -1
- sky/setup_files/dependencies.py +4 -2
- sky/skylet/attempt_skylet.py +1 -0
- sky/skylet/constants.py +3 -1
- sky/skylet/events.py +2 -10
- sky/utils/command_runner.pyi +3 -3
- sky/utils/common_utils.py +11 -1
- sky/utils/controller_utils.py +5 -0
- sky/utils/db/db_utils.py +31 -2
- sky/utils/rich_utils.py +3 -1
- sky/utils/subprocess_utils.py +9 -0
- sky/volumes/volume.py +2 -0
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/METADATA +39 -37
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/RECORD +67 -67
- /sky/dashboard/out/_next/static/{eWytLgin5zvayQw3Xk46m → 3SYxqNGnvvPS8h3gdD2T7}/_buildManifest.js +0 -0
- /sky/dashboard/out/_next/static/{eWytLgin5zvayQw3Xk46m → 3SYxqNGnvvPS8h3gdD2T7}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/top_level.txt +0 -0
sky/server/daemons.py
CHANGED
|
@@ -11,6 +11,7 @@ from sky.utils import annotations
|
|
|
11
11
|
from sky.utils import common
|
|
12
12
|
from sky.utils import common_utils
|
|
13
13
|
from sky.utils import env_options
|
|
14
|
+
from sky.utils import subprocess_utils
|
|
14
15
|
from sky.utils import timeline
|
|
15
16
|
from sky.utils import ux_utils
|
|
16
17
|
|
|
@@ -74,6 +75,10 @@ class InternalRequestDaemon:
|
|
|
74
75
|
# using too much memory.
|
|
75
76
|
annotations.clear_request_level_cache()
|
|
76
77
|
timeline.save_timeline()
|
|
78
|
+
# Kill all children processes related to this request.
|
|
79
|
+
# Each executor handles a single request, so we can safely
|
|
80
|
+
# kill all children processes related to this request.
|
|
81
|
+
subprocess_utils.kill_children_processes()
|
|
77
82
|
common_utils.release_memory()
|
|
78
83
|
except Exception: # pylint: disable=broad-except
|
|
79
84
|
# It is OK to fail to run the event, as the event is not
|
|
@@ -123,21 +128,16 @@ def managed_job_status_refresh_event():
|
|
|
123
128
|
"""Refresh the managed job status for controller consolidation mode."""
|
|
124
129
|
# pylint: disable=import-outside-toplevel
|
|
125
130
|
from sky.jobs import utils as managed_job_utils
|
|
126
|
-
from sky.utils import controller_utils
|
|
127
131
|
|
|
128
132
|
# We run the recovery logic before starting the event loop as those two are
|
|
129
133
|
# conflicting. Check PERSISTENT_RUN_RESTARTING_SIGNAL_FILE for details.
|
|
130
|
-
|
|
131
|
-
controller_utils.Controllers.JOBS_CONTROLLER.value.cluster_name):
|
|
132
|
-
managed_job_utils.ha_recovery_for_consolidation_mode()
|
|
134
|
+
managed_job_utils.ha_recovery_for_consolidation_mode()
|
|
133
135
|
|
|
134
136
|
# After recovery, we start the event loop.
|
|
135
137
|
from sky.skylet import events
|
|
136
138
|
refresh_event = events.ManagedJobEvent()
|
|
137
|
-
scheduling_event = events.ManagedJobSchedulingEvent()
|
|
138
139
|
logger.info('=== Running managed job event ===')
|
|
139
140
|
refresh_event.run()
|
|
140
|
-
scheduling_event.run()
|
|
141
141
|
time.sleep(events.EVENT_CHECKING_INTERVAL_SECONDS)
|
|
142
142
|
|
|
143
143
|
|
|
@@ -152,14 +152,10 @@ def _serve_status_refresh_event(pool: bool):
|
|
|
152
152
|
"""Refresh the sky serve status for controller consolidation mode."""
|
|
153
153
|
# pylint: disable=import-outside-toplevel
|
|
154
154
|
from sky.serve import serve_utils
|
|
155
|
-
from sky.utils import controller_utils
|
|
156
155
|
|
|
157
156
|
# We run the recovery logic before starting the event loop as those two are
|
|
158
157
|
# conflicting. Check PERSISTENT_RUN_RESTARTING_SIGNAL_FILE for details.
|
|
159
|
-
|
|
160
|
-
if controller_utils.high_availability_specified(
|
|
161
|
-
controller.value.cluster_name):
|
|
162
|
-
serve_utils.ha_recovery_for_consolidation_mode(pool=pool)
|
|
158
|
+
serve_utils.ha_recovery_for_consolidation_mode(pool=pool)
|
|
163
159
|
|
|
164
160
|
# After recovery, we start the event loop.
|
|
165
161
|
from sky.skylet import events
|
|
@@ -131,7 +131,7 @@ def encode_jobs_queue(jobs: List[dict],) -> List[Dict[str, Any]]:
|
|
|
131
131
|
def encode_jobs_queue_v2(
|
|
132
132
|
jobs_or_tuple) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
|
|
133
133
|
# Support returning either a plain jobs list or a (jobs, total) tuple
|
|
134
|
-
status_counts = {}
|
|
134
|
+
status_counts: Dict[str, int] = {}
|
|
135
135
|
if isinstance(jobs_or_tuple, tuple):
|
|
136
136
|
if len(jobs_or_tuple) == 2:
|
|
137
137
|
jobs, total = jobs_or_tuple
|
sky/server/server.py
CHANGED
|
@@ -625,6 +625,9 @@ app.include_router(volumes_rest.router, prefix='/volumes', tags=['volumes'])
|
|
|
625
625
|
app.include_router(ssh_node_pools_rest.router,
|
|
626
626
|
prefix='/ssh_node_pools',
|
|
627
627
|
tags=['ssh_node_pools'])
|
|
628
|
+
# increase the resource limit for the server
|
|
629
|
+
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
|
|
630
|
+
resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard))
|
|
628
631
|
|
|
629
632
|
# Increase the limit of files we can open to our hard limit. This fixes bugs
|
|
630
633
|
# where we can not aquire file locks or open enough logs and the API server
|
|
@@ -1826,7 +1829,7 @@ async def all_contexts(request: fastapi.Request) -> None:
|
|
|
1826
1829
|
async def gpu_metrics() -> fastapi.Response:
|
|
1827
1830
|
"""Gets the GPU metrics from multiple external k8s clusters"""
|
|
1828
1831
|
contexts = core.get_all_contexts()
|
|
1829
|
-
all_metrics = []
|
|
1832
|
+
all_metrics: List[str] = []
|
|
1830
1833
|
successful_contexts = 0
|
|
1831
1834
|
|
|
1832
1835
|
tasks = [
|
|
@@ -1841,6 +1844,10 @@ async def gpu_metrics() -> fastapi.Response:
|
|
|
1841
1844
|
if isinstance(result, Exception):
|
|
1842
1845
|
logger.error(
|
|
1843
1846
|
f'Failed to get metrics for context {contexts[i]}: {result}')
|
|
1847
|
+
elif isinstance(result, BaseException):
|
|
1848
|
+
# Avoid changing behavior for non-Exception BaseExceptions
|
|
1849
|
+
# like KeyboardInterrupt/SystemExit: re-raise them.
|
|
1850
|
+
raise result
|
|
1844
1851
|
else:
|
|
1845
1852
|
metrics_text = result
|
|
1846
1853
|
all_metrics.append(metrics_text)
|
sky/setup_files/dependencies.py
CHANGED
|
@@ -63,6 +63,8 @@ install_requires = [
|
|
|
63
63
|
'setproctitle',
|
|
64
64
|
'sqlalchemy',
|
|
65
65
|
'psycopg2-binary',
|
|
66
|
+
'aiosqlite',
|
|
67
|
+
'asyncpg',
|
|
66
68
|
# TODO(hailong): These three dependencies should be removed after we make
|
|
67
69
|
# the client-side actually not importing them.
|
|
68
70
|
'casbin',
|
|
@@ -108,9 +110,9 @@ server_dependencies = [
|
|
|
108
110
|
local_ray = [
|
|
109
111
|
# Lower version of ray will cause dependency conflict for
|
|
110
112
|
# click/grpcio/protobuf.
|
|
111
|
-
#
|
|
113
|
+
# Ray 2.6.1+ resolved cluster launcher bugs and grpcio issues on Apple Silicon.
|
|
112
114
|
# https://github.com/ray-project/ray/releases/tag/ray-2.6.1
|
|
113
|
-
'ray[default] >= 2.
|
|
115
|
+
'ray[default] >= 2.6.1',
|
|
114
116
|
]
|
|
115
117
|
|
|
116
118
|
remote = [
|
sky/skylet/attempt_skylet.py
CHANGED
|
@@ -12,6 +12,7 @@ def restart_skylet():
|
|
|
12
12
|
# Kills old skylet if it is running.
|
|
13
13
|
# TODO(zhwu): make the killing graceful, e.g., use a signal to tell
|
|
14
14
|
# skylet to exit, instead of directly killing it.
|
|
15
|
+
|
|
15
16
|
subprocess.run(
|
|
16
17
|
# We use -m to grep instead of {constants.SKY_PYTHON_CMD} -m to grep
|
|
17
18
|
# because need to handle the backward compatibility of the old skylet
|
sky/skylet/constants.py
CHANGED
|
@@ -91,7 +91,7 @@ TASK_ID_LIST_ENV_VAR = f'{SKYPILOT_ENV_VAR_PREFIX}TASK_IDS'
|
|
|
91
91
|
# cluster yaml is updated.
|
|
92
92
|
#
|
|
93
93
|
# TODO(zongheng,zhanghao): make the upgrading of skylet automatic?
|
|
94
|
-
SKYLET_VERSION = '
|
|
94
|
+
SKYLET_VERSION = '18'
|
|
95
95
|
# The version of the lib files that skylet/jobs use. Whenever there is an API
|
|
96
96
|
# change for the job_lib or log_lib, we need to bump this version, so that the
|
|
97
97
|
# user can be notified to update their SkyPilot version on the remote cluster.
|
|
@@ -374,6 +374,7 @@ OVERRIDEABLE_CONFIG_KEYS_IN_TASK: List[Tuple[str, ...]] = [
|
|
|
374
374
|
('ssh', 'pod_config'),
|
|
375
375
|
('kubernetes', 'custom_metadata'),
|
|
376
376
|
('kubernetes', 'pod_config'),
|
|
377
|
+
('kubernetes', 'context_configs'),
|
|
377
378
|
('kubernetes', 'provision_timeout'),
|
|
378
379
|
('kubernetes', 'dws'),
|
|
379
380
|
('kubernetes', 'kueue'),
|
|
@@ -421,6 +422,7 @@ SKY_USER_FILE_PATH = '~/.sky/generated'
|
|
|
421
422
|
# TODO(cooperc): Update all env vars to begin with SKYPILOT_ or SKYPILOT_SERVER_
|
|
422
423
|
# Environment variable that is set to 'true' if this is a skypilot server.
|
|
423
424
|
ENV_VAR_IS_SKYPILOT_SERVER = 'IS_SKYPILOT_SERVER'
|
|
425
|
+
OVERRIDE_CONSOLIDATION_MODE = 'IS_SKYPILOT_JOB_CONTROLLER'
|
|
424
426
|
|
|
425
427
|
# Environment variable that is set to 'true' if metrics are enabled.
|
|
426
428
|
ENV_VAR_SERVER_METRICS_ENABLED = 'SKY_API_SERVER_METRICS_ENABLED'
|
sky/skylet/events.py
CHANGED
|
@@ -11,7 +11,7 @@ import psutil
|
|
|
11
11
|
from sky import clouds
|
|
12
12
|
from sky import sky_logging
|
|
13
13
|
from sky.backends import cloud_vm_ray_backend
|
|
14
|
-
from sky.jobs import scheduler
|
|
14
|
+
from sky.jobs import scheduler
|
|
15
15
|
from sky.jobs import state as managed_job_state
|
|
16
16
|
from sky.jobs import utils as managed_job_utils
|
|
17
17
|
from sky.serve import serve_utils
|
|
@@ -76,15 +76,7 @@ class ManagedJobEvent(SkyletEvent):
|
|
|
76
76
|
def _run(self):
|
|
77
77
|
logger.info('=== Updating managed job status ===')
|
|
78
78
|
managed_job_utils.update_managed_jobs_statuses()
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class ManagedJobSchedulingEvent(SkyletEvent):
|
|
82
|
-
"""Skylet event for scheduling managed jobs."""
|
|
83
|
-
EVENT_INTERVAL_SECONDS = 20
|
|
84
|
-
|
|
85
|
-
def _run(self):
|
|
86
|
-
logger.info('=== Scheduling next jobs ===')
|
|
87
|
-
managed_job_scheduler.maybe_schedule_next_jobs()
|
|
79
|
+
scheduler.maybe_start_controllers()
|
|
88
80
|
|
|
89
81
|
|
|
90
82
|
class ServiceUpdateEvent(SkyletEvent):
|
sky/utils/command_runner.pyi
CHANGED
sky/utils/common_utils.py
CHANGED
|
@@ -996,7 +996,17 @@ def get_mem_size_gb() -> float:
|
|
|
996
996
|
except ValueError as e:
|
|
997
997
|
with ux_utils.print_exception_no_traceback():
|
|
998
998
|
raise ValueError(
|
|
999
|
-
f'Failed to parse the memory size from {mem_size}'
|
|
999
|
+
f'Failed to parse the memory size from {mem_size} (GB)'
|
|
1000
|
+
) from e
|
|
1001
|
+
mem_size = os.getenv('SKYPILOT_POD_MEMORY_BYTES_LIMIT')
|
|
1002
|
+
if mem_size is not None:
|
|
1003
|
+
try:
|
|
1004
|
+
return float(mem_size) / (1024**3)
|
|
1005
|
+
except ValueError as e:
|
|
1006
|
+
with ux_utils.print_exception_no_traceback():
|
|
1007
|
+
raise ValueError(
|
|
1008
|
+
f'Failed to parse the memory size from {mem_size} (bytes)'
|
|
1009
|
+
) from e
|
|
1000
1010
|
return _mem_size_gb()
|
|
1001
1011
|
|
|
1002
1012
|
|
sky/utils/controller_utils.py
CHANGED
|
@@ -228,6 +228,11 @@ def get_controller_for_pool(pool: bool) -> Controllers:
|
|
|
228
228
|
def high_availability_specified(cluster_name: Optional[str]) -> bool:
|
|
229
229
|
"""Check if the controller high availability is specified in user config.
|
|
230
230
|
"""
|
|
231
|
+
# pylint: disable=import-outside-toplevel
|
|
232
|
+
from sky.jobs import utils as managed_job_utils
|
|
233
|
+
if managed_job_utils.is_consolidation_mode():
|
|
234
|
+
return True
|
|
235
|
+
|
|
231
236
|
controller = Controllers.from_name(cluster_name)
|
|
232
237
|
if controller is None:
|
|
233
238
|
return False
|
sky/utils/db/db_utils.py
CHANGED
|
@@ -7,12 +7,13 @@ import pathlib
|
|
|
7
7
|
import sqlite3
|
|
8
8
|
import threading
|
|
9
9
|
import typing
|
|
10
|
-
from typing import Any, Callable, Dict, Iterable, Optional
|
|
10
|
+
from typing import Any, Callable, Dict, Iterable, Literal, Optional, Union
|
|
11
11
|
|
|
12
12
|
import aiosqlite
|
|
13
13
|
import aiosqlite.context
|
|
14
14
|
import sqlalchemy
|
|
15
15
|
from sqlalchemy import exc as sqlalchemy_exc
|
|
16
|
+
from sqlalchemy.ext import asyncio as sqlalchemy_async
|
|
16
17
|
|
|
17
18
|
from sky import sky_logging
|
|
18
19
|
from sky.skylet import constants
|
|
@@ -375,11 +376,34 @@ def get_max_connections():
|
|
|
375
376
|
return _max_connections
|
|
376
377
|
|
|
377
378
|
|
|
378
|
-
|
|
379
|
+
@typing.overload
|
|
380
|
+
def get_engine(
|
|
381
|
+
db_name: str,
|
|
382
|
+
async_engine: Literal[False] = False) -> sqlalchemy.engine.Engine:
|
|
383
|
+
...
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
@typing.overload
|
|
387
|
+
def get_engine(db_name: str,
|
|
388
|
+
async_engine: Literal[True]) -> sqlalchemy_async.AsyncEngine:
|
|
389
|
+
...
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def get_engine(
|
|
393
|
+
db_name: str,
|
|
394
|
+
async_engine: bool = False
|
|
395
|
+
) -> Union[sqlalchemy.engine.Engine, sqlalchemy_async.AsyncEngine]:
|
|
379
396
|
conn_string = None
|
|
380
397
|
if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
|
|
381
398
|
conn_string = os.environ.get(constants.ENV_VAR_DB_CONNECTION_URI)
|
|
382
399
|
if conn_string:
|
|
400
|
+
if async_engine:
|
|
401
|
+
conn_string = conn_string.replace('postgresql://',
|
|
402
|
+
'postgresql+asyncpg://')
|
|
403
|
+
# This is an AsyncEngine, instead of a (normal, synchronous) Engine,
|
|
404
|
+
# so we should not put it in the cache. Instead, just return.
|
|
405
|
+
return sqlalchemy_async.create_async_engine(
|
|
406
|
+
conn_string, poolclass=sqlalchemy.NullPool)
|
|
383
407
|
with _db_creation_lock:
|
|
384
408
|
if conn_string not in _postgres_engine_cache:
|
|
385
409
|
if _max_connections == 0:
|
|
@@ -401,6 +425,11 @@ def get_engine(db_name: str):
|
|
|
401
425
|
else:
|
|
402
426
|
db_path = os.path.expanduser(f'~/.sky/{db_name}.db')
|
|
403
427
|
pathlib.Path(db_path).parents[0].mkdir(parents=True, exist_ok=True)
|
|
428
|
+
if async_engine:
|
|
429
|
+
# This is an AsyncEngine, instead of a (normal, synchronous) Engine,
|
|
430
|
+
# so we should not put it in the cache. Instead, just return.
|
|
431
|
+
return sqlalchemy_async.create_async_engine(
|
|
432
|
+
'sqlite+aiosqlite:///' + db_path, connect_args={'timeout': 30})
|
|
404
433
|
if db_path not in _sqlite_engine_cache:
|
|
405
434
|
_sqlite_engine_cache[db_path] = sqlalchemy.create_engine(
|
|
406
435
|
'sqlite:///' + db_path)
|
sky/utils/rich_utils.py
CHANGED
|
@@ -421,7 +421,7 @@ async def decode_rich_status_async(
|
|
|
421
421
|
undecoded_buffer = b''
|
|
422
422
|
|
|
423
423
|
# Iterate over the response content in chunks
|
|
424
|
-
async for chunk in response.content.
|
|
424
|
+
async for chunk, _ in response.content.iter_chunks():
|
|
425
425
|
if chunk is None:
|
|
426
426
|
return
|
|
427
427
|
|
|
@@ -481,6 +481,8 @@ async def decode_rich_status_async(
|
|
|
481
481
|
line = line[:-2] + '\n'
|
|
482
482
|
is_payload, line = message_utils.decode_payload(
|
|
483
483
|
line, raise_for_mismatch=False)
|
|
484
|
+
if line is None:
|
|
485
|
+
continue
|
|
484
486
|
control = None
|
|
485
487
|
if is_payload:
|
|
486
488
|
control, encoded_status = Control.decode(line)
|
sky/utils/subprocess_utils.py
CHANGED
|
@@ -437,3 +437,12 @@ def slow_start_processes(processes: List[Startable],
|
|
|
437
437
|
break
|
|
438
438
|
batch_size = min(batch_size * 2, max_batch_size)
|
|
439
439
|
time.sleep(delay)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def is_process_alive(pid: int) -> bool:
|
|
443
|
+
"""Check if a process is alive."""
|
|
444
|
+
try:
|
|
445
|
+
process = psutil.Process(pid)
|
|
446
|
+
return process.is_running()
|
|
447
|
+
except psutil.NoSuchProcess:
|
|
448
|
+
return False
|
sky/volumes/volume.py
CHANGED
|
@@ -150,6 +150,8 @@ class Volume:
|
|
|
150
150
|
self.region, self.zone = cloud_obj.validate_region_zone(
|
|
151
151
|
self.region, self.zone)
|
|
152
152
|
|
|
153
|
+
# Name must be set by factory before validation.
|
|
154
|
+
assert self.name is not None
|
|
153
155
|
valid, err_msg = cloud_obj.is_volume_name_valid(self.name)
|
|
154
156
|
if not valid:
|
|
155
157
|
raise ValueError(f'Invalid volume name: {err_msg}')
|
|
@@ -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.dev20250910
|
|
4
4
|
Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
|
|
5
5
|
Author: SkyPilot Team
|
|
6
6
|
License: Apache 2.0
|
|
@@ -53,6 +53,8 @@ Requires-Dist: httpx
|
|
|
53
53
|
Requires-Dist: setproctitle
|
|
54
54
|
Requires-Dist: sqlalchemy
|
|
55
55
|
Requires-Dist: psycopg2-binary
|
|
56
|
+
Requires-Dist: aiosqlite
|
|
57
|
+
Requires-Dist: asyncpg
|
|
56
58
|
Requires-Dist: casbin
|
|
57
59
|
Requires-Dist: sqlalchemy_adapter
|
|
58
60
|
Requires-Dist: prometheus_client>=0.8.0
|
|
@@ -88,10 +90,10 @@ Requires-Dist: ibm-cloud-sdk-core; extra == "ibm"
|
|
|
88
90
|
Requires-Dist: ibm-vpc; extra == "ibm"
|
|
89
91
|
Requires-Dist: ibm-platform-services>=0.48.0; extra == "ibm"
|
|
90
92
|
Requires-Dist: ibm-cos-sdk; extra == "ibm"
|
|
91
|
-
Requires-Dist: ray[default]
|
|
93
|
+
Requires-Dist: ray[default]>=2.6.1; extra == "ibm"
|
|
92
94
|
Provides-Extra: docker
|
|
93
95
|
Requires-Dist: docker; extra == "docker"
|
|
94
|
-
Requires-Dist: ray[default]
|
|
96
|
+
Requires-Dist: ray[default]>=2.6.1; extra == "docker"
|
|
95
97
|
Provides-Extra: lambda
|
|
96
98
|
Provides-Extra: cloudflare
|
|
97
99
|
Requires-Dist: awscli>=1.27.10; extra == "cloudflare"
|
|
@@ -99,7 +101,7 @@ Requires-Dist: botocore>=1.29.10; extra == "cloudflare"
|
|
|
99
101
|
Requires-Dist: boto3>=1.26.1; extra == "cloudflare"
|
|
100
102
|
Requires-Dist: colorama<0.4.5; extra == "cloudflare"
|
|
101
103
|
Provides-Extra: scp
|
|
102
|
-
Requires-Dist: ray[default]
|
|
104
|
+
Requires-Dist: ray[default]>=2.6.1; extra == "scp"
|
|
103
105
|
Provides-Extra: oci
|
|
104
106
|
Requires-Dist: oci; extra == "oci"
|
|
105
107
|
Provides-Extra: kubernetes
|
|
@@ -145,48 +147,48 @@ Requires-Dist: grpcio>=1.63.0; extra == "server"
|
|
|
145
147
|
Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
|
|
146
148
|
Requires-Dist: aiosqlite; extra == "server"
|
|
147
149
|
Provides-Extra: all
|
|
148
|
-
Requires-Dist: passlib; extra == "all"
|
|
149
|
-
Requires-Dist: boto3>=1.26.1; extra == "all"
|
|
150
|
-
Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
|
|
151
|
-
Requires-Dist: awscli>=1.27.10; extra == "all"
|
|
152
|
-
Requires-Dist: runpod>=1.6.1; extra == "all"
|
|
153
|
-
Requires-Dist: python-dateutil; extra == "all"
|
|
154
|
-
Requires-Dist: anyio; extra == "all"
|
|
155
|
-
Requires-Dist: oci; extra == "all"
|
|
156
|
-
Requires-Dist: ibm-vpc; extra == "all"
|
|
157
150
|
Requires-Dist: pyjwt; extra == "all"
|
|
158
|
-
Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
|
|
159
151
|
Requires-Dist: casbin; extra == "all"
|
|
160
|
-
Requires-Dist:
|
|
161
|
-
Requires-Dist:
|
|
152
|
+
Requires-Dist: colorama<0.4.5; extra == "all"
|
|
153
|
+
Requires-Dist: cudo-compute>=0.1.10; extra == "all"
|
|
154
|
+
Requires-Dist: python-dateutil; extra == "all"
|
|
155
|
+
Requires-Dist: ray[default]>=2.6.1; extra == "all"
|
|
156
|
+
Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
|
|
157
|
+
Requires-Dist: docker; extra == "all"
|
|
158
|
+
Requires-Dist: websockets; extra == "all"
|
|
159
|
+
Requires-Dist: awscli>=1.27.10; extra == "all"
|
|
160
|
+
Requires-Dist: aiosqlite; extra == "all"
|
|
161
|
+
Requires-Dist: ibm-vpc; extra == "all"
|
|
162
|
+
Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
|
|
162
163
|
Requires-Dist: azure-core>=1.31.0; extra == "all"
|
|
164
|
+
Requires-Dist: passlib; extra == "all"
|
|
165
|
+
Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
|
|
166
|
+
Requires-Dist: oci; extra == "all"
|
|
167
|
+
Requires-Dist: boto3>=1.26.1; extra == "all"
|
|
168
|
+
Requires-Dist: azure-core>=1.24.0; extra == "all"
|
|
163
169
|
Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
|
|
164
|
-
Requires-Dist:
|
|
165
|
-
Requires-Dist:
|
|
170
|
+
Requires-Dist: nebius>=0.2.47; extra == "all"
|
|
171
|
+
Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
|
|
166
172
|
Requires-Dist: google-cloud-storage; extra == "all"
|
|
167
|
-
Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
|
|
168
|
-
Requires-Dist: colorama<0.4.5; extra == "all"
|
|
169
|
-
Requires-Dist: azure-cli>=2.65.0; extra == "all"
|
|
170
|
-
Requires-Dist: grpcio>=1.63.0; extra == "all"
|
|
171
|
-
Requires-Dist: ibm-cloud-sdk-core; extra == "all"
|
|
172
|
-
Requires-Dist: msrestazure; extra == "all"
|
|
173
|
-
Requires-Dist: azure-identity>=1.19.0; extra == "all"
|
|
174
|
-
Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
|
|
175
173
|
Requires-Dist: msgraph-sdk; extra == "all"
|
|
176
174
|
Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
|
|
177
|
-
Requires-Dist:
|
|
178
|
-
Requires-Dist:
|
|
179
|
-
Requires-Dist:
|
|
180
|
-
Requires-Dist:
|
|
175
|
+
Requires-Dist: azure-common; extra == "all"
|
|
176
|
+
Requires-Dist: pydo>=0.3.0; extra == "all"
|
|
177
|
+
Requires-Dist: msrestazure; extra == "all"
|
|
178
|
+
Requires-Dist: anyio; extra == "all"
|
|
179
|
+
Requires-Dist: sqlalchemy_adapter; extra == "all"
|
|
181
180
|
Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
|
|
182
|
-
Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
|
|
183
|
-
Requires-Dist: websockets; extra == "all"
|
|
184
181
|
Requires-Dist: botocore>=1.29.10; extra == "all"
|
|
185
|
-
Requires-Dist:
|
|
186
|
-
Requires-Dist:
|
|
187
|
-
Requires-Dist:
|
|
188
|
-
Requires-Dist:
|
|
189
|
-
Requires-Dist:
|
|
182
|
+
Requires-Dist: ibm-cloud-sdk-core; extra == "all"
|
|
183
|
+
Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
|
|
184
|
+
Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
|
|
185
|
+
Requires-Dist: ibm-cos-sdk; extra == "all"
|
|
186
|
+
Requires-Dist: runpod>=1.6.1; extra == "all"
|
|
187
|
+
Requires-Dist: grpcio>=1.63.0; extra == "all"
|
|
188
|
+
Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
|
|
189
|
+
Requires-Dist: azure-identity>=1.19.0; extra == "all"
|
|
190
|
+
Requires-Dist: azure-cli>=2.65.0; extra == "all"
|
|
191
|
+
Requires-Dist: aiohttp; extra == "all"
|
|
190
192
|
Dynamic: author
|
|
191
193
|
Dynamic: classifier
|
|
192
194
|
Dynamic: description
|