skypilot-nightly 1.0.0.dev20240923__tar.gz → 1.0.0.dev20240924__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.dev20240923/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20240924}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/__init__.py +11 -2
- skypilot_nightly-1.0.0.dev20240924/sky/admin_policy.py +101 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/dag.py +17 -13
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/exceptions.py +5 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/execution.py +13 -3
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/controller.py +2 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/core.py +4 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/core.py +6 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skypilot_config.py +64 -37
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/jobs-controller.yaml.j2 +3 -1
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/sky-serve-controller.yaml.j2 +3 -1
- skypilot_nightly-1.0.0.dev20240924/sky/utils/admin_policy_utils.py +145 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/common_utils.py +6 -5
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/controller_utils.py +42 -29
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/dag_utils.py +6 -3
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/schemas.py +8 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924/skypilot_nightly.egg-info}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/skypilot_nightly.egg-info/SOURCES.txt +2 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_config.py +21 -4
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/README.md +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/pyproject.toml +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/setup.cfg +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/cloudflare.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/docker.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/adaptors/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/authentication.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/backend_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/cloud_vm_ray_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/local_docker_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/backends/wheel_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/benchmark/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/benchmark/benchmark_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/benchmark/benchmark_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/check.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/cloud_stores.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/cloud_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/paperspace.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/scp.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/aws_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/azure_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/oci_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/scp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/aws_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/gcp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/lambda_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/oci_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/utils/scp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/clouds/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/core.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/data_transfer.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/data_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/mounting_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/data/storage_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/dashboard/dashboard.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/dashboard/static/favicon.ico +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/dashboard/templates/index.html +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/recovery_strategy.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/state.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/optimizer.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/aws/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/aws/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/aws/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/aws/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/azure/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/azure/azure-config-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/azure/azure-vm-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/azure/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/azure/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/cudo_machine_type.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/cudo_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/cudo_wrapper.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/cudo/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/fluidstack/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/fluidstack/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/fluidstack/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/instance_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/gcp/mig_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/instance_setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/network.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/network_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/kubernetes/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/paperspace/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/paperspace/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/paperspace/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/paperspace/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/paperspace/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/provisioner.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/runpod/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/runpod/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/runpod/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/runpod/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/cls_api_client.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/custom_script.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/id_generator.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/service_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/ssl_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/vapiconnect.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/common/vim_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/provision/vsphere/vsphere_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/resources.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/autoscalers.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/load_balancer.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/load_balancing_policies.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/replica_managers.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/serve_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/serve_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/service.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/serve/service_spec.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/setup_files/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/setup_files/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/sky_logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/attempt_skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/autostop_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/configs.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/events.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/job_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/log_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/log_lib.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/ibm/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/ibm/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/ibm/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/lambda_cloud/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/lambda_cloud/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/oci/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/oci/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/oci/query_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/oci/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/scp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/scp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/providers/scp/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/cli.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/updater.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/ray_patches/worker.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skylet/subprocess_daemon.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/status_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/task.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/aws-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/azure-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/cudo-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/fluidstack-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/gcp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/ibm-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/kubernetes-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/lambda-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/local-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/oci-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/paperspace-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/runpod-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/scp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/templates/vsphere-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/usage/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/usage/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/usage/usage_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/accelerator_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/cli_utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/cli_utils/status_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/cluster_yaml_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/command_runner.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/db_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/env_options.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/create_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/delete_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/generate_kind_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/gpu_labeler.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/rsync_helper.sh +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/kubernetes_enums.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/log_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/resources_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/rich_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/subprocess_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/timeline.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/ux_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/utils/validator.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/skypilot_nightly.egg-info/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/skypilot_nightly.egg-info/requires.txt +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/skypilot_nightly.egg-info/top_level.txt +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_api.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_jobs.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_jobs_and_serve.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_list_accelerators.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_optimizer_dryruns.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_optimizer_random_dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_serve_autoscaler.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_smoke.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/tests/test_wheels.py +0 -0
- {skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/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 = '800f7d6971bd604f266faebb33d044c7d5baca55'
|
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.dev20240924'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
@@ -82,6 +82,9 @@ _set_http_proxy_env_vars()
|
|
82
82
|
from sky import backends
|
83
83
|
from sky import benchmark
|
84
84
|
from sky import clouds
|
85
|
+
from sky.admin_policy import AdminPolicy
|
86
|
+
from sky.admin_policy import MutatedUserRequest
|
87
|
+
from sky.admin_policy import UserRequest
|
85
88
|
from sky.clouds.service_catalog import list_accelerators
|
86
89
|
from sky.core import autostop
|
87
90
|
from sky.core import cancel
|
@@ -112,6 +115,7 @@ from sky.optimizer import Optimizer
|
|
112
115
|
from sky.optimizer import OptimizeTarget
|
113
116
|
from sky.resources import Resources
|
114
117
|
from sky.skylet.job_lib import JobStatus
|
118
|
+
from sky.skypilot_config import Config
|
115
119
|
from sky.status_lib import ClusterStatus
|
116
120
|
from sky.task import Task
|
117
121
|
|
@@ -185,4 +189,9 @@ __all__ = [
|
|
185
189
|
# core APIs Storage Management
|
186
190
|
'storage_ls',
|
187
191
|
'storage_delete',
|
192
|
+
# Admin Policy
|
193
|
+
'UserRequest',
|
194
|
+
'MutatedUserRequest',
|
195
|
+
'AdminPolicy',
|
196
|
+
'Config',
|
188
197
|
]
|
@@ -0,0 +1,101 @@
|
|
1
|
+
"""Interface for admin-defined policy for user requests."""
|
2
|
+
import abc
|
3
|
+
import dataclasses
|
4
|
+
import typing
|
5
|
+
from typing import Optional
|
6
|
+
|
7
|
+
if typing.TYPE_CHECKING:
|
8
|
+
import sky
|
9
|
+
|
10
|
+
|
11
|
+
@dataclasses.dataclass
|
12
|
+
class RequestOptions:
|
13
|
+
"""Request options for admin policy.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
cluster_name: Name of the cluster to create/reuse. It is None if not
|
17
|
+
specified by the user.
|
18
|
+
idle_minutes_to_autostop: Autostop setting requested by a user. The
|
19
|
+
cluster will be set to autostop after this many minutes of idleness.
|
20
|
+
down: If true, use autodown rather than autostop.
|
21
|
+
dryrun: Is the request a dryrun?
|
22
|
+
"""
|
23
|
+
cluster_name: Optional[str]
|
24
|
+
idle_minutes_to_autostop: Optional[int]
|
25
|
+
down: bool
|
26
|
+
dryrun: bool
|
27
|
+
|
28
|
+
|
29
|
+
@dataclasses.dataclass
|
30
|
+
class UserRequest:
|
31
|
+
"""A user request.
|
32
|
+
|
33
|
+
A "user request" is defined as a `sky launch / exec` command or its API
|
34
|
+
equivalent.
|
35
|
+
|
36
|
+
`sky jobs launch / serve up` involves multiple launch requests, including
|
37
|
+
the launch of controller and clusters for a job (which can have multiple
|
38
|
+
tasks if it is a pipeline) or service replicas. Each launch is a separate
|
39
|
+
request.
|
40
|
+
|
41
|
+
This class wraps the underlying task, the global skypilot config used to run
|
42
|
+
a task, and the request options.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
task: User specified task.
|
46
|
+
skypilot_config: Global skypilot config to be used in this request.
|
47
|
+
request_options: Request options. It is None for jobs and services.
|
48
|
+
"""
|
49
|
+
task: 'sky.Task'
|
50
|
+
skypilot_config: 'sky.Config'
|
51
|
+
request_options: Optional['RequestOptions'] = None
|
52
|
+
|
53
|
+
|
54
|
+
@dataclasses.dataclass
|
55
|
+
class MutatedUserRequest:
|
56
|
+
task: 'sky.Task'
|
57
|
+
skypilot_config: 'sky.Config'
|
58
|
+
|
59
|
+
|
60
|
+
# pylint: disable=line-too-long
|
61
|
+
class AdminPolicy:
|
62
|
+
"""Abstract interface of an admin-defined policy for all user requests.
|
63
|
+
|
64
|
+
Admins can implement a subclass of AdminPolicy with the following signature:
|
65
|
+
|
66
|
+
import sky
|
67
|
+
|
68
|
+
class SkyPilotPolicyV1(sky.AdminPolicy):
|
69
|
+
def validate_and_mutate(user_request: UserRequest) -> MutatedUserRequest:
|
70
|
+
...
|
71
|
+
return MutatedUserRequest(task=..., skypilot_config=...)
|
72
|
+
|
73
|
+
The policy can mutate both task and skypilot_config. Admins then distribute
|
74
|
+
a simple module that contains this implementation, installable in a way
|
75
|
+
that it can be imported by users from the same Python environment where
|
76
|
+
SkyPilot is running.
|
77
|
+
|
78
|
+
Users can register a subclass of AdminPolicy in the SkyPilot config file
|
79
|
+
under the key 'admin_policy', e.g.
|
80
|
+
|
81
|
+
admin_policy: my_package.SkyPilotPolicyV1
|
82
|
+
"""
|
83
|
+
|
84
|
+
@classmethod
|
85
|
+
@abc.abstractmethod
|
86
|
+
def validate_and_mutate(cls,
|
87
|
+
user_request: UserRequest) -> MutatedUserRequest:
|
88
|
+
"""Validates and mutates the user request and returns mutated request.
|
89
|
+
|
90
|
+
Args:
|
91
|
+
user_request: The user request to validate and mutate.
|
92
|
+
UserRequest contains (sky.Task, sky.Config)
|
93
|
+
|
94
|
+
Returns:
|
95
|
+
MutatedUserRequest: The mutated user request.
|
96
|
+
|
97
|
+
Raises:
|
98
|
+
Exception to throw if the user request failed the validation.
|
99
|
+
"""
|
100
|
+
raise NotImplementedError(
|
101
|
+
'Your policy must implement validate_and_mutate')
|
@@ -1,8 +1,12 @@
|
|
1
1
|
"""DAGs: user applications to be run."""
|
2
2
|
import pprint
|
3
3
|
import threading
|
4
|
+
import typing
|
4
5
|
from typing import List, Optional
|
5
6
|
|
7
|
+
if typing.TYPE_CHECKING:
|
8
|
+
from sky import task
|
9
|
+
|
6
10
|
|
7
11
|
class Dag:
|
8
12
|
"""Dag: a user application, represented as a DAG of Tasks.
|
@@ -13,37 +17,37 @@ class Dag:
|
|
13
17
|
>>> task = sky.Task(...)
|
14
18
|
"""
|
15
19
|
|
16
|
-
def __init__(self):
|
17
|
-
self.tasks = []
|
20
|
+
def __init__(self) -> None:
|
21
|
+
self.tasks: List['task.Task'] = []
|
18
22
|
import networkx as nx # pylint: disable=import-outside-toplevel
|
19
23
|
|
20
24
|
self.graph = nx.DiGraph()
|
21
|
-
self.name = None
|
25
|
+
self.name: Optional[str] = None
|
22
26
|
|
23
|
-
def add(self, task):
|
27
|
+
def add(self, task: 'task.Task') -> None:
|
24
28
|
self.graph.add_node(task)
|
25
29
|
self.tasks.append(task)
|
26
30
|
|
27
|
-
def remove(self, task):
|
31
|
+
def remove(self, task: 'task.Task') -> None:
|
28
32
|
self.tasks.remove(task)
|
29
33
|
self.graph.remove_node(task)
|
30
34
|
|
31
|
-
def add_edge(self, op1, op2):
|
35
|
+
def add_edge(self, op1: 'task.Task', op2: 'task.Task') -> None:
|
32
36
|
assert op1 in self.graph.nodes
|
33
37
|
assert op2 in self.graph.nodes
|
34
38
|
self.graph.add_edge(op1, op2)
|
35
39
|
|
36
|
-
def __len__(self):
|
40
|
+
def __len__(self) -> int:
|
37
41
|
return len(self.tasks)
|
38
42
|
|
39
|
-
def __enter__(self):
|
43
|
+
def __enter__(self) -> 'Dag':
|
40
44
|
push_dag(self)
|
41
45
|
return self
|
42
46
|
|
43
|
-
def __exit__(self, exc_type, exc_value, traceback):
|
47
|
+
def __exit__(self, exc_type, exc_value, traceback) -> None:
|
44
48
|
pop_dag()
|
45
49
|
|
46
|
-
def __repr__(self):
|
50
|
+
def __repr__(self) -> str:
|
47
51
|
pformat = pprint.pformat(self.tasks)
|
48
52
|
return f'DAG:\n{pformat}'
|
49
53
|
|
@@ -70,15 +74,15 @@ class Dag:
|
|
70
74
|
|
71
75
|
class _DagContext(threading.local):
|
72
76
|
"""A thread-local stack of Dags."""
|
73
|
-
_current_dag = None
|
77
|
+
_current_dag: Optional[Dag] = None
|
74
78
|
_previous_dags: List[Dag] = []
|
75
79
|
|
76
|
-
def push_dag(self, dag):
|
80
|
+
def push_dag(self, dag: Dag):
|
77
81
|
if self._current_dag is not None:
|
78
82
|
self._previous_dags.append(self._current_dag)
|
79
83
|
self._current_dag = dag
|
80
84
|
|
81
|
-
def pop_dag(self):
|
85
|
+
def pop_dag(self) -> Optional[Dag]:
|
82
86
|
old_dag = self._current_dag
|
83
87
|
if self._previous_dags:
|
84
88
|
self._current_dag = self._previous_dags.pop()
|
@@ -286,3 +286,8 @@ class ServeUserTerminatedError(Exception):
|
|
286
286
|
|
287
287
|
class PortDoesNotExistError(Exception):
|
288
288
|
"""Raised when the port does not exist."""
|
289
|
+
|
290
|
+
|
291
|
+
class UserRequestRejectedByPolicy(Exception):
|
292
|
+
"""Raised when a user request is rejected by an admin policy."""
|
293
|
+
pass
|
@@ -9,6 +9,7 @@ from typing import List, Optional, Tuple, Union
|
|
9
9
|
import colorama
|
10
10
|
|
11
11
|
import sky
|
12
|
+
from sky import admin_policy
|
12
13
|
from sky import backends
|
13
14
|
from sky import clouds
|
14
15
|
from sky import global_user_state
|
@@ -16,6 +17,7 @@ from sky import optimizer
|
|
16
17
|
from sky import sky_logging
|
17
18
|
from sky.backends import backend_utils
|
18
19
|
from sky.usage import usage_lib
|
20
|
+
from sky.utils import admin_policy_utils
|
19
21
|
from sky.utils import controller_utils
|
20
22
|
from sky.utils import dag_utils
|
21
23
|
from sky.utils import env_options
|
@@ -158,7 +160,16 @@ def _execute(
|
|
158
160
|
handle: Optional[backends.ResourceHandle]; the handle to the cluster. None
|
159
161
|
if dryrun.
|
160
162
|
"""
|
163
|
+
|
161
164
|
dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
|
165
|
+
dag, _ = admin_policy_utils.apply(
|
166
|
+
dag,
|
167
|
+
request_options=admin_policy.RequestOptions(
|
168
|
+
cluster_name=cluster_name,
|
169
|
+
idle_minutes_to_autostop=idle_minutes_to_autostop,
|
170
|
+
down=down,
|
171
|
+
dryrun=dryrun,
|
172
|
+
))
|
162
173
|
assert len(dag) == 1, f'We support 1 task for now. {dag}'
|
163
174
|
task = dag.tasks[0]
|
164
175
|
|
@@ -170,9 +181,8 @@ def _execute(
|
|
170
181
|
|
171
182
|
cluster_exists = False
|
172
183
|
if cluster_name is not None:
|
173
|
-
|
174
|
-
|
175
|
-
cluster_exists = existing_handle is not None
|
184
|
+
cluster_record = global_user_state.get_cluster_from_name(cluster_name)
|
185
|
+
cluster_exists = cluster_record is not None
|
176
186
|
# TODO(woosuk): If the cluster exists, print a warning that
|
177
187
|
# `cpus` and `memory` are not used as a job scheduling constraint,
|
178
188
|
# unlike `gpus`.
|
{skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/jobs/controller.py
RENAMED
@@ -64,6 +64,7 @@ class JobsController:
|
|
64
64
|
if len(self._dag.tasks) <= 1:
|
65
65
|
task_name = self._dag_name
|
66
66
|
else:
|
67
|
+
assert task.name is not None, task
|
67
68
|
task_name = task.name
|
68
69
|
# This is guaranteed by the spot_launch API, where we fill in
|
69
70
|
# the task.name with
|
@@ -447,6 +448,7 @@ def _cleanup(job_id: int, dag_yaml: str):
|
|
447
448
|
# controller, we should keep it in sync with JobsController.__init__()
|
448
449
|
dag, _ = _get_dag_and_name(dag_yaml)
|
449
450
|
for task in dag.tasks:
|
451
|
+
assert task.name is not None, task
|
450
452
|
cluster_name = managed_job_utils.generate_managed_job_cluster_name(
|
451
453
|
task.name, job_id)
|
452
454
|
recovery_strategy.terminate_cluster(cluster_name)
|
@@ -18,6 +18,7 @@ from sky.jobs import constants as managed_job_constants
|
|
18
18
|
from sky.jobs import utils as managed_job_utils
|
19
19
|
from sky.skylet import constants as skylet_constants
|
20
20
|
from sky.usage import usage_lib
|
21
|
+
from sky.utils import admin_policy_utils
|
21
22
|
from sky.utils import common_utils
|
22
23
|
from sky.utils import controller_utils
|
23
24
|
from sky.utils import dag_utils
|
@@ -54,6 +55,8 @@ def launch(
|
|
54
55
|
dag_uuid = str(uuid.uuid4().hex[:4])
|
55
56
|
|
56
57
|
dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
|
58
|
+
dag, mutated_user_config = admin_policy_utils.apply(
|
59
|
+
dag, use_mutated_config_in_current_request=False)
|
57
60
|
if not dag.is_chain():
|
58
61
|
with ux_utils.print_exception_no_traceback():
|
59
62
|
raise ValueError('Only single-task or chain DAG is '
|
@@ -103,6 +106,7 @@ def launch(
|
|
103
106
|
**controller_utils.shared_controller_vars_to_fill(
|
104
107
|
controller_utils.Controllers.JOBS_CONTROLLER,
|
105
108
|
remote_user_config_path=remote_user_config_path,
|
109
|
+
local_user_config=mutated_user_config,
|
106
110
|
),
|
107
111
|
}
|
108
112
|
|
@@ -17,6 +17,7 @@ from sky.serve import serve_state
|
|
17
17
|
from sky.serve import serve_utils
|
18
18
|
from sky.skylet import constants
|
19
19
|
from sky.usage import usage_lib
|
20
|
+
from sky.utils import admin_policy_utils
|
20
21
|
from sky.utils import common_utils
|
21
22
|
from sky.utils import controller_utils
|
22
23
|
from sky.utils import resources_utils
|
@@ -124,6 +125,10 @@ def up(
|
|
124
125
|
|
125
126
|
_validate_service_task(task)
|
126
127
|
|
128
|
+
dag, mutated_user_config = admin_policy_utils.apply(
|
129
|
+
task, use_mutated_config_in_current_request=False)
|
130
|
+
task = dag.tasks[0]
|
131
|
+
|
127
132
|
controller_utils.maybe_translate_local_file_mounts_and_sync_up(task,
|
128
133
|
path='serve')
|
129
134
|
|
@@ -158,6 +163,7 @@ def up(
|
|
158
163
|
**controller_utils.shared_controller_vars_to_fill(
|
159
164
|
controller=controller_utils.Controllers.SKY_SERVE_CONTROLLER,
|
160
165
|
remote_user_config_path=remote_config_yaml_path,
|
166
|
+
local_user_config=mutated_user_config,
|
161
167
|
),
|
162
168
|
}
|
163
169
|
common_utils.fill_template(serve_constants.CONTROLLER_TEMPLATE,
|
{skypilot_nightly-1.0.0.dev20240923 → skypilot_nightly-1.0.0.dev20240924}/sky/skypilot_config.py
RENAMED
@@ -61,6 +61,8 @@ from sky.utils import common_utils
|
|
61
61
|
from sky.utils import schemas
|
62
62
|
from sky.utils import ux_utils
|
63
63
|
|
64
|
+
logger = sky_logging.init_logger(__name__)
|
65
|
+
|
64
66
|
# The config path is discovered in this order:
|
65
67
|
#
|
66
68
|
# (1) (Used internally) If env var {ENV_VAR_SKYPILOT_CONFIG} exists, use its
|
@@ -78,11 +80,57 @@ ENV_VAR_SKYPILOT_CONFIG = 'SKYPILOT_CONFIG'
|
|
78
80
|
# Path to the local config file.
|
79
81
|
CONFIG_PATH = '~/.sky/config.yaml'
|
80
82
|
|
81
|
-
|
83
|
+
|
84
|
+
class Config(Dict[str, Any]):
|
85
|
+
"""SkyPilot config that supports setting/getting values with nested keys."""
|
86
|
+
|
87
|
+
def get_nested(self,
|
88
|
+
keys: Tuple[str, ...],
|
89
|
+
default_value: Any,
|
90
|
+
override_configs: Optional[Dict[str, Any]] = None) -> Any:
|
91
|
+
"""Gets a nested key.
|
92
|
+
|
93
|
+
If any key is not found, or any intermediate key does not point to a
|
94
|
+
dict value, returns 'default_value'.
|
95
|
+
|
96
|
+
Args:
|
97
|
+
keys: A tuple of strings representing the nested keys.
|
98
|
+
default_value: The default value to return if the key is not found.
|
99
|
+
override_configs: A dict of override configs with the same schema as
|
100
|
+
the config file, but only containing the keys to override.
|
101
|
+
|
102
|
+
Returns:
|
103
|
+
The value of the nested key, or 'default_value' if not found.
|
104
|
+
"""
|
105
|
+
config = copy.deepcopy(self)
|
106
|
+
if override_configs is not None:
|
107
|
+
config = _recursive_update(config, override_configs)
|
108
|
+
return _get_nested(config, keys, default_value)
|
109
|
+
|
110
|
+
def set_nested(self, keys: Tuple[str, ...], value: Any) -> None:
|
111
|
+
"""In-place sets a nested key to value.
|
112
|
+
|
113
|
+
Like get_nested(), if any key is not found, this will not raise an
|
114
|
+
error.
|
115
|
+
"""
|
116
|
+
override = {}
|
117
|
+
for i, key in enumerate(reversed(keys)):
|
118
|
+
if i == 0:
|
119
|
+
override = {key: value}
|
120
|
+
else:
|
121
|
+
override = {key: override}
|
122
|
+
_recursive_update(self, override)
|
123
|
+
|
124
|
+
@classmethod
|
125
|
+
def from_dict(cls, config: Optional[Dict[str, Any]]) -> 'Config':
|
126
|
+
if config is None:
|
127
|
+
return cls()
|
128
|
+
return cls(**config)
|
129
|
+
|
82
130
|
|
83
131
|
# The loaded config.
|
84
|
-
_dict
|
85
|
-
_loaded_config_path = None
|
132
|
+
_dict = Config()
|
133
|
+
_loaded_config_path: Optional[str] = None
|
86
134
|
|
87
135
|
|
88
136
|
def _get_nested(configs: Optional[Dict[str, Any]], keys: Iterable[str],
|
@@ -131,17 +179,11 @@ def get_nested(keys: Tuple[str, ...],
|
|
131
179
|
), (f'Override configs must not be provided when keys {keys} is not within '
|
132
180
|
'constants.OVERRIDEABLE_CONFIG_KEYS: '
|
133
181
|
f'{constants.OVERRIDEABLE_CONFIG_KEYS}')
|
134
|
-
|
135
|
-
if _dict is not None:
|
136
|
-
config = copy.deepcopy(_dict)
|
137
|
-
if override_configs is None:
|
138
|
-
override_configs = {}
|
139
|
-
config = _recursive_update(config, override_configs)
|
140
|
-
return _get_nested(config, keys, default_value)
|
182
|
+
return _dict.get_nested(keys, default_value, override_configs)
|
141
183
|
|
142
184
|
|
143
|
-
def _recursive_update(base_config:
|
144
|
-
override_config: Dict[str, Any]) ->
|
185
|
+
def _recursive_update(base_config: Config,
|
186
|
+
override_config: Dict[str, Any]) -> Config:
|
145
187
|
"""Recursively updates base configuration with override configuration"""
|
146
188
|
for key, value in override_config.items():
|
147
189
|
if (isinstance(value, dict) and key in base_config and
|
@@ -157,22 +199,14 @@ def set_nested(keys: Tuple[str, ...], value: Any) -> Dict[str, Any]:
|
|
157
199
|
|
158
200
|
Like get_nested(), if any key is not found, this will not raise an error.
|
159
201
|
"""
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
for i, key in enumerate(reversed(keys)):
|
164
|
-
if i == 0:
|
165
|
-
override = {key: value}
|
166
|
-
else:
|
167
|
-
override = {key: override}
|
168
|
-
return _recursive_update(copy.deepcopy(_dict), override)
|
202
|
+
copied_dict = copy.deepcopy(_dict)
|
203
|
+
copied_dict.set_nested(keys, value)
|
204
|
+
return dict(**copied_dict)
|
169
205
|
|
170
206
|
|
171
|
-
def to_dict() ->
|
207
|
+
def to_dict() -> Config:
|
172
208
|
"""Returns a deep-copied version of the current config."""
|
173
|
-
|
174
|
-
return copy.deepcopy(_dict)
|
175
|
-
return {}
|
209
|
+
return copy.deepcopy(_dict)
|
176
210
|
|
177
211
|
|
178
212
|
def _try_load_config() -> None:
|
@@ -192,13 +226,14 @@ def _try_load_config() -> None:
|
|
192
226
|
config_path = os.path.expanduser(config_path)
|
193
227
|
if os.path.exists(config_path):
|
194
228
|
logger.debug(f'Using config path: {config_path}')
|
195
|
-
_loaded_config_path = config_path
|
196
229
|
try:
|
197
|
-
|
230
|
+
config = common_utils.read_yaml(config_path)
|
231
|
+
_dict = Config.from_dict(config)
|
232
|
+
_loaded_config_path = config_path
|
198
233
|
logger.debug(f'Config loaded:\n{pprint.pformat(_dict)}')
|
199
234
|
except yaml.YAMLError as e:
|
200
235
|
logger.error(f'Error in loading config file ({config_path}):', e)
|
201
|
-
if _dict
|
236
|
+
if _dict:
|
202
237
|
common_utils.validate_schema(
|
203
238
|
_dict,
|
204
239
|
schemas.get_config_schema(),
|
@@ -219,14 +254,6 @@ def loaded_config_path() -> Optional[str]:
|
|
219
254
|
_try_load_config()
|
220
255
|
|
221
256
|
|
222
|
-
def _check_loaded_or_die():
|
223
|
-
"""Checks loaded() is true; otherwise raises RuntimeError."""
|
224
|
-
if _dict is None:
|
225
|
-
raise RuntimeError(
|
226
|
-
f'No user configs loaded. Check {CONFIG_PATH} exists and '
|
227
|
-
'can be loaded.')
|
228
|
-
|
229
|
-
|
230
257
|
def loaded() -> bool:
|
231
258
|
"""Returns if the user configurations are loaded."""
|
232
|
-
return _dict
|
259
|
+
return bool(_dict)
|
@@ -4,7 +4,9 @@ name: {{dag_name}}
|
|
4
4
|
|
5
5
|
file_mounts:
|
6
6
|
{{remote_user_yaml_path}}: {{user_yaml_path}}
|
7
|
-
{
|
7
|
+
{%- if local_user_config_path is not none %}
|
8
|
+
{{remote_user_config_path}}: {{local_user_config_path}}
|
9
|
+
{%- endif %}
|
8
10
|
{%- for remote_catalog_path, local_catalog_path in modified_catalogs.items() %}
|
9
11
|
{{remote_catalog_path}}: {{local_catalog_path}}
|
10
12
|
{%- endfor %}
|
@@ -23,7 +23,9 @@ setup: |
|
|
23
23
|
|
24
24
|
file_mounts:
|
25
25
|
{{remote_task_yaml_path}}: {{local_task_yaml_path}}
|
26
|
-
{
|
26
|
+
{%- if local_user_config_path is not none %}
|
27
|
+
{{remote_user_config_path}}: {{local_user_config_path}}
|
28
|
+
{%- endif %}
|
27
29
|
{%- for remote_catalog_path, local_catalog_path in modified_catalogs.items() %}
|
28
30
|
{{remote_catalog_path}}: {{local_catalog_path}}
|
29
31
|
{%- endfor %}
|
@@ -0,0 +1,145 @@
|
|
1
|
+
"""Admin policy utils."""
|
2
|
+
import copy
|
3
|
+
import importlib
|
4
|
+
import os
|
5
|
+
import tempfile
|
6
|
+
from typing import Optional, Tuple, Union
|
7
|
+
|
8
|
+
import colorama
|
9
|
+
|
10
|
+
from sky import admin_policy
|
11
|
+
from sky import dag as dag_lib
|
12
|
+
from sky import exceptions
|
13
|
+
from sky import sky_logging
|
14
|
+
from sky import skypilot_config
|
15
|
+
from sky import task as task_lib
|
16
|
+
from sky.utils import common_utils
|
17
|
+
from sky.utils import ux_utils
|
18
|
+
|
19
|
+
logger = sky_logging.init_logger(__name__)
|
20
|
+
|
21
|
+
|
22
|
+
def _get_policy_cls(
|
23
|
+
policy: Optional[str]) -> Optional[admin_policy.AdminPolicy]:
|
24
|
+
"""Gets admin-defined policy."""
|
25
|
+
if policy is None:
|
26
|
+
return None
|
27
|
+
try:
|
28
|
+
module_path, class_name = policy.rsplit('.', 1)
|
29
|
+
module = importlib.import_module(module_path)
|
30
|
+
except ImportError as e:
|
31
|
+
with ux_utils.print_exception_no_traceback():
|
32
|
+
raise ImportError(
|
33
|
+
f'Failed to import policy module: {policy}. '
|
34
|
+
'Please check if the module is installed in your Python '
|
35
|
+
'environment.') from e
|
36
|
+
|
37
|
+
try:
|
38
|
+
policy_cls = getattr(module, class_name)
|
39
|
+
except AttributeError as e:
|
40
|
+
with ux_utils.print_exception_no_traceback():
|
41
|
+
raise AttributeError(
|
42
|
+
f'Could not find {class_name} class in module {module_path}. '
|
43
|
+
'Please check with your policy admin for details.') from e
|
44
|
+
|
45
|
+
# Check if the module implements the AdminPolicy interface.
|
46
|
+
if not issubclass(policy_cls, admin_policy.AdminPolicy):
|
47
|
+
with ux_utils.print_exception_no_traceback():
|
48
|
+
raise ValueError(
|
49
|
+
f'Policy class {policy!r} does not implement the AdminPolicy '
|
50
|
+
'interface. Please check with your policy admin for details.')
|
51
|
+
return policy_cls
|
52
|
+
|
53
|
+
|
54
|
+
def apply(
|
55
|
+
entrypoint: Union['dag_lib.Dag', 'task_lib.Task'],
|
56
|
+
use_mutated_config_in_current_request: bool = True,
|
57
|
+
request_options: Optional[admin_policy.RequestOptions] = None,
|
58
|
+
) -> Tuple['dag_lib.Dag', skypilot_config.Config]:
|
59
|
+
"""Applies an admin policy (if registered) to a DAG or a task.
|
60
|
+
|
61
|
+
It mutates a Dag by applying any registered admin policy and also
|
62
|
+
potentially updates (controlled by `use_mutated_config_in_current_request`)
|
63
|
+
the global SkyPilot config if there is any changes made by the policy.
|
64
|
+
|
65
|
+
Args:
|
66
|
+
dag: The dag to be mutated by the policy.
|
67
|
+
use_mutated_config_in_current_request: Whether to use the mutated
|
68
|
+
config in the current request.
|
69
|
+
request_options: Additional options user passed for the current request.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
- The new copy of dag after applying the policy
|
73
|
+
- The new copy of skypilot config after applying the policy.
|
74
|
+
"""
|
75
|
+
if isinstance(entrypoint, task_lib.Task):
|
76
|
+
dag = dag_lib.Dag()
|
77
|
+
dag.add(entrypoint)
|
78
|
+
else:
|
79
|
+
dag = entrypoint
|
80
|
+
|
81
|
+
policy = skypilot_config.get_nested(('admin_policy',), None)
|
82
|
+
policy_cls = _get_policy_cls(policy)
|
83
|
+
if policy_cls is None:
|
84
|
+
return dag, skypilot_config.to_dict()
|
85
|
+
|
86
|
+
logger.info(f'Applying policy: {policy}')
|
87
|
+
original_config = skypilot_config.to_dict()
|
88
|
+
config = copy.deepcopy(original_config)
|
89
|
+
mutated_dag = dag_lib.Dag()
|
90
|
+
mutated_dag.name = dag.name
|
91
|
+
|
92
|
+
mutated_config = None
|
93
|
+
for task in dag.tasks:
|
94
|
+
user_request = admin_policy.UserRequest(task, config, request_options)
|
95
|
+
try:
|
96
|
+
mutated_user_request = policy_cls.validate_and_mutate(user_request)
|
97
|
+
except Exception as e: # pylint: disable=broad-except
|
98
|
+
with ux_utils.print_exception_no_traceback():
|
99
|
+
raise exceptions.UserRequestRejectedByPolicy(
|
100
|
+
f'{colorama.Fore.RED}User request rejected by policy '
|
101
|
+
f'{policy!r}{colorama.Fore.RESET}: '
|
102
|
+
f'{common_utils.format_exception(e, use_bracket=True)}'
|
103
|
+
) from e
|
104
|
+
if mutated_config is None:
|
105
|
+
mutated_config = mutated_user_request.skypilot_config
|
106
|
+
else:
|
107
|
+
if mutated_config != mutated_user_request.skypilot_config:
|
108
|
+
# In the case of a pipeline of tasks, the mutated config
|
109
|
+
# generated should remain the same for all tasks for now for
|
110
|
+
# simplicity.
|
111
|
+
# TODO(zhwu): We should support per-task mutated config or
|
112
|
+
# allowing overriding required global config in task YAML.
|
113
|
+
with ux_utils.print_exception_no_traceback():
|
114
|
+
raise exceptions.UserRequestRejectedByPolicy(
|
115
|
+
'All tasks must have the same SkyPilot config after '
|
116
|
+
'applying the policy. Please check with your policy '
|
117
|
+
'admin for details.')
|
118
|
+
mutated_dag.add(mutated_user_request.task)
|
119
|
+
assert mutated_config is not None, dag
|
120
|
+
|
121
|
+
# Update the new_dag's graph with the old dag's graph
|
122
|
+
for u, v in dag.graph.edges:
|
123
|
+
u_idx = dag.tasks.index(u)
|
124
|
+
v_idx = dag.tasks.index(v)
|
125
|
+
mutated_dag.graph.add_edge(mutated_dag.tasks[u_idx],
|
126
|
+
mutated_dag.tasks[v_idx])
|
127
|
+
|
128
|
+
if (use_mutated_config_in_current_request and
|
129
|
+
original_config != mutated_config):
|
130
|
+
with tempfile.NamedTemporaryFile(
|
131
|
+
delete=False,
|
132
|
+
mode='w',
|
133
|
+
prefix='policy-mutated-skypilot-config-',
|
134
|
+
suffix='.yaml') as temp_file:
|
135
|
+
|
136
|
+
common_utils.dump_yaml(temp_file.name, dict(**mutated_config))
|
137
|
+
os.environ[skypilot_config.ENV_VAR_SKYPILOT_CONFIG] = temp_file.name
|
138
|
+
logger.debug(f'Updated SkyPilot config: {temp_file.name}')
|
139
|
+
# TODO(zhwu): This is not a clean way to update the SkyPilot config,
|
140
|
+
# because we are resetting the global context for a single DAG,
|
141
|
+
# which is conceptually weird.
|
142
|
+
importlib.reload(skypilot_config)
|
143
|
+
|
144
|
+
logger.debug(f'Mutated user request: {mutated_user_request}')
|
145
|
+
return mutated_dag, mutated_config
|