skypilot-nightly 1.0.0.dev20250406__tar.gz → 1.0.0.dev20250408__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.dev20250406/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250408}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/__init__.py +2 -2
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/cloud_vm_ray_backend.py +1 -4
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/lambda_cloud.py +0 -1
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage_utils.py +10 -3
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/instance.py +101 -16
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/lambda_utils.py +84 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/executor.py +204 -126
- skypilot_nightly-1.0.0.dev20250408/sky/server/requests/process.py +212 -0
- skypilot_nightly-1.0.0.dev20250408/sky/server/requests/queues/local_queue.py +16 -0
- skypilot_nightly-1.0.0.dev20250408/sky/utils/atomic.py +52 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common_utils.py +2 -2
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/validator.py +1 -8
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408/skypilot_nightly.egg-info}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/SOURCES.txt +4 -0
- skypilot_nightly-1.0.0.dev20250408/tests/test_failover.py +101 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/README.md +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/pyproject.toml +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/setup.cfg +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cloudflare.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/docker.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/nebius.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/adaptors/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/admin_policy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/authentication.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/backend_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/local_docker_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/backends/wheel_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/benchmark/benchmark_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/check.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/client/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/client/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/cloud_stores.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/do.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/nebius.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/paperspace.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/scp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/aws_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/azure_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/do_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/oci_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/scp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vast_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/aws_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/azure_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/gcp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/oci_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/utils/scp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vast.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_transfer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/data_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/mounting_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/exceptions.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/execution.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/dashboard.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/static/favicon.ico +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/dashboard/templates/index.html +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/recovery_strategy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/scheduler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/dashboard_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/jobs/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/models.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/optimizer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/aws/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/azure-config-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/azure/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_machine_type.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/cudo_wrapper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/cudo/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/do/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/fluidstack/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/instance_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/gcp/mig_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/instance_setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/network_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/kubernetes/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/lambda_cloud/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/nebius/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/oci/query_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/paperspace/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/provisioner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/commands.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/api/pods.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/runpod/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vast/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_client.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/custom_script.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/id_generator.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/ssl_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vapiconnect.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/common/vim_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/provision/vsphere/vsphere_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/resources.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/autoscalers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/client/sdk.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/load_balancing_policies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/replica_managers.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/serve_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/service_spec.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/serve/spot_placer.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/html/log.html +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/event_loop.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/payloads.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/preconditions.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/queues/mp_queue.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/requests.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/decoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/requests/serializers/encoders.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/server.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/stream_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/server/uvicorn.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/dependencies.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/setup_files/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/sky_logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/attempt_skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/autostop_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/configs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/events.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/job_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/log_lib.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/providers/scp/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/cli.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/updater.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/ray_patches/worker.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skylet/subprocess_daemon.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/skypilot_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/task.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/aws-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/azure-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/cudo-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/do-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/fluidstack-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/gcp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/ibm-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/jobs-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/lambda-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/local-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/nebius-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/oci-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/paperspace-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/runpod-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/scp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vast-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/vsphere-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/templates/websocket_proxy.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/usage/usage_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/accelerator_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/admin_policy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/annotations.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cli_utils/status_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/cluster_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/command_runner.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/config_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/control_master_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/controller_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/dag_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/db_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/env_options.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/create_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/delete_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kind_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/gpu_labeler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/rsync_helper.sh +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/kubernetes_enums.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/log_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/message_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/resources_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_console_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/rich_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/schemas.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/status_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/subprocess_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/timeline.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/utils/ux_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/requires.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/skypilot_nightly.egg-info/top_level.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_api.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_jobs_and_serve.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_list_accelerators.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_dryruns.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_optimizer_random_dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_serve_autoscaler.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_smoke.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/tests/test_wheels.py +0 -0
- {skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/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 = 'e0674be528e87191ade88961c44c6449d01232fa'
|
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.dev20250408'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
@@ -655,12 +655,9 @@ class RayCodeGen:
|
|
655
655
|
rclone_flush_script = {rclone_flush_script!r}
|
656
656
|
if run_fn is not None:
|
657
657
|
script = run_fn({gang_scheduling_id}, gang_scheduling_id_to_ip)
|
658
|
-
if script is not None:
|
659
|
-
script += rclone_flush_script
|
660
|
-
else:
|
661
|
-
script = rclone_flush_script
|
662
658
|
|
663
659
|
if script is not None:
|
660
|
+
script += rclone_flush_script
|
664
661
|
sky_env_vars_dict['{constants.SKYPILOT_NUM_GPUS_PER_NODE}'] = {int(math.ceil(num_gpus))!r}
|
665
662
|
# Backward compatibility: Environment starting with `SKY_` is
|
666
663
|
# deprecated. Remove it in v0.9.0.
|
{skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/clouds/lambda_cloud.py
RENAMED
@@ -43,7 +43,6 @@ class Lambda(clouds.Cloud):
|
|
43
43
|
clouds.CloudImplementationFeatures.SPOT_INSTANCE: f'Spot instances are not supported in {_REPR}.',
|
44
44
|
clouds.CloudImplementationFeatures.IMAGE_ID: f'Specifying image ID is not supported in {_REPR}.',
|
45
45
|
clouds.CloudImplementationFeatures.CUSTOM_DISK_TIER: f'Custom disk tiers are not supported in {_REPR}.',
|
46
|
-
clouds.CloudImplementationFeatures.OPEN_PORTS: f'Opening ports is currently not supported on {_REPR}.',
|
47
46
|
clouds.CloudImplementationFeatures.HOST_CONTROLLERS: f'Host controllers are not supported in {_REPR}.',
|
48
47
|
}
|
49
48
|
|
{skypilot_nightly-1.0.0.dev20250406 → skypilot_nightly-1.0.0.dev20250408}/sky/data/storage_utils.py
RENAMED
@@ -227,6 +227,9 @@ def get_excluded_files(src_dir_path: str) -> List[str]:
|
|
227
227
|
expand_src_dir_path = os.path.expanduser(src_dir_path)
|
228
228
|
skyignore_path = os.path.join(expand_src_dir_path,
|
229
229
|
constants.SKY_IGNORE_FILE)
|
230
|
+
# Fail fast if the source is a file.
|
231
|
+
if os.path.isfile(expand_src_dir_path):
|
232
|
+
raise ValueError(f'{src_dir_path} is a file, not a directory.')
|
230
233
|
if os.path.exists(skyignore_path):
|
231
234
|
logger.debug(f' {colorama.Style.DIM}'
|
232
235
|
f'Excluded files to sync to cluster based on '
|
@@ -267,11 +270,15 @@ def zip_files_and_folders(items: List[str],
|
|
267
270
|
item = os.path.expanduser(item)
|
268
271
|
if not os.path.isfile(item) and not os.path.isdir(item):
|
269
272
|
raise ValueError(f'{item} does not exist.')
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
+
if os.path.isfile(item):
|
274
|
+
# Add the file to the zip archive even if it matches
|
275
|
+
# patterns in dot ignore files, as it was explicitly
|
276
|
+
# specified by user.
|
273
277
|
zipf.write(item)
|
274
278
|
elif os.path.isdir(item):
|
279
|
+
excluded_files = set([
|
280
|
+
os.path.join(item, f) for f in get_excluded_files(item)
|
281
|
+
])
|
275
282
|
for root, dirs, files in os.walk(item, followlinks=False):
|
276
283
|
# Modify dirs in-place to control os.walk()'s traversal
|
277
284
|
# behavior. This filters out excluded directories BEFORE
|
@@ -1,12 +1,13 @@
|
|
1
|
-
"""Lambda instance provisioning."""
|
1
|
+
"""Lambda Cloud instance provisioning."""
|
2
2
|
|
3
3
|
import time
|
4
4
|
from typing import Any, Dict, List, Optional
|
5
5
|
|
6
6
|
from sky import sky_logging
|
7
7
|
from sky.provision import common
|
8
|
-
|
8
|
+
from sky.provision.lambda_cloud import lambda_utils
|
9
9
|
from sky.utils import common_utils
|
10
|
+
from sky.utils import resources_utils
|
10
11
|
from sky.utils import status_lib
|
11
12
|
from sky.utils import ux_utils
|
12
13
|
|
@@ -248,18 +249,102 @@ def query_instances(
|
|
248
249
|
return statuses
|
249
250
|
|
250
251
|
|
251
|
-
def open_ports(
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
ports:
|
262
|
-
|
263
|
-
|
264
|
-
|
252
|
+
def open_ports(cluster_name_on_cloud: str,
|
253
|
+
ports: List[str],
|
254
|
+
provider_config: Optional[Dict[str, Any]] = None) -> None:
|
255
|
+
"""Open firewall ports for Lambda Cloud.
|
256
|
+
|
257
|
+
Args:
|
258
|
+
cluster_name_on_cloud: Cluster name on Lambda Cloud.
|
259
|
+
ports: List of ports to open.
|
260
|
+
provider_config: Lambda Cloud provider config. Contains the API key.
|
261
|
+
"""
|
262
|
+
if not ports:
|
263
|
+
return
|
264
|
+
|
265
|
+
# Skip port opening for us-south-1 region where it's not supported
|
266
|
+
region = None
|
267
|
+
if provider_config is not None:
|
268
|
+
region = provider_config.get('region')
|
269
|
+
|
270
|
+
# Skip port opening for us-south-1, as it's not supported by Lambda Cloud
|
271
|
+
# https://cloud.lambda.ai/api/v1/docs#get-/api/v1/firewall-rules
|
272
|
+
if region == 'us-south-1':
|
273
|
+
logger.warning(
|
274
|
+
f'Skipping port opening for cluster {cluster_name_on_cloud} in '
|
275
|
+
f'us-south-1 region, as firewall rules are not supported there.')
|
276
|
+
return
|
277
|
+
|
278
|
+
del provider_config, cluster_name_on_cloud # No longer needed
|
279
|
+
|
280
|
+
lambda_client = lambda_utils.LambdaCloudClient()
|
281
|
+
|
282
|
+
# Get existing rules to avoid duplicates
|
283
|
+
existing_rules = lambda_client.list_firewall_rules()
|
284
|
+
existing_ports = set()
|
285
|
+
for rule in existing_rules:
|
286
|
+
port_range = rule.get('port_range')
|
287
|
+
if rule.get('protocol') == 'tcp' and port_range is not None:
|
288
|
+
if len(port_range) == 1:
|
289
|
+
# For single ports
|
290
|
+
existing_ports.add(port_range[0])
|
291
|
+
elif len(port_range) == 2:
|
292
|
+
# For port ranges, add all ports in the range
|
293
|
+
existing_ports.update(range(port_range[0], port_range[1] + 1))
|
294
|
+
|
295
|
+
# Convert port strings to a set of individual ports
|
296
|
+
ports_to_open = resources_utils.port_ranges_to_set(ports)
|
297
|
+
|
298
|
+
# Remove ports that are already open
|
299
|
+
ports_to_open = ports_to_open - existing_ports
|
300
|
+
|
301
|
+
# If no ports need to be opened, return early
|
302
|
+
if not ports_to_open:
|
303
|
+
return
|
304
|
+
|
305
|
+
# Convert individual ports to consolidated ranges
|
306
|
+
port_ranges = resources_utils.port_set_to_ranges(ports_to_open)
|
307
|
+
|
308
|
+
# Open port ranges
|
309
|
+
for port_range in port_ranges:
|
310
|
+
if '-' in port_range:
|
311
|
+
# Handle range (e.g., "1000-1010")
|
312
|
+
start, end = map(int, port_range.split('-'))
|
313
|
+
logger.debug(f'Opening port range {port_range}/tcp')
|
314
|
+
try:
|
315
|
+
lambda_client.create_firewall_rule(port_range=[start, end],
|
316
|
+
protocol='tcp')
|
317
|
+
except lambda_utils.LambdaCloudError as e:
|
318
|
+
logger.warning(f'Failed to open port range {port_range}: {e}')
|
319
|
+
else:
|
320
|
+
# Handle single port
|
321
|
+
port = int(port_range)
|
322
|
+
logger.debug(f'Opening port {port}/tcp')
|
323
|
+
try:
|
324
|
+
lambda_client.create_firewall_rule(port_range=[port, port],
|
325
|
+
protocol='tcp')
|
326
|
+
except lambda_utils.LambdaCloudError as e:
|
327
|
+
logger.warning(f'Failed to open port {port}: {e}')
|
328
|
+
|
329
|
+
|
330
|
+
def cleanup_ports(cluster_name_on_cloud: str,
|
331
|
+
ports: List[str],
|
332
|
+
provider_config: Optional[Dict[str, Any]] = None) -> None:
|
333
|
+
"""Skip cleanup of firewall rules.
|
334
|
+
|
335
|
+
Lambda Cloud firewall rules are global to the account, not cluster-specific.
|
336
|
+
We skip cleanup because rules may be used by other clusters.
|
337
|
+
|
338
|
+
TODO(zhwu): the firewall rules may accumulate over time, and we may need
|
339
|
+
to add a way to automatically clean them up.
|
340
|
+
|
341
|
+
Args:
|
342
|
+
cluster_name_on_cloud: Unused.
|
343
|
+
ports: Unused.
|
344
|
+
provider_config: Unused.
|
345
|
+
"""
|
265
346
|
del cluster_name_on_cloud, ports, provider_config # Unused.
|
347
|
+
|
348
|
+
# Break the long line by splitting it
|
349
|
+
logger.info('Skipping cleanup of Lambda Cloud firewall rules '
|
350
|
+
'as they are account-wide.')
|
@@ -112,6 +112,8 @@ def _try_request_with_backoff(method: str,
|
|
112
112
|
response = requests.get(url, headers=headers)
|
113
113
|
elif method == 'post':
|
114
114
|
response = requests.post(url, headers=headers, data=data)
|
115
|
+
elif method == 'put':
|
116
|
+
response = requests.put(url, headers=headers, data=data)
|
115
117
|
else:
|
116
118
|
raise ValueError(f'Unsupported requests method: {method}')
|
117
119
|
# If rate limited, wait and try again
|
@@ -249,4 +251,86 @@ class LambdaCloudClient:
|
|
249
251
|
response = _try_request_with_backoff('get',
|
250
252
|
f'{API_ENDPOINT}/instance-types',
|
251
253
|
headers=self.headers)
|
254
|
+
return response.json().get('data', {})
|
255
|
+
|
256
|
+
def list_firewall_rules(self) -> List[Dict[str, Any]]:
|
257
|
+
"""List firewall rules."""
|
258
|
+
response = _try_request_with_backoff('get',
|
259
|
+
f'{API_ENDPOINT}/firewall-rules',
|
260
|
+
headers=self.headers)
|
252
261
|
return response.json().get('data', [])
|
262
|
+
|
263
|
+
def create_firewall_rule(self,
|
264
|
+
port_range: List[int],
|
265
|
+
protocol: str = 'tcp',
|
266
|
+
description: str = '') -> Dict[str, Any]:
|
267
|
+
"""Create a firewall rule.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
port_range: Port range as [min_port, max_port]. For a single port,
|
271
|
+
use [port, port].
|
272
|
+
protocol: Protocol ('tcp', 'udp', 'icmp', or 'all').
|
273
|
+
description: Description for the rule.
|
274
|
+
|
275
|
+
Returns:
|
276
|
+
The created firewall rule.
|
277
|
+
"""
|
278
|
+
# First, get all existing rules
|
279
|
+
existing_rules = self.list_firewall_rules()
|
280
|
+
|
281
|
+
# Convert existing rules to the format expected by the API
|
282
|
+
rule_list = []
|
283
|
+
for rule in existing_rules:
|
284
|
+
if rule.get('protocol') and rule.get('source_network'):
|
285
|
+
api_rule = {
|
286
|
+
'protocol': rule.get('protocol'),
|
287
|
+
'source_network': rule.get('source_network'),
|
288
|
+
'description': rule.get('description', '')
|
289
|
+
}
|
290
|
+
|
291
|
+
# Add port_range for non-icmp protocols
|
292
|
+
if rule.get('protocol') != 'icmp' and rule.get('port_range'):
|
293
|
+
api_rule['port_range'] = rule.get('port_range')
|
294
|
+
|
295
|
+
rule_list.append(api_rule)
|
296
|
+
|
297
|
+
# Add our new rule
|
298
|
+
new_rule: Dict[str, Any] = {
|
299
|
+
'protocol': protocol,
|
300
|
+
'source_network': '0.0.0.0/0', # Allow from any IP address
|
301
|
+
'description': description or
|
302
|
+
('SkyPilot auto-generated rule for port '
|
303
|
+
f'{port_range[0]}-{port_range[1]}/{protocol}')
|
304
|
+
}
|
305
|
+
|
306
|
+
# Add port_range for non-icmp protocols
|
307
|
+
if protocol != 'icmp':
|
308
|
+
new_rule['port_range'] = port_range
|
309
|
+
|
310
|
+
# Check if this rule already exists to avoid duplicates
|
311
|
+
rule_exists = False
|
312
|
+
for rule in rule_list:
|
313
|
+
if (rule.get('protocol') == protocol and
|
314
|
+
rule.get('source_network') == '0.0.0.0/0'):
|
315
|
+
if protocol != 'icmp':
|
316
|
+
if rule.get('port_range') == port_range:
|
317
|
+
rule_exists = True
|
318
|
+
break
|
319
|
+
else:
|
320
|
+
rule_exists = True
|
321
|
+
break
|
322
|
+
|
323
|
+
# Only add the rule if it doesn't already exist
|
324
|
+
if not rule_exists:
|
325
|
+
rule_list.append(new_rule)
|
326
|
+
|
327
|
+
# Create a data structure that matches the API schema
|
328
|
+
data = json.dumps({'data': rule_list})
|
329
|
+
|
330
|
+
response = _try_request_with_backoff(
|
331
|
+
'put', # Using PUT instead of POST as per API documentation
|
332
|
+
f'{API_ENDPOINT}/firewall-rules',
|
333
|
+
data=data,
|
334
|
+
headers=self.headers,
|
335
|
+
)
|
336
|
+
return response.json().get('data', {})
|