skypilot-nightly 1.0.0.dev20250311__tar.gz → 1.0.0.dev20250312__tar.gz
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.
- {skypilot_nightly-1.0.0.dev20250311/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250312}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/__init__.py +2 -2
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/nebius.py +11 -1
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/backend_utils.py +38 -15
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/cloud_vm_ray_backend.py +17 -52
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/nebius.py +8 -6
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/exceptions.py +11 -3
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/utils.py +1 -1
- skypilot_nightly-1.0.0.dev20250312/sky/server/requests/event_loop.py +31 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/executor.py +50 -22
- skypilot_nightly-1.0.0.dev20250312/sky/server/requests/preconditions.py +174 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/requests.py +42 -3
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/server.py +29 -8
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/stream_utils.py +9 -6
- skypilot_nightly-1.0.0.dev20250312/sky/server/uvicorn.py +81 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/accelerator_registry.py +1 -1
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/subprocess_utils.py +56 -1
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312/skypilot_nightly.egg-info}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/SOURCES.txt +3 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/README.md +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/pyproject.toml +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/setup.cfg +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/cloudflare.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/docker.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/admin_policy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/authentication.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/local_docker_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/wheel_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/benchmark_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/benchmark_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/check.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/cloud_stores.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/paperspace.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/scp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/aws_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/azure_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/do_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/oci_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/scp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/vast_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/aws_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/azure_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/gcp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/oci_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/scp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/data_transfer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/data_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/mounting_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/storage_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/execution.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/dashboard.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/static/favicon.ico +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/templates/index.html +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/recovery_strategy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/scheduler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/dashboard_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/models.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/optimizer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/azure-config-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_machine_type.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_wrapper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/instance_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/mig_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/instance_setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/network.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/network_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/query_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/provisioner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/commands.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/pods.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/cls_api_client.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/custom_script.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/id_generator.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/service_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/ssl_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/vapiconnect.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/vim_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/vsphere_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/resources.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/autoscalers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/load_balancer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/load_balancing_policies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/replica_managers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/serve_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/serve_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/service.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/service_spec.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/html/log.html +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/payloads.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/queues/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/queues/mp_queue.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/decoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/encoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/dependencies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/sky_logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/attempt_skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/autostop_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/configs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/events.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/job_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/log_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/log_lib.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/cli.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/updater.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/worker.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/subprocess_daemon.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skypilot_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/task.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/aws-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/azure-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/cudo-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/do-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/fluidstack-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/gcp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/ibm-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/jobs-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/lambda-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/local-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/nebius-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/oci-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/paperspace-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/runpod-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/scp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/vast-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/vsphere-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/websocket_proxy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/usage_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/admin_policy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/annotations.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cli_utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cli_utils/status_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cluster_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/command_runner.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/common_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/config_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/control_master_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/controller_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/dag_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/db_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/env_options.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/create_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/delete_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/generate_kind_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/gpu_labeler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/rsync_helper.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes_enums.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/log_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/message_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/resources_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/rich_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/schemas.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/status_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/timeline.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/ux_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/validator.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/requires.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/top_level.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_api.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_jobs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_jobs_and_serve.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_list_accelerators.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_optimizer_dryruns.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_optimizer_random_dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_serve_autoscaler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_smoke.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_wheels.py +0 -0
- {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_yaml_parser.py +0 -0
@@ -5,7 +5,7 @@ from typing import Optional
|
|
5
5
|
import urllib.request
|
6
6
|
|
7
7
|
# Replaced with the current commit when building the wheels.
|
8
|
-
_SKYPILOT_COMMIT_SHA = '
|
8
|
+
_SKYPILOT_COMMIT_SHA = '78a42b6e733bbc29b68efe0e9c79191eaaca9fcd'
|
9
9
|
|
10
10
|
|
11
11
|
def _get_git_commit():
|
@@ -35,7 +35,7 @@ def _get_git_commit():
|
|
35
35
|
|
36
36
|
|
37
37
|
__commit__ = _get_git_commit()
|
38
|
-
__version__ = '1.0.0.
|
38
|
+
__version__ = '1.0.0.dev20250312'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
{skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/nebius.py
RENAMED
@@ -6,9 +6,11 @@ from sky.adaptors import common
|
|
6
6
|
NEBIUS_TENANT_ID_FILENAME = 'NEBIUS_TENANT_ID.txt'
|
7
7
|
NEBIUS_IAM_TOKEN_FILENAME = 'NEBIUS_IAM_TOKEN.txt'
|
8
8
|
NEBIUS_PROJECT_ID_FILENAME = 'NEBIUS_PROJECT_ID.txt'
|
9
|
+
NEBIUS_CREDENTIALS_FILENAME = 'credentials.json'
|
9
10
|
NEBIUS_TENANT_ID_PATH = '~/.nebius/' + NEBIUS_TENANT_ID_FILENAME
|
10
11
|
NEBIUS_IAM_TOKEN_PATH = '~/.nebius/' + NEBIUS_IAM_TOKEN_FILENAME
|
11
12
|
NEBIUS_PROJECT_ID_PATH = '~/.nebius/' + NEBIUS_PROJECT_ID_FILENAME
|
13
|
+
NEBIUS_CREDENTIALS_PATH = '~/.nebius/' + NEBIUS_CREDENTIALS_FILENAME
|
12
14
|
|
13
15
|
MAX_RETRIES_TO_DISK_CREATE = 120
|
14
16
|
MAX_RETRIES_TO_INSTANCE_STOP = 120
|
@@ -72,6 +74,11 @@ def get_iam_token():
|
|
72
74
|
return _iam_token
|
73
75
|
|
74
76
|
|
77
|
+
def is_token_or_cred_file_exist():
|
78
|
+
return (os.path.exists(os.path.expanduser(NEBIUS_IAM_TOKEN_PATH)) or
|
79
|
+
os.path.exists(os.path.expanduser(NEBIUS_CREDENTIALS_PATH)))
|
80
|
+
|
81
|
+
|
75
82
|
def get_project_id():
|
76
83
|
global _project_id
|
77
84
|
if _project_id is None:
|
@@ -97,4 +104,7 @@ def get_tenant_id():
|
|
97
104
|
|
98
105
|
|
99
106
|
def sdk():
|
100
|
-
|
107
|
+
if get_iam_token() is not None:
|
108
|
+
return nebius.sdk.SDK(credentials=get_iam_token())
|
109
|
+
return nebius.sdk.SDK(
|
110
|
+
credentials_file_name=os.path.expanduser(NEBIUS_CREDENTIALS_PATH))
|
@@ -1802,6 +1802,21 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
|
|
1802
1802
|
status == status_lib.ClusterStatus.UP for status in node_statuses) and
|
1803
1803
|
len(node_statuses) == handle.launched_nodes)
|
1804
1804
|
|
1805
|
+
def get_node_counts_from_ray_status(
|
1806
|
+
runner: command_runner.CommandRunner) -> Tuple[int, int, str, str]:
|
1807
|
+
rc, output, stderr = runner.run(
|
1808
|
+
instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND,
|
1809
|
+
stream_logs=False,
|
1810
|
+
require_outputs=True,
|
1811
|
+
separate_stderr=True)
|
1812
|
+
if rc:
|
1813
|
+
raise RuntimeError(
|
1814
|
+
f'Refreshing status ({cluster_name!r}): Failed to check '
|
1815
|
+
f'ray cluster\'s healthiness with '
|
1816
|
+
f'{instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND}.\n'
|
1817
|
+
f'-- stdout --\n{output}\n-- stderr --\n{stderr}')
|
1818
|
+
return (*_count_healthy_nodes_from_ray(output), output, stderr)
|
1819
|
+
|
1805
1820
|
def run_ray_status_to_check_ray_cluster_healthy() -> bool:
|
1806
1821
|
try:
|
1807
1822
|
# NOTE: fetching the IPs is very slow as it calls into
|
@@ -1822,26 +1837,34 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
|
|
1822
1837
|
raise exceptions.FetchClusterInfoError(
|
1823
1838
|
reason=exceptions.FetchClusterInfoError.Reason.HEAD)
|
1824
1839
|
head_runner = runners[0]
|
1825
|
-
rc, output, stderr = head_runner.run(
|
1826
|
-
instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND,
|
1827
|
-
stream_logs=False,
|
1828
|
-
require_outputs=True,
|
1829
|
-
separate_stderr=True)
|
1830
|
-
if rc:
|
1831
|
-
raise RuntimeError(
|
1832
|
-
f'Refreshing status ({cluster_name!r}): Failed to check '
|
1833
|
-
f'ray cluster\'s healthiness with '
|
1834
|
-
f'{instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND}.\n'
|
1835
|
-
f'-- stdout --\n{output}\n-- stderr --\n{stderr}')
|
1836
1840
|
|
1837
|
-
ready_head, ready_workers = _count_healthy_nodes_from_ray(output)
|
1838
1841
|
total_nodes = handle.launched_nodes * handle.num_ips_per_node
|
1839
|
-
|
1840
|
-
|
1842
|
+
|
1843
|
+
for i in range(5):
|
1844
|
+
ready_head, ready_workers, output, stderr = (
|
1845
|
+
get_node_counts_from_ray_status(head_runner))
|
1846
|
+
if ready_head + ready_workers == total_nodes:
|
1847
|
+
return True
|
1848
|
+
logger.debug(f'Refreshing status ({cluster_name!r}) attempt '
|
1849
|
+
f'{i}: ray status not showing all nodes '
|
1850
|
+
f'({ready_head + ready_workers}/{total_nodes});\n'
|
1851
|
+
f'output:\n{output}\nstderr:\n{stderr}')
|
1852
|
+
|
1853
|
+
# If cluster JUST started, maybe not all the nodes have shown
|
1854
|
+
# up. Try again for a few seconds.
|
1855
|
+
# Note: We are okay with this performance hit because it's very
|
1856
|
+
# rare to normally hit this case. It requires:
|
1857
|
+
# - All the instances in the cluster are up on the cloud side
|
1858
|
+
# (not preempted), but
|
1859
|
+
# - The ray cluster is somehow degraded so not all instances are
|
1860
|
+
# showing up
|
1861
|
+
time.sleep(1)
|
1862
|
+
|
1841
1863
|
raise RuntimeError(
|
1842
1864
|
f'Refreshing status ({cluster_name!r}): ray status not showing '
|
1843
1865
|
f'all nodes ({ready_head + ready_workers}/'
|
1844
|
-
f'{total_nodes})
|
1866
|
+
f'{total_nodes});\noutput:\n{output}\nstderr:\n{stderr}')
|
1867
|
+
|
1845
1868
|
except exceptions.FetchClusterInfoError:
|
1846
1869
|
logger.debug(
|
1847
1870
|
f'Refreshing status ({cluster_name!r}) failed to get IPs.')
|
@@ -772,32 +772,6 @@ class FailoverCloudErrorHandlerV1:
|
|
772
772
|
setattr(e, 'detailed_reason', detailed_reason)
|
773
773
|
raise e
|
774
774
|
|
775
|
-
@staticmethod
|
776
|
-
def _lambda_handler(blocked_resources: Set['resources_lib.Resources'],
|
777
|
-
launchable_resources: 'resources_lib.Resources',
|
778
|
-
region: 'clouds.Region',
|
779
|
-
zones: Optional[List['clouds.Zone']], stdout: str,
|
780
|
-
stderr: str):
|
781
|
-
del region, zones # Unused.
|
782
|
-
errors = FailoverCloudErrorHandlerV1._handle_errors(
|
783
|
-
stdout,
|
784
|
-
stderr,
|
785
|
-
is_error_str_known=lambda x: 'LambdaCloudError:' in x.strip())
|
786
|
-
messages = '\n '.join(errors)
|
787
|
-
style = colorama.Style
|
788
|
-
logger.warning(f' {style.DIM}{messages}{style.RESET_ALL}')
|
789
|
-
_add_to_blocked_resources(blocked_resources,
|
790
|
-
launchable_resources.copy(zone=None))
|
791
|
-
|
792
|
-
# Sometimes, LambdaCloudError will list available regions.
|
793
|
-
for e in errors:
|
794
|
-
if e.find('Regions with capacity available:') != -1:
|
795
|
-
for r in service_catalog.regions('lambda'):
|
796
|
-
if e.find(r.name) == -1:
|
797
|
-
_add_to_blocked_resources(
|
798
|
-
blocked_resources,
|
799
|
-
launchable_resources.copy(region=r.name, zone=None))
|
800
|
-
|
801
775
|
@staticmethod
|
802
776
|
def _scp_handler(blocked_resources: Set['resources_lib.Resources'],
|
803
777
|
launchable_resources: 'resources_lib.Resources',
|
@@ -846,32 +820,6 @@ class FailoverCloudErrorHandlerV1:
|
|
846
820
|
_add_to_blocked_resources(blocked_resources,
|
847
821
|
launchable_resources.copy(zone=zone.name))
|
848
822
|
|
849
|
-
# Apr, 2023 by Hysun(hysun.he@oracle.com): Added support for OCI
|
850
|
-
@staticmethod
|
851
|
-
def _oci_handler(blocked_resources: Set['resources_lib.Resources'],
|
852
|
-
launchable_resources: 'resources_lib.Resources',
|
853
|
-
region: 'clouds.Region',
|
854
|
-
zones: Optional[List['clouds.Zone']], stdout: str,
|
855
|
-
stderr: str):
|
856
|
-
known_service_errors = [
|
857
|
-
'NotAuthorizedOrNotFound', 'CannotParseRequest', 'InternalError',
|
858
|
-
'LimitExceeded', 'NotAuthenticated'
|
859
|
-
]
|
860
|
-
errors = FailoverCloudErrorHandlerV1._handle_errors(
|
861
|
-
stdout, stderr, lambda x: 'VcnSubnetNotFound' in x.strip() or
|
862
|
-
('oci.exceptions.ServiceError' in x.strip() and any(
|
863
|
-
known_err in x.strip() for known_err in known_service_errors)))
|
864
|
-
logger.warning(f'Got error(s) in {region.name}:')
|
865
|
-
messages = '\n\t'.join(errors)
|
866
|
-
style = colorama.Style
|
867
|
-
logger.warning(f'{style.DIM}\t{messages}{style.RESET_ALL}')
|
868
|
-
|
869
|
-
if zones is not None:
|
870
|
-
for zone in zones:
|
871
|
-
_add_to_blocked_resources(
|
872
|
-
blocked_resources,
|
873
|
-
launchable_resources.copy(zone=zone.name))
|
874
|
-
|
875
823
|
@staticmethod
|
876
824
|
def update_blocklist_on_error(
|
877
825
|
blocked_resources: Set['resources_lib.Resources'],
|
@@ -1123,6 +1071,23 @@ class FailoverCloudErrorHandlerV2:
|
|
1123
1071
|
blocked_resources,
|
1124
1072
|
launchable_resources.copy(zone=zone.name))
|
1125
1073
|
|
1074
|
+
@staticmethod
|
1075
|
+
def _lambda_handler(blocked_resources: Set['resources_lib.Resources'],
|
1076
|
+
launchable_resources: 'resources_lib.Resources',
|
1077
|
+
region: 'clouds.Region',
|
1078
|
+
zones: Optional[List['clouds.Zone']], error: Exception):
|
1079
|
+
output = str(error)
|
1080
|
+
# Sometimes, lambda cloud error will list available regions.
|
1081
|
+
if output.find('Regions with capacity available:') != -1:
|
1082
|
+
for r in service_catalog.regions('lambda'):
|
1083
|
+
if output.find(r.name) == -1:
|
1084
|
+
_add_to_blocked_resources(
|
1085
|
+
blocked_resources,
|
1086
|
+
launchable_resources.copy(region=r.name, zone=None))
|
1087
|
+
else:
|
1088
|
+
FailoverCloudErrorHandlerV2._default_handler(
|
1089
|
+
blocked_resources, launchable_resources, region, zones, error)
|
1090
|
+
|
1126
1091
|
@staticmethod
|
1127
1092
|
def _default_handler(blocked_resources: Set['resources_lib.Resources'],
|
1128
1093
|
launchable_resources: 'resources_lib.Resources',
|
{skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/nebius.py
RENAMED
@@ -17,6 +17,7 @@ _CREDENTIAL_FILES = [
|
|
17
17
|
nebius.NEBIUS_TENANT_ID_FILENAME,
|
18
18
|
nebius.NEBIUS_IAM_TOKEN_FILENAME,
|
19
19
|
nebius.NEBIUS_PROJECT_ID_FILENAME,
|
20
|
+
nebius.NEBIUS_CREDENTIALS_FILENAME
|
20
21
|
]
|
21
22
|
|
22
23
|
|
@@ -252,15 +253,16 @@ class Nebius(clouds.Cloud):
|
|
252
253
|
def check_credentials(cls) -> Tuple[bool, Optional[str]]:
|
253
254
|
""" Verify that the user has valid credentials for Nebius. """
|
254
255
|
logging.debug('Nebius cloud check credentials')
|
255
|
-
|
256
|
-
|
257
|
-
|
256
|
+
token_cred_msg = (' Credentials can be set up by running: \n'\
|
257
|
+
f' $ nebius iam get-access-token > {nebius.NEBIUS_IAM_TOKEN_PATH} \n'\
|
258
|
+
' or generate ~/.nebius/credentials.json') # pylint: disable=line-too-long
|
259
|
+
|
258
260
|
tenant_msg = (' Copy your tenat ID from the web console and save it to file \n' # pylint: disable=line-too-long
|
259
261
|
f' $ echo $NEBIUS_TENANT_ID_PATH > {nebius.NEBIUS_TENANT_ID_PATH} \n' # pylint: disable=line-too-long
|
260
262
|
' Or if you have 1 tenant you can run:\n' # pylint: disable=line-too-long
|
261
263
|
f' $ nebius --format json iam whoami|jq -r \'.user_profile.tenants[0].tenant_id\' > {nebius.NEBIUS_TENANT_ID_PATH} \n') # pylint: disable=line-too-long
|
262
|
-
if
|
263
|
-
return False, f'{
|
264
|
+
if not nebius.is_token_or_cred_file_exist():
|
265
|
+
return False, f'{token_cred_msg}'
|
264
266
|
sdk = nebius.sdk()
|
265
267
|
tenant_id = nebius.get_tenant_id()
|
266
268
|
if tenant_id is None:
|
@@ -272,7 +274,7 @@ class Nebius(clouds.Cloud):
|
|
272
274
|
except nebius.request_error() as e:
|
273
275
|
return False, (
|
274
276
|
f'{e.status} \n' # First line is indented by 4 spaces
|
275
|
-
f'{
|
277
|
+
f'{token_cred_msg}'
|
276
278
|
f'{tenant_msg}')
|
277
279
|
return True, None
|
278
280
|
|
@@ -28,12 +28,19 @@ GIT_FATAL_EXIT_CODE = 128
|
|
28
28
|
ARCH_NOT_SUPPORTED_EXIT_CODE = 133
|
29
29
|
|
30
30
|
|
31
|
-
def is_safe_exception(exc:
|
31
|
+
def is_safe_exception(exc: BaseException) -> bool:
|
32
32
|
"""Returns True if the exception is safe to send to clients.
|
33
33
|
|
34
34
|
Safe exceptions are:
|
35
35
|
1. Built-in exceptions
|
36
36
|
2. SkyPilot's own exceptions
|
37
|
+
|
38
|
+
Args:
|
39
|
+
exc: The exception to check, accept BaseException to handle SystemExit
|
40
|
+
and KeyboardInterrupt.
|
41
|
+
|
42
|
+
Returns:
|
43
|
+
True if the exception is safe to send to clients, False otherwise.
|
37
44
|
"""
|
38
45
|
module = type(exc).__module__
|
39
46
|
|
@@ -48,7 +55,7 @@ def is_safe_exception(exc: Exception) -> bool:
|
|
48
55
|
return False
|
49
56
|
|
50
57
|
|
51
|
-
def wrap_exception(exc:
|
58
|
+
def wrap_exception(exc: BaseException) -> BaseException:
|
52
59
|
"""Wraps non-safe exceptions into SkyPilot exceptions
|
53
60
|
|
54
61
|
This is used to wrap exceptions that are not safe to deserialize at clients.
|
@@ -64,7 +71,8 @@ def wrap_exception(exc: Exception) -> Exception:
|
|
64
71
|
error_type=type(exc).__name__)
|
65
72
|
|
66
73
|
|
67
|
-
|
74
|
+
# Accept BaseException to handle SystemExit and KeyboardInterrupt
|
75
|
+
def serialize_exception(e: BaseException) -> Dict[str, Any]:
|
68
76
|
"""Serialize the exception.
|
69
77
|
|
70
78
|
This function also wraps any unsafe exceptions (e.g., cloud exceptions)
|
@@ -853,7 +853,7 @@ def get_accelerator_label_key_value(
|
|
853
853
|
for label, value in label_list:
|
854
854
|
if (label_formatter.match_label_key(label) and
|
855
855
|
label_formatter.get_accelerator_from_label_value(
|
856
|
-
value) == acc_type):
|
856
|
+
value).lower() == acc_type.lower()):
|
857
857
|
if is_tpu_on_gke(acc_type):
|
858
858
|
assert isinstance(label_formatter,
|
859
859
|
GKELabelFormatter)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
"""Executor event loop to process tasks in coroutines."""
|
2
|
+
import asyncio
|
3
|
+
import concurrent.futures
|
4
|
+
import threading
|
5
|
+
from typing import Coroutine, Optional
|
6
|
+
|
7
|
+
# Dedicated event loop for requests, isolated with the event loop managed
|
8
|
+
# by uvicorn. This is responsible for light-weight async tasks or sub-tasks,
|
9
|
+
# refer to `executor.py` for more details about cooperation between the event
|
10
|
+
# loop and executor process pool.
|
11
|
+
_EVENT_LOOP: Optional[asyncio.AbstractEventLoop] = None
|
12
|
+
_LOCK = threading.Lock()
|
13
|
+
|
14
|
+
|
15
|
+
def run(coro: Coroutine) -> concurrent.futures.Future:
|
16
|
+
"""Run a coroutine asynchronously in the request event loop."""
|
17
|
+
return asyncio.run_coroutine_threadsafe(coro, get_event_loop())
|
18
|
+
|
19
|
+
|
20
|
+
def get_event_loop() -> asyncio.AbstractEventLoop:
|
21
|
+
"""Open and get the event loop."""
|
22
|
+
global _EVENT_LOOP
|
23
|
+
if _EVENT_LOOP is not None and not _EVENT_LOOP.is_closed():
|
24
|
+
return _EVENT_LOOP
|
25
|
+
with _LOCK:
|
26
|
+
if _EVENT_LOOP is None or _EVENT_LOOP.is_closed():
|
27
|
+
_EVENT_LOOP = asyncio.new_event_loop()
|
28
|
+
loop_thread = threading.Thread(target=_EVENT_LOOP.run_forever,
|
29
|
+
daemon=True)
|
30
|
+
loop_thread.start()
|
31
|
+
return _EVENT_LOOP
|
@@ -27,8 +27,8 @@ import os
|
|
27
27
|
import queue as queue_lib
|
28
28
|
import signal
|
29
29
|
import sys
|
30
|
+
import threading
|
30
31
|
import time
|
31
|
-
import traceback
|
32
32
|
import typing
|
33
33
|
from typing import Any, Callable, Generator, List, Optional, TextIO, Tuple
|
34
34
|
|
@@ -41,11 +41,13 @@ from sky import skypilot_config
|
|
41
41
|
from sky.server import common as server_common
|
42
42
|
from sky.server import constants as server_constants
|
43
43
|
from sky.server.requests import payloads
|
44
|
+
from sky.server.requests import preconditions
|
44
45
|
from sky.server.requests import requests as api_requests
|
45
46
|
from sky.server.requests.queues import mp_queue
|
46
47
|
from sky.skylet import constants
|
47
48
|
from sky.utils import annotations
|
48
49
|
from sky.utils import common_utils
|
50
|
+
from sky.utils import subprocess_utils
|
49
51
|
from sky.utils import timeline
|
50
52
|
from sky.utils import ux_utils
|
51
53
|
|
@@ -262,13 +264,7 @@ def _request_execution_wrapper(request_id: str,
|
|
262
264
|
_restore_output(original_stdout, original_stderr)
|
263
265
|
return
|
264
266
|
except (Exception, SystemExit) as e: # pylint: disable=broad-except
|
265
|
-
|
266
|
-
stacktrace = traceback.format_exc()
|
267
|
-
setattr(e, 'stacktrace', stacktrace)
|
268
|
-
with api_requests.update_request(request_id) as request_task:
|
269
|
-
assert request_task is not None, request_id
|
270
|
-
request_task.status = api_requests.RequestStatus.FAILED
|
271
|
-
request_task.set_error(e)
|
267
|
+
api_requests.set_request_failed(request_id, e)
|
272
268
|
_restore_output(original_stdout, original_stderr)
|
273
269
|
logger.info(f'Request {request_id} failed due to '
|
274
270
|
f'{common_utils.format_exception(e)}')
|
@@ -283,16 +279,37 @@ def _request_execution_wrapper(request_id: str,
|
|
283
279
|
logger.info(f'Request {request_id} finished')
|
284
280
|
|
285
281
|
|
286
|
-
def schedule_request(
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
282
|
+
def schedule_request(
|
283
|
+
request_id: str,
|
284
|
+
request_name: str,
|
285
|
+
request_body: payloads.RequestBody,
|
286
|
+
func: Callable[P, Any],
|
287
|
+
request_cluster_name: Optional[str] = None,
|
288
|
+
ignore_return_value: bool = False,
|
289
|
+
schedule_type: api_requests.ScheduleType = (
|
290
|
+
api_requests.ScheduleType.LONG),
|
291
|
+
is_skypilot_system: bool = False,
|
292
|
+
precondition: Optional[preconditions.Precondition] = None) -> None:
|
293
|
+
"""Enqueue a request to the request queue.
|
294
|
+
|
295
|
+
Args:
|
296
|
+
request_id: ID of the request.
|
297
|
+
request_name: Name of the request type, e.g. "sky.launch".
|
298
|
+
request_body: The request body containing parameters and environment
|
299
|
+
variables.
|
300
|
+
func: The function to execute when the request is processed.
|
301
|
+
request_cluster_name: The name of the cluster associated with this
|
302
|
+
request, if any.
|
303
|
+
ignore_return_value: If True, the return value of the function will be
|
304
|
+
ignored.
|
305
|
+
schedule_type: The type of scheduling to use for this request, refer to
|
306
|
+
`api_requests.ScheduleType` for more details.
|
307
|
+
is_skypilot_system: Denote whether the request is from SkyPilot system.
|
308
|
+
precondition: If a precondition is provided, the request will only be
|
309
|
+
scheduled for execution when the precondition is met (returns True).
|
310
|
+
The precondition is waited asynchronously and does not block the
|
311
|
+
caller.
|
312
|
+
"""
|
296
313
|
user_id = request_body.env_vars[constants.USER_ID_ENV_VAR]
|
297
314
|
if is_skypilot_system:
|
298
315
|
user_id = server_constants.SKYPILOT_SYSTEM_USER_ID
|
@@ -314,10 +331,17 @@ def schedule_request(request_id: str,
|
|
314
331
|
return
|
315
332
|
|
316
333
|
request.log_path.touch()
|
317
|
-
input_tuple = (request_id, ignore_return_value)
|
318
334
|
|
319
|
-
|
320
|
-
|
335
|
+
def enqueue():
|
336
|
+
input_tuple = (request_id, ignore_return_value)
|
337
|
+
logger.info(f'Queuing request: {request_id}')
|
338
|
+
_get_queue(schedule_type).put(input_tuple)
|
339
|
+
|
340
|
+
if precondition is not None:
|
341
|
+
# Wait async to avoid blocking caller.
|
342
|
+
precondition.wait_async(on_condition_met=enqueue)
|
343
|
+
else:
|
344
|
+
enqueue()
|
321
345
|
|
322
346
|
|
323
347
|
def executor_initializer(proc_group: str):
|
@@ -431,13 +455,17 @@ def start(deploy: bool) -> List[multiprocessing.Process]:
|
|
431
455
|
|
432
456
|
logger.info('Request queues created')
|
433
457
|
|
458
|
+
long_workers = []
|
434
459
|
for worker_id in range(max_parallel_for_long):
|
435
460
|
worker = RequestWorker(id=worker_id,
|
436
461
|
schedule_type=api_requests.ScheduleType.LONG)
|
437
462
|
worker_proc = multiprocessing.Process(target=request_worker,
|
438
463
|
args=(worker, 1))
|
439
|
-
|
464
|
+
long_workers.append(worker_proc)
|
440
465
|
sub_procs.append(worker_proc)
|
466
|
+
threading.Thread(target=subprocess_utils.slow_start_processes,
|
467
|
+
args=(long_workers,),
|
468
|
+
daemon=True).start()
|
441
469
|
|
442
470
|
# Start a worker for short requests.
|
443
471
|
worker = RequestWorker(id=1, schedule_type=api_requests.ScheduleType.SHORT)
|
@@ -0,0 +1,174 @@
|
|
1
|
+
"""Precondition for a request to be executed.
|
2
|
+
|
3
|
+
Preconditions are introduced so that:
|
4
|
+
- Wait for precondition does not block executor process, which is expensive;
|
5
|
+
- Cross requests knowledge (e.g. waiting for other requests to be completed)
|
6
|
+
can be handled at precondition level, instead of invading the execution
|
7
|
+
logic of specific requests.
|
8
|
+
"""
|
9
|
+
import abc
|
10
|
+
import asyncio
|
11
|
+
import time
|
12
|
+
from typing import Callable, Optional, Tuple
|
13
|
+
|
14
|
+
from sky import exceptions
|
15
|
+
from sky import global_user_state
|
16
|
+
from sky import sky_logging
|
17
|
+
from sky.server.requests import event_loop
|
18
|
+
from sky.server.requests import requests as api_requests
|
19
|
+
from sky.utils import common_utils
|
20
|
+
from sky.utils import status_lib
|
21
|
+
|
22
|
+
# The default interval seconds to check the precondition.
|
23
|
+
_PRECONDITION_CHECK_INTERVAL = 1
|
24
|
+
# The default timeout seconds to wait for the precondition to be met.
|
25
|
+
_PRECONDITION_TIMEOUT = 60 * 60
|
26
|
+
|
27
|
+
logger = sky_logging.init_logger(__name__)
|
28
|
+
|
29
|
+
|
30
|
+
class Precondition(abc.ABC):
|
31
|
+
"""Abstract base class for a precondition for a request to be executed.
|
32
|
+
|
33
|
+
A Precondition can be waited in either of the following ways:
|
34
|
+
- await Precondition: wait for the precondition to be met.
|
35
|
+
- Precondition.wait_async: wait for the precondition to be met in background
|
36
|
+
and execute the given callback on met.
|
37
|
+
"""
|
38
|
+
|
39
|
+
def __init__(self,
|
40
|
+
request_id: str,
|
41
|
+
check_interval: float = _PRECONDITION_CHECK_INTERVAL,
|
42
|
+
timeout: float = _PRECONDITION_TIMEOUT):
|
43
|
+
self.request_id = request_id
|
44
|
+
self.check_interval = check_interval
|
45
|
+
self.timeout = timeout
|
46
|
+
|
47
|
+
def __await__(self):
|
48
|
+
"""Make Precondition awaitable."""
|
49
|
+
return self._wait().__await__()
|
50
|
+
|
51
|
+
def wait_async(
|
52
|
+
self,
|
53
|
+
on_condition_met: Optional[Callable[[], None]] = None) -> None:
|
54
|
+
"""Wait precondition asynchronously and execute the callback on met."""
|
55
|
+
|
56
|
+
async def wait_with_callback():
|
57
|
+
met = await self
|
58
|
+
if met and on_condition_met is not None:
|
59
|
+
on_condition_met()
|
60
|
+
|
61
|
+
event_loop.run(wait_with_callback())
|
62
|
+
|
63
|
+
@abc.abstractmethod
|
64
|
+
async def check(self) -> Tuple[bool, Optional[str]]:
|
65
|
+
"""Check if the precondition is met.
|
66
|
+
|
67
|
+
Note that compared to _request_execution_wrapper, the env vars and
|
68
|
+
skypilot config here are not overridden since the lack of process
|
69
|
+
isolation, which may cause issues if the check accidentally depends on
|
70
|
+
these. Make sure the check function is independent of the request
|
71
|
+
environment.
|
72
|
+
TODO(aylei): a new request context isolation mechanism is needed to
|
73
|
+
enable more tasks/sub-tasks to be processed in coroutines or threads.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
A tuple of (bool, Optional[str]).
|
77
|
+
The bool indicates if the precondition is met.
|
78
|
+
The str is the current status of the precondition if any.
|
79
|
+
"""
|
80
|
+
raise NotImplementedError
|
81
|
+
|
82
|
+
async def _wait(self) -> bool:
|
83
|
+
"""Wait for the precondition to be met.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
on_condition_met: Callback to execute when the precondition is met.
|
87
|
+
"""
|
88
|
+
start_time = time.time()
|
89
|
+
last_status_msg = ''
|
90
|
+
while True:
|
91
|
+
if self.timeout > 0 and time.time() - start_time > self.timeout:
|
92
|
+
# Cancel the request on timeout.
|
93
|
+
api_requests.set_request_failed(
|
94
|
+
self.request_id,
|
95
|
+
exceptions.RequestCancelled(
|
96
|
+
f'Request {self.request_id} precondition wait timed '
|
97
|
+
f'out after {self.timeout}s'))
|
98
|
+
return False
|
99
|
+
|
100
|
+
# Check if the request has been cancelled
|
101
|
+
request = api_requests.get_request(self.request_id)
|
102
|
+
if request is None:
|
103
|
+
logger.error(f'Request {self.request_id} not found')
|
104
|
+
return False
|
105
|
+
if request.status == api_requests.RequestStatus.CANCELLED:
|
106
|
+
logger.debug(f'Request {self.request_id} cancelled')
|
107
|
+
return False
|
108
|
+
|
109
|
+
try:
|
110
|
+
met, status_msg = await self.check()
|
111
|
+
if met:
|
112
|
+
return True
|
113
|
+
if status_msg is not None and status_msg != last_status_msg:
|
114
|
+
# Update the status message if it has changed.
|
115
|
+
with api_requests.update_request(self.request_id) as req:
|
116
|
+
assert req is not None, self.request_id
|
117
|
+
req.status_msg = status_msg
|
118
|
+
last_status_msg = status_msg
|
119
|
+
except (Exception, SystemExit, KeyboardInterrupt) as e: # pylint: disable=broad-except
|
120
|
+
api_requests.set_request_failed(self.request_id, e)
|
121
|
+
logger.info(f'Request {self.request_id} failed due to '
|
122
|
+
f'{common_utils.format_exception(e)}')
|
123
|
+
return False
|
124
|
+
|
125
|
+
await asyncio.sleep(self.check_interval)
|
126
|
+
|
127
|
+
|
128
|
+
class ClusterStartCompletePrecondition(Precondition):
|
129
|
+
"""Whether the start process of a cluster is complete.
|
130
|
+
|
131
|
+
This condition only waits the start process of a cluster to complete, e.g.
|
132
|
+
`sky launch` or `sky start`.
|
133
|
+
For cluster that has been started but not in UP status, bypass the waiting
|
134
|
+
in favor of:
|
135
|
+
- allowing the task to refresh cluster status from cloud vendor;
|
136
|
+
- unified error message in task handlers.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
request_id: The request ID of the task.
|
140
|
+
cluster_name: The name of the cluster to wait for.
|
141
|
+
"""
|
142
|
+
|
143
|
+
def __init__(self, request_id: str, cluster_name: str, **kwargs):
|
144
|
+
super().__init__(request_id=request_id, **kwargs)
|
145
|
+
self.cluster_name = cluster_name
|
146
|
+
|
147
|
+
async def check(self) -> Tuple[bool, Optional[str]]:
|
148
|
+
cluster_record = global_user_state.get_cluster_from_name(
|
149
|
+
self.cluster_name)
|
150
|
+
if (cluster_record and
|
151
|
+
cluster_record['status'] is status_lib.ClusterStatus.UP):
|
152
|
+
# Shortcut for started clusters, ignore cluster not found
|
153
|
+
# since the cluster record might not yet be created by the
|
154
|
+
# launch task.
|
155
|
+
return True, None
|
156
|
+
# Check if there is a task starting the cluster, we do not check
|
157
|
+
# SUCCEEDED requests since successfully launched cluster can be
|
158
|
+
# restarted later on.
|
159
|
+
# Note that since the requests are not persistent yet between restarts,
|
160
|
+
# a cluster might be started in halfway and requests are lost.
|
161
|
+
# We unify these situations into a single state: the process of starting
|
162
|
+
# the cluster is done (either normally or abnormally) but cluster is not
|
163
|
+
# in UP status.
|
164
|
+
requests = api_requests.get_request_tasks(
|
165
|
+
status=[
|
166
|
+
api_requests.RequestStatus.RUNNING,
|
167
|
+
api_requests.RequestStatus.PENDING
|
168
|
+
],
|
169
|
+
include_request_names=['sky.launch', 'sky.start'],
|
170
|
+
cluster_names=[self.cluster_name])
|
171
|
+
if len(requests) == 0:
|
172
|
+
# No runnning or pending tasks, the start process is done.
|
173
|
+
return True, None
|
174
|
+
return False, f'Waiting for cluster {self.cluster_name} to be UP.'
|