skypilot-nightly 1.0.0.dev20241107__tar.gz → 1.0.0.dev20241109__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.dev20241107/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20241109}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/__init__.py +2 -2
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/cloud_vm_ray_backend.py +12 -6
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/wheel_utils.py +5 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/cli.py +28 -4
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +3 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/core.py +3 -2
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/dag.py +1 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/mounting_utils.py +4 -16
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/exceptions.py +4 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/execution.py +10 -8
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/core.py +3 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/dashboard.py +2 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/recovery_strategy.py +16 -5
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/state.py +94 -79
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/utils.py +18 -10
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/config.py +25 -5
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/instance_setup.py +1 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/instance.py +6 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/core.py +11 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/constants.py +1 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/job_lib.py +10 -3
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/log_lib.py +77 -8
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ray.yml.j2 +3 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/admin_policy_utils.py +1 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/command_runner.py +14 -2
- skypilot_nightly-1.0.0.dev20241109/sky/utils/control_master_utils.py +49 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109/skypilot_nightly.egg-info}/PKG-INFO +1 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/SOURCES.txt +1 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_optimizer_dryruns.py +2 -1
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_smoke.py +29 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/README.md +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/pyproject.toml +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/setup.cfg +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/cloudflare.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/docker.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/admin_policy.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/authentication.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/backend_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/local_docker_backend.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/benchmark_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/benchmark_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/check.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/cloud_stores.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cloud_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/ibm.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/kubernetes.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/lambda_cloud.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/oci.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/paperspace.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/runpod.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/scp.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/aws_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/azure_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/oci_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/scp_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/aws_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/azure_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/gcp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/oci_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/scp_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/vsphere.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/data_transfer.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/data_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/storage_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/static/favicon.ico +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/templates/index.html +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/optimizer.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/azure-config-template.json +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/common.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_machine_type.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_wrapper.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/docker_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/instance_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/mig_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/network.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/network_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/provisioner.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/cls_api_client.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/custom_script.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/id_generator.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/metadata_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/service_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/ssl_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/vapiconnect.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/vim_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/instance.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/vsphere_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/resources.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/autoscalers.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/controller.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/load_balancer.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/load_balancing_policies.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/replica_managers.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/serve_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/serve_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/service.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/service_spec.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/setup_files/MANIFEST.in +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/setup_files/setup.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/sky_logging.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/attempt_skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/autostop_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/configs.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/events.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/log_lib.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/command_runner.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/query_helper.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/node_provider.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/cli.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/updater.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/worker.py.patch +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/skylet.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/subprocess_daemon.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skypilot_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/status_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/task.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/aws-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/azure-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/cudo-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/fluidstack-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/gcp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/ibm-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/jobs-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/lambda-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/local-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/oci-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/paperspace-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/runpod-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/scp-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/vsphere-ray.yml.j2 +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/constants.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/usage_lib.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/accelerator_registry.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cli_utils/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cli_utils/status_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cluster_yaml_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/command_runner.pyi +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/common_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/controller_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/dag_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/db_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/env_options.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/__init__.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/create_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/delete_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/generate_kind_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/gpu_labeler.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/rsync_helper.sh +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes_enums.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/log_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/resources_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/rich_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/schemas.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/subprocess_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/timeline.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/ux_utils.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/validator.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/requires.txt +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/top_level.txt +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_api.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_cli.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_config.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_global_user_state.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_jobs.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_jobs_and_serve.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_list_accelerators.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_optimizer_random_dag.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_serve_autoscaler.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_storage.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_wheels.py +0 -0
- {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/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 = '42c79e1d0a5e018e275705ada53957573f9a0181'
|
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.dev20241109'
|
39
39
|
__root_dir__ = os.path.dirname(os.path.abspath(__file__))
|
40
40
|
|
41
41
|
|
@@ -3262,6 +3262,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
3262
3262
|
) -> None:
|
3263
3263
|
"""Executes generated code on the head node."""
|
3264
3264
|
style = colorama.Style
|
3265
|
+
fore = colorama.Fore
|
3265
3266
|
|
3266
3267
|
script_path = os.path.join(SKY_REMOTE_APP_DIR, f'sky_job_{job_id}')
|
3267
3268
|
remote_log_dir = self.log_dir
|
@@ -3373,9 +3374,9 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
3373
3374
|
controller = controller_utils.Controllers.from_name(name)
|
3374
3375
|
if controller == controller_utils.Controllers.JOBS_CONTROLLER:
|
3375
3376
|
logger.info(
|
3376
|
-
f'\n
|
3377
|
-
f'\nManaged Job ID: '
|
3377
|
+
f'\n{fore.CYAN}Managed Job ID: '
|
3378
3378
|
f'{style.BRIGHT}{job_id}{style.RESET_ALL}'
|
3379
|
+
f'\n📋 Useful Commands'
|
3379
3380
|
f'\n{ux_utils.INDENT_SYMBOL}To cancel the job:\t\t\t'
|
3380
3381
|
f'{ux_utils.BOLD}sky jobs cancel {job_id}'
|
3381
3382
|
f'{ux_utils.RESET_BOLD}'
|
@@ -3392,8 +3393,9 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
3392
3393
|
f'dashboard:\t{ux_utils.BOLD}sky jobs dashboard'
|
3393
3394
|
f'{ux_utils.RESET_BOLD}')
|
3394
3395
|
elif controller is None:
|
3395
|
-
logger.info(f'\n
|
3396
|
-
f'
|
3396
|
+
logger.info(f'\n{fore.CYAN}Job ID: '
|
3397
|
+
f'{style.BRIGHT}{job_id}{style.RESET_ALL}'
|
3398
|
+
f'\n📋 Useful Commands'
|
3397
3399
|
f'\n{ux_utils.INDENT_SYMBOL}To cancel the job:\t\t'
|
3398
3400
|
f'{ux_utils.BOLD}sky cancel {name} {job_id}'
|
3399
3401
|
f'{ux_utils.RESET_BOLD}'
|
@@ -3709,7 +3711,8 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
3709
3711
|
handle: CloudVmRayResourceHandle,
|
3710
3712
|
job_id: Optional[int],
|
3711
3713
|
managed_job_id: Optional[int] = None,
|
3712
|
-
follow: bool = True
|
3714
|
+
follow: bool = True,
|
3715
|
+
tail: int = 0) -> int:
|
3713
3716
|
"""Tail the logs of a job.
|
3714
3717
|
|
3715
3718
|
Args:
|
@@ -3717,10 +3720,13 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
|
|
3717
3720
|
job_id: The job ID to tail the logs of.
|
3718
3721
|
managed_job_id: The managed job ID for display purpose only.
|
3719
3722
|
follow: Whether to follow the logs.
|
3723
|
+
tail: The number of lines to display from the end of the
|
3724
|
+
log file. If 0, print all lines.
|
3720
3725
|
"""
|
3721
3726
|
code = job_lib.JobLibCodeGen.tail_logs(job_id,
|
3722
3727
|
managed_job_id=managed_job_id,
|
3723
|
-
follow=follow
|
3728
|
+
follow=follow,
|
3729
|
+
tail=tail)
|
3724
3730
|
if job_id is None and managed_job_id is None:
|
3725
3731
|
logger.info(
|
3726
3732
|
'Job ID not provided. Streaming the logs of the latest job.')
|
@@ -129,7 +129,11 @@ def _build_sky_wheel() -> pathlib.Path:
|
|
129
129
|
|
130
130
|
wheel_dir = WHEEL_DIR / hash_of_latest_wheel
|
131
131
|
wheel_dir.mkdir(parents=True, exist_ok=True)
|
132
|
-
shutil.move
|
132
|
+
# shutil.move will fail when the file already exists and is being
|
133
|
+
# moved across filesystems.
|
134
|
+
if not os.path.exists(
|
135
|
+
os.path.join(wheel_dir, os.path.basename(wheel_path))):
|
136
|
+
shutil.move(str(wheel_path), wheel_dir)
|
133
137
|
return wheel_dir / wheel_path.name
|
134
138
|
|
135
139
|
|
@@ -46,6 +46,7 @@ from rich import progress as rich_progress
|
|
46
46
|
import yaml
|
47
47
|
|
48
48
|
import sky
|
49
|
+
from sky import admin_policy
|
49
50
|
from sky import backends
|
50
51
|
from sky import check as sky_check
|
51
52
|
from sky import clouds as sky_clouds
|
@@ -67,6 +68,7 @@ from sky.skylet import constants
|
|
67
68
|
from sky.skylet import job_lib
|
68
69
|
from sky.skylet import log_lib
|
69
70
|
from sky.usage import usage_lib
|
71
|
+
from sky.utils import admin_policy_utils
|
70
72
|
from sky.utils import common_utils
|
71
73
|
from sky.utils import controller_utils
|
72
74
|
from sky.utils import dag_utils
|
@@ -582,6 +584,15 @@ def _launch_with_confirm(
|
|
582
584
|
with ux_utils.print_exception_no_traceback():
|
583
585
|
raise RuntimeError(f'{colorama.Fore.YELLOW}{e}'
|
584
586
|
f'{colorama.Style.RESET_ALL}') from e
|
587
|
+
dag, _ = admin_policy_utils.apply(
|
588
|
+
dag,
|
589
|
+
request_options=admin_policy.RequestOptions(
|
590
|
+
cluster_name=cluster,
|
591
|
+
idle_minutes_to_autostop=idle_minutes_to_autostop,
|
592
|
+
down=down,
|
593
|
+
dryrun=dryrun,
|
594
|
+
),
|
595
|
+
)
|
585
596
|
dag = sky.optimize(dag)
|
586
597
|
task = dag.tasks[0]
|
587
598
|
|
@@ -2011,6 +2022,12 @@ def queue(clusters: List[str], skip_finished: bool, all_users: bool):
|
|
2011
2022
|
help=('Follow the logs of a job. '
|
2012
2023
|
'If --no-follow is specified, print the log so far and exit. '
|
2013
2024
|
'[default: --follow]'))
|
2025
|
+
@click.option(
|
2026
|
+
'--tail',
|
2027
|
+
default=0,
|
2028
|
+
type=int,
|
2029
|
+
help=('The number of lines to display from the end of the log file. '
|
2030
|
+
'Default is 0, which means print all lines.'))
|
2014
2031
|
@click.argument('cluster',
|
2015
2032
|
required=True,
|
2016
2033
|
type=str,
|
@@ -2024,6 +2041,7 @@ def logs(
|
|
2024
2041
|
sync_down: bool,
|
2025
2042
|
status: bool, # pylint: disable=redefined-outer-name
|
2026
2043
|
follow: bool,
|
2044
|
+
tail: int,
|
2027
2045
|
):
|
2028
2046
|
# NOTE(dev): Keep the docstring consistent between the Python API and CLI.
|
2029
2047
|
"""Tail the log of a job.
|
@@ -2090,7 +2108,7 @@ def logs(
|
|
2090
2108
|
click.secho(f'Job {id_str}not found', fg='red')
|
2091
2109
|
sys.exit(1)
|
2092
2110
|
|
2093
|
-
core.tail_logs(cluster, job_id, follow)
|
2111
|
+
core.tail_logs(cluster, job_id, follow, tail)
|
2094
2112
|
|
2095
2113
|
|
2096
2114
|
@cli.command()
|
@@ -3036,9 +3054,9 @@ def show_gpus(
|
|
3036
3054
|
and spot instances. There may be multiple regions with the same lowest
|
3037
3055
|
price.
|
3038
3056
|
|
3039
|
-
If ``--cloud kubernetes`` is specified, it will show the
|
3040
|
-
of the GPU available on a single node and the real-time
|
3041
|
-
the GPU across all nodes in the Kubernetes cluster.
|
3057
|
+
If ``--cloud kubernetes`` or ``--cloud k8s`` is specified, it will show the
|
3058
|
+
maximum quantities of the GPU available on a single node and the real-time
|
3059
|
+
availability of the GPU across all nodes in the Kubernetes cluster.
|
3042
3060
|
|
3043
3061
|
Definitions of certain fields:
|
3044
3062
|
|
@@ -3667,6 +3685,8 @@ def jobs_launch(
|
|
3667
3685
|
|
3668
3686
|
click.secho(f'Managed job {dag.name!r} will be launched on (estimated):',
|
3669
3687
|
fg='cyan')
|
3688
|
+
dag, _ = admin_policy_utils.apply(
|
3689
|
+
dag, use_mutated_config_in_current_request=False)
|
3670
3690
|
dag = sky.optimize(dag)
|
3671
3691
|
|
3672
3692
|
if not yes:
|
@@ -4145,6 +4165,8 @@ def serve_up(
|
|
4145
4165
|
fg='cyan')
|
4146
4166
|
with sky.Dag() as dag:
|
4147
4167
|
dag.add(task)
|
4168
|
+
dag, _ = admin_policy_utils.apply(
|
4169
|
+
dag, use_mutated_config_in_current_request=False)
|
4148
4170
|
sky.optimize(dag)
|
4149
4171
|
|
4150
4172
|
if not yes:
|
@@ -4261,6 +4283,8 @@ def serve_update(
|
|
4261
4283
|
fg='cyan')
|
4262
4284
|
with sky.Dag() as dag:
|
4263
4285
|
dag.add(task)
|
4286
|
+
dag, _ = admin_policy_utils.apply(
|
4287
|
+
dag, use_mutated_config_in_current_request=False)
|
4264
4288
|
sky.optimize(dag)
|
4265
4289
|
|
4266
4290
|
if not yes:
|
@@ -20,7 +20,6 @@ DEFAULT_LAMBDA_KEYS_PATH = os.path.expanduser('~/.lambda_cloud/lambda_keys')
|
|
20
20
|
|
21
21
|
# List of all possible regions.
|
22
22
|
REGIONS = [
|
23
|
-
'australia-southeast-1',
|
24
23
|
'europe-central-1',
|
25
24
|
'asia-south-1',
|
26
25
|
'me-west-1',
|
@@ -28,9 +27,12 @@ REGIONS = [
|
|
28
27
|
'asia-northeast-1',
|
29
28
|
'asia-northeast-2',
|
30
29
|
'us-east-1',
|
30
|
+
'us-east-2',
|
31
31
|
'us-west-2',
|
32
32
|
'us-west-1',
|
33
33
|
'us-south-1',
|
34
|
+
'us-south-2',
|
35
|
+
'us-south-3',
|
34
36
|
'us-west-3',
|
35
37
|
'us-midwest-1',
|
36
38
|
]
|
@@ -742,7 +742,8 @@ def cancel(
|
|
742
742
|
@usage_lib.entrypoint
|
743
743
|
def tail_logs(cluster_name: str,
|
744
744
|
job_id: Optional[int],
|
745
|
-
follow: bool = True
|
745
|
+
follow: bool = True,
|
746
|
+
tail: int = 0) -> None:
|
746
747
|
# NOTE(dev): Keep the docstring consistent between the Python API and CLI.
|
747
748
|
"""Tail the logs of a job.
|
748
749
|
|
@@ -775,7 +776,7 @@ def tail_logs(cluster_name: str,
|
|
775
776
|
f'{colorama.Style.RESET_ALL}')
|
776
777
|
|
777
778
|
usage_lib.record_cluster_name_for_current_operation(cluster_name)
|
778
|
-
backend.tail_logs(handle, job_id, follow=follow)
|
779
|
+
backend.tail_logs(handle, job_id, follow=follow, tail=tail)
|
779
780
|
|
780
781
|
|
781
782
|
@usage_lib.entrypoint
|
{skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/mounting_utils.py
RENAMED
@@ -276,23 +276,11 @@ def get_mounting_command(
|
|
276
276
|
script = get_mounting_script(mount_path, mount_cmd, install_cmd,
|
277
277
|
version_check_cmd)
|
278
278
|
|
279
|
-
# TODO(romilb): Get direct bash script to work like so:
|
280
|
-
# command = f'bash <<-\EOL' \
|
281
|
-
# f'{script}' \
|
282
|
-
# 'EOL'
|
283
|
-
|
284
|
-
# TODO(romilb): This heredoc should have EOF after script, but it
|
285
|
-
# fails with sky's ssh pipeline. Instead, we don't use EOF and use )
|
286
|
-
# as the end of heredoc. This raises a warning (here-document delimited
|
287
|
-
# by end-of-file) that can be safely ignored.
|
288
|
-
|
289
279
|
# While these commands are run sequentially for each storage object,
|
290
280
|
# we add random int to be on the safer side and avoid collisions.
|
291
281
|
script_path = f'~/.sky/mount_{random.randint(0, 1000000)}.sh'
|
292
|
-
|
293
|
-
|
294
|
-
f'{
|
295
|
-
f'
|
296
|
-
f' && bash {script_path}'
|
297
|
-
f' && rm {script_path}')
|
282
|
+
command = (f'echo {shlex.quote(script)} > {script_path} && '
|
283
|
+
f'chmod +x {script_path} && '
|
284
|
+
f'bash {script_path} && '
|
285
|
+
f'rm {script_path}')
|
298
286
|
return command
|
@@ -3,6 +3,8 @@ import enum
|
|
3
3
|
import typing
|
4
4
|
from typing import List, Optional, Sequence
|
5
5
|
|
6
|
+
from sky.utils import env_options
|
7
|
+
|
6
8
|
if typing.TYPE_CHECKING:
|
7
9
|
from sky import status_lib
|
8
10
|
from sky.backends import backend
|
@@ -104,7 +106,8 @@ class CommandError(Exception):
|
|
104
106
|
if not command:
|
105
107
|
message = error_msg
|
106
108
|
else:
|
107
|
-
if len(command) > 100
|
109
|
+
if (len(command) > 100 and
|
110
|
+
not env_options.Options.SHOW_DEBUG_INFO.get()):
|
108
111
|
# Chunck the command to avoid overflow.
|
109
112
|
command = command[:100] + '...'
|
110
113
|
message = (f'Command {command} failed with return code '
|
@@ -160,14 +160,16 @@ def _execute(
|
|
160
160
|
"""
|
161
161
|
|
162
162
|
dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
|
163
|
-
|
164
|
-
dag,
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
163
|
+
if not dag.policy_applied:
|
164
|
+
dag, _ = admin_policy_utils.apply(
|
165
|
+
dag,
|
166
|
+
request_options=admin_policy.RequestOptions(
|
167
|
+
cluster_name=cluster_name,
|
168
|
+
idle_minutes_to_autostop=idle_minutes_to_autostop,
|
169
|
+
down=down,
|
170
|
+
dryrun=dryrun,
|
171
|
+
),
|
172
|
+
)
|
171
173
|
assert len(dag) == 1, f'We support 1 task for now. {dag}'
|
172
174
|
task = dag.tasks[0]
|
173
175
|
|
@@ -59,8 +59,10 @@ def launch(
|
|
59
59
|
"""
|
60
60
|
entrypoint = task
|
61
61
|
dag_uuid = str(uuid.uuid4().hex[:4])
|
62
|
-
|
63
62
|
dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
|
63
|
+
# Always apply the policy again here, even though it might have been applied
|
64
|
+
# in the CLI. This is to ensure that we apply the policy to the final DAG
|
65
|
+
# and get the mutated config.
|
64
66
|
dag, mutated_user_config = admin_policy_utils.apply(
|
65
67
|
dag, use_mutated_config_in_current_request=False)
|
66
68
|
if not dag.is_chain():
|
@@ -26,7 +26,8 @@ def _is_running_on_jobs_controller() -> bool:
|
|
26
26
|
"""
|
27
27
|
if pathlib.Path('~/.sky/sky_ray.yml').expanduser().exists():
|
28
28
|
config = yaml.safe_load(
|
29
|
-
pathlib.Path('~/.sky/sky_ray.yml').expanduser().read_text(
|
29
|
+
pathlib.Path('~/.sky/sky_ray.yml').expanduser().read_text(
|
30
|
+
encoding='utf-8'))
|
30
31
|
cluster_name = config.get('cluster_name', '')
|
31
32
|
candidate_controller_names = (
|
32
33
|
controller_utils.Controllers.JOBS_CONTROLLER.value.
|
@@ -36,6 +36,11 @@ DEFAULT_RECOVERY_STRATEGY = None
|
|
36
36
|
# 10 * JOB_STARTED_STATUS_CHECK_GAP_SECONDS = 10 * 5 = 50 seconds
|
37
37
|
MAX_JOB_CHECKING_RETRY = 10
|
38
38
|
|
39
|
+
# Minutes to job cluster autodown. This should be significantly larger than
|
40
|
+
# managed_job_utils.JOB_STATUS_CHECK_GAP_SECONDS, to avoid tearing down the
|
41
|
+
# cluster before its status can be updated by the job controller.
|
42
|
+
_AUTODOWN_MINUTES = 5
|
43
|
+
|
39
44
|
|
40
45
|
def terminate_cluster(cluster_name: str, max_retry: int = 3) -> None:
|
41
46
|
"""Terminate the cluster."""
|
@@ -302,11 +307,17 @@ class StrategyExecutor:
|
|
302
307
|
usage_lib.messages.usage.set_internal()
|
303
308
|
# Detach setup, so that the setup failure can be detected
|
304
309
|
# by the controller process (job_status -> FAILED_SETUP).
|
305
|
-
sky.launch(
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
+
sky.launch(
|
311
|
+
self.dag,
|
312
|
+
cluster_name=self.cluster_name,
|
313
|
+
# We expect to tear down the cluster as soon as the job is
|
314
|
+
# finished. However, in case the controller dies, set
|
315
|
+
# autodown to try and avoid a resource leak.
|
316
|
+
idle_minutes_to_autostop=_AUTODOWN_MINUTES,
|
317
|
+
down=True,
|
318
|
+
detach_setup=True,
|
319
|
+
detach_run=True,
|
320
|
+
_is_launched_by_jobs_controller=True)
|
310
321
|
logger.info('Managed job cluster launched.')
|
311
322
|
except (exceptions.InvalidClusterNameError,
|
312
323
|
exceptions.NoCloudAccessError,
|
@@ -12,6 +12,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
|
12
12
|
import colorama
|
13
13
|
|
14
14
|
from sky import sky_logging
|
15
|
+
from sky.utils import common_utils
|
15
16
|
from sky.utils import db_utils
|
16
17
|
|
17
18
|
if typing.TYPE_CHECKING:
|
@@ -22,23 +23,6 @@ CallbackType = Callable[[str], None]
|
|
22
23
|
logger = sky_logging.init_logger(__name__)
|
23
24
|
|
24
25
|
|
25
|
-
def _get_db_path() -> str:
|
26
|
-
"""Workaround to collapse multi-step Path ops for type checker.
|
27
|
-
Ensures _DB_PATH is str, avoiding Union[Path, str] inference.
|
28
|
-
"""
|
29
|
-
path = pathlib.Path('~/.sky/spot_jobs.db')
|
30
|
-
path = path.expanduser().absolute()
|
31
|
-
path.parents[0].mkdir(parents=True, exist_ok=True)
|
32
|
-
return str(path)
|
33
|
-
|
34
|
-
|
35
|
-
_DB_PATH = _get_db_path()
|
36
|
-
|
37
|
-
# Module-level connection/cursor; thread-safe as the module is only imported
|
38
|
-
# once.
|
39
|
-
_CONN = sqlite3.connect(_DB_PATH)
|
40
|
-
_CURSOR = _CONN.cursor()
|
41
|
-
|
42
26
|
# === Database schema ===
|
43
27
|
# `spot` table contains all the finest-grained tasks, including all the
|
44
28
|
# tasks of a managed job (called spot for legacy reason, as it is generalized
|
@@ -50,68 +34,99 @@ _CURSOR = _CONN.cursor()
|
|
50
34
|
# identifier/primary key for all the tasks. We will use `spot_job_id`
|
51
35
|
# to identify the spot job.
|
52
36
|
# TODO(zhwu): schema migration may be needed.
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
db_utils.add_column_to_table(
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
37
|
+
def create_table(cursor, conn):
|
38
|
+
# Enable WAL mode to avoid locking issues.
|
39
|
+
# See: issue #3863, #1441 and PR #1509
|
40
|
+
# https://github.com/microsoft/WSL/issues/2395
|
41
|
+
# TODO(romilb): We do not enable WAL for WSL because of known issue in WSL.
|
42
|
+
# This may cause the database locked problem from WSL issue #1441.
|
43
|
+
if not common_utils.is_wsl():
|
44
|
+
try:
|
45
|
+
cursor.execute('PRAGMA journal_mode=WAL')
|
46
|
+
except sqlite3.OperationalError as e:
|
47
|
+
if 'database is locked' not in str(e):
|
48
|
+
raise
|
49
|
+
# If the database is locked, it is OK to continue, as the WAL mode
|
50
|
+
# is not critical and is likely to be enabled by other processes.
|
51
|
+
|
52
|
+
cursor.execute("""\
|
53
|
+
CREATE TABLE IF NOT EXISTS spot (
|
54
|
+
job_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
55
|
+
job_name TEXT,
|
56
|
+
resources TEXT,
|
57
|
+
submitted_at FLOAT,
|
58
|
+
status TEXT,
|
59
|
+
run_timestamp TEXT CANDIDATE KEY,
|
60
|
+
start_at FLOAT DEFAULT NULL,
|
61
|
+
end_at FLOAT DEFAULT NULL,
|
62
|
+
last_recovered_at FLOAT DEFAULT -1,
|
63
|
+
recovery_count INTEGER DEFAULT 0,
|
64
|
+
job_duration FLOAT DEFAULT 0,
|
65
|
+
failure_reason TEXT,
|
66
|
+
spot_job_id INTEGER,
|
67
|
+
task_id INTEGER DEFAULT 0,
|
68
|
+
task_name TEXT,
|
69
|
+
specs TEXT)""")
|
70
|
+
conn.commit()
|
71
|
+
|
72
|
+
db_utils.add_column_to_table(cursor, conn, 'spot', 'failure_reason', 'TEXT')
|
73
|
+
# Create a new column `spot_job_id`, which is the same for tasks of the
|
74
|
+
# same managed job.
|
75
|
+
# The original `job_id` no longer has an actual meaning, but only a legacy
|
76
|
+
# identifier for all tasks in database.
|
77
|
+
db_utils.add_column_to_table(cursor,
|
78
|
+
conn,
|
79
|
+
'spot',
|
80
|
+
'spot_job_id',
|
81
|
+
'INTEGER',
|
82
|
+
copy_from='job_id')
|
83
|
+
db_utils.add_column_to_table(cursor,
|
84
|
+
conn,
|
85
|
+
'spot',
|
86
|
+
'task_id',
|
87
|
+
'INTEGER DEFAULT 0',
|
88
|
+
value_to_replace_existing_entries=0)
|
89
|
+
db_utils.add_column_to_table(cursor,
|
90
|
+
conn,
|
91
|
+
'spot',
|
92
|
+
'task_name',
|
93
|
+
'TEXT',
|
94
|
+
copy_from='job_name')
|
95
|
+
|
96
|
+
# Specs is some useful information about the task, e.g., the
|
97
|
+
# max_restarts_on_errors value. It is stored in JSON format.
|
98
|
+
db_utils.add_column_to_table(cursor,
|
99
|
+
conn,
|
100
|
+
'spot',
|
101
|
+
'specs',
|
102
|
+
'TEXT',
|
103
|
+
value_to_replace_existing_entries=json.dumps({
|
104
|
+
'max_restarts_on_errors': 0,
|
105
|
+
}))
|
106
|
+
|
107
|
+
# `job_info` contains the mapping from job_id to the job_name.
|
108
|
+
# In the future, it may contain more information about each job.
|
109
|
+
cursor.execute("""\
|
110
|
+
CREATE TABLE IF NOT EXISTS job_info (
|
111
|
+
spot_job_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
112
|
+
name TEXT)""")
|
113
|
+
conn.commit()
|
114
|
+
|
115
|
+
|
116
|
+
# Module-level connection/cursor; thread-safe as the module is only imported
|
117
|
+
# once.
|
118
|
+
def _get_db_path() -> str:
|
119
|
+
"""Workaround to collapse multi-step Path ops for type checker.
|
120
|
+
Ensures _DB_PATH is str, avoiding Union[Path, str] inference.
|
121
|
+
"""
|
122
|
+
path = pathlib.Path('~/.sky/spot_jobs.db')
|
123
|
+
path = path.expanduser().absolute()
|
124
|
+
path.parents[0].mkdir(parents=True, exist_ok=True)
|
125
|
+
return str(path)
|
126
|
+
|
127
|
+
|
128
|
+
_DB_PATH = _get_db_path()
|
129
|
+
db_utils.SQLiteConn(_DB_PATH, create_table)
|
115
130
|
|
116
131
|
# job_duration is the time a job actually runs (including the
|
117
132
|
# setup duration) before last_recover, excluding the provision
|
@@ -14,7 +14,7 @@ import shutil
|
|
14
14
|
import textwrap
|
15
15
|
import time
|
16
16
|
import typing
|
17
|
-
from typing import Any, Dict, List, Optional, Tuple, Union
|
17
|
+
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
18
18
|
|
19
19
|
import colorama
|
20
20
|
import filelock
|
@@ -487,6 +487,7 @@ def stream_logs(job_id: Optional[int],
|
|
487
487
|
job_id = managed_job_state.get_latest_job_id()
|
488
488
|
if job_id is None:
|
489
489
|
return 'No managed job found.'
|
490
|
+
|
490
491
|
if controller:
|
491
492
|
if job_id is None:
|
492
493
|
assert job_name is not None
|
@@ -494,16 +495,22 @@ def stream_logs(job_id: Optional[int],
|
|
494
495
|
# We manually filter the jobs by name, instead of using
|
495
496
|
# get_nonterminal_job_ids_by_name, as with `controller=True`, we
|
496
497
|
# should be able to show the logs for jobs in terminal states.
|
497
|
-
|
498
|
-
|
499
|
-
|
498
|
+
managed_job_ids: Set[int] = {
|
499
|
+
job['job_id']
|
500
|
+
for job in managed_jobs
|
501
|
+
if job['job_name'] == job_name
|
502
|
+
}
|
503
|
+
if len(managed_job_ids) == 0:
|
500
504
|
return f'No managed job found with name {job_name!r}.'
|
501
|
-
if len(
|
502
|
-
job_ids_str = ', '.join(
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
505
|
+
if len(managed_job_ids) > 1:
|
506
|
+
job_ids_str = ', '.join(
|
507
|
+
str(job_id) for job_id in managed_job_ids)
|
508
|
+
with ux_utils.print_exception_no_traceback():
|
509
|
+
raise ValueError(
|
510
|
+
f'Multiple managed jobs found with name {job_name!r} '
|
511
|
+
f'(Job IDs: {job_ids_str}). Please specify the job_id '
|
512
|
+
'instead.')
|
513
|
+
job_id = managed_job_ids.pop()
|
507
514
|
assert job_id is not None, (job_id, job_name)
|
508
515
|
# TODO: keep the following code sync with
|
509
516
|
# job_lib.JobLibCodeGen.tail_logs, we do not directly call that function
|
@@ -849,6 +856,7 @@ class ManagedJobCodeGen:
|
|
849
856
|
|
850
857
|
from sky.skylet import job_lib, log_lib
|
851
858
|
from sky.skylet import constants
|
859
|
+
from sky.utils import ux_utils
|
852
860
|
try:
|
853
861
|
from sky.jobs.utils import stream_logs_by_id
|
854
862
|
except ImportError:
|