skypilot-nightly 1.0.0.dev20241203__tar.gz → 1.0.0.dev20241205__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.
Files changed (304) hide show
  1. {skypilot_nightly-1.0.0.dev20241203/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20241205}/PKG-INFO +3 -2
  2. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/README.md +2 -1
  3. {skypilot_nightly-1.0.0.dev20241203/sky/setup_files → skypilot_nightly-1.0.0.dev20241205}/setup.py +12 -124
  4. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/__init__.py +4 -2
  5. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/backend.py +42 -15
  6. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/backend_utils.py +143 -9
  7. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/cloud_vm_ray_backend.py +103 -25
  8. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/local_docker_backend.py +11 -7
  9. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/cli.py +11 -2
  10. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/common.py +2 -2
  11. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/core.py +25 -18
  12. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/exceptions.py +7 -0
  13. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/execution.py +30 -11
  14. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/global_user_state.py +23 -10
  15. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/controller.py +28 -8
  16. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/core.py +61 -35
  17. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/recovery_strategy.py +2 -1
  18. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/state.py +33 -1
  19. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/utils.py +16 -2
  20. skypilot_nightly-1.0.0.dev20241205/sky/setup_files/dependencies.py +141 -0
  21. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205/sky/setup_files}/setup.py +12 -124
  22. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/constants.py +36 -11
  23. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/log_lib.py +3 -1
  24. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/log_lib.pyi +3 -0
  25. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/kubernetes-ray.yml.j2 +4 -2
  26. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/common_utils.py +19 -0
  27. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/controller_utils.py +60 -98
  28. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205/skypilot_nightly.egg-info}/PKG-INFO +3 -2
  29. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/skypilot_nightly.egg-info/SOURCES.txt +1 -0
  30. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_smoke.py +93 -71
  31. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/LICENSE +0 -0
  32. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/MANIFEST.in +0 -0
  33. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/pyproject.toml +0 -0
  34. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/setup.cfg +0 -0
  35. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/__init__.py +0 -0
  36. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/aws.py +0 -0
  37. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/azure.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/cloudflare.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/common.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/cudo.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/docker.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/gcp.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/ibm.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/kubernetes.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/oci.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/runpod.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/adaptors/vsphere.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/admin_policy.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/authentication.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/__init__.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/docker_utils.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/backends/wheel_utils.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/benchmark/__init__.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/benchmark/benchmark_state.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/benchmark/benchmark_utils.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/check.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/cloud_stores.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/__init__.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/aws.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/azure.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/cloud.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/cloud_registry.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/cudo.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/fluidstack.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/gcp.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/ibm.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/kubernetes.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/lambda_cloud.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/oci.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/paperspace.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/runpod.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/scp.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/__init__.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/config.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/constants.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/__init__.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/aws_utils.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/azure_utils.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/gcp_utils.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/oci_utils.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/utils/scp_utils.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/clouds/vsphere.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/dag.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/__init__.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/data_transfer.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/data_utils.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/mounting_utils.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/storage.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/data/storage_utils.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/__init__.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/constants.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/dashboard/dashboard.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/dashboard/static/favicon.ico +0 -0
  116. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/jobs/dashboard/templates/index.html +0 -0
  117. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/optimizer.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/__init__.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/aws/__init__.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/aws/config.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/aws/instance.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/aws/utils.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/azure/__init__.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/azure/azure-config-template.json +0 -0
  125. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/azure/config.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/azure/instance.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/common.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/constants.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/__init__.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/config.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/cudo_machine_type.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/cudo_utils.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/cudo_wrapper.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/cudo/instance.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/docker_utils.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/fluidstack/__init__.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/fluidstack/config.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/fluidstack/instance.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/__init__.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/config.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/constants.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/instance.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/instance_utils.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/gcp/mig_utils.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/instance_setup.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/__init__.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/config.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/instance.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  151. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  152. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/network.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/network_utils.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/kubernetes/utils.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/lambda_cloud/__init__.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/lambda_cloud/config.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/lambda_cloud/instance.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/logging.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/metadata_utils.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/oci/__init__.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/oci/config.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/oci/instance.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/oci/query_utils.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/paperspace/__init__.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/paperspace/config.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/paperspace/constants.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/paperspace/instance.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/paperspace/utils.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/provisioner.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/runpod/__init__.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/runpod/config.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/runpod/instance.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/runpod/utils.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/__init__.py +0 -0
  176. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/__init__.py +0 -0
  177. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/custom_script.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/id_generator.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/service_manager.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/common/vim_utils.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/config.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/instance.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/provision/vsphere/vsphere_utils.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/resources.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/__init__.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/autoscalers.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/constants.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/controller.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/core.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/load_balancer.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/load_balancing_policies.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/replica_managers.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/serve_state.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/serve_utils.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/service.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/serve/service_spec.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/setup_files/MANIFEST.in +0 -0
  204. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/sky_logging.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/LICENSE +0 -0
  206. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/__init__.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/attempt_skylet.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/autostop_lib.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/configs.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/events.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/job_lib.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/__init__.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/command_runner.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/ibm/__init__.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/ibm/node_provider.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/ibm/utils.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/scp/__init__.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/scp/config.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/providers/scp/node_provider.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/__init__.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  223. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/cli.py.patch +0 -0
  224. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  225. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  226. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  227. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/updater.py.patch +0 -0
  228. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/ray_patches/worker.py.patch +0 -0
  229. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/skylet.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skylet/subprocess_daemon.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/skypilot_config.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/status_lib.py +0 -0
  233. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/task.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/aws-ray.yml.j2 +0 -0
  235. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/azure-ray.yml.j2 +0 -0
  236. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/cudo-ray.yml.j2 +0 -0
  237. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  238. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/gcp-ray.yml.j2 +0 -0
  239. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/ibm-ray.yml.j2 +0 -0
  240. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/jobs-controller.yaml.j2 +0 -0
  241. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  242. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  243. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  244. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  245. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/lambda-ray.yml.j2 +0 -0
  246. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/local-ray.yml.j2 +0 -0
  247. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/oci-ray.yml.j2 +0 -0
  248. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/paperspace-ray.yml.j2 +0 -0
  249. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/runpod-ray.yml.j2 +0 -0
  250. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/scp-ray.yml.j2 +0 -0
  251. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  252. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/templates/vsphere-ray.yml.j2 +0 -0
  253. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/usage/__init__.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/usage/constants.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/usage/usage_lib.py +0 -0
  256. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/__init__.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/accelerator_registry.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/admin_policy_utils.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/cli_utils/__init__.py +0 -0
  260. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/cli_utils/status_utils.py +0 -0
  261. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/cluster_yaml_utils.py +0 -0
  262. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/command_runner.py +0 -0
  263. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/command_runner.pyi +0 -0
  264. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/control_master_utils.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/dag_utils.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/db_utils.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/env_options.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/__init__.py +0 -0
  269. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/create_cluster.sh +0 -0
  270. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  271. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  272. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  274. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  276. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  277. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  278. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/kubernetes_enums.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/log_utils.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/resources_utils.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/rich_utils.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/schemas.py +0 -0
  284. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/subprocess_utils.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/timeline.py +0 -0
  286. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/ux_utils.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/sky/utils/validator.py +0 -0
  288. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  289. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  290. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/skypilot_nightly.egg-info/requires.txt +0 -0
  291. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/skypilot_nightly.egg-info/top_level.txt +0 -0
  292. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_api.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_cli.py +0 -0
  294. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_config.py +0 -0
  295. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_global_user_state.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_jobs.py +0 -0
  297. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_jobs_and_serve.py +0 -0
  298. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_list_accelerators.py +0 -0
  299. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_optimizer_dryruns.py +0 -0
  300. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_optimizer_random_dag.py +0 -0
  301. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_serve_autoscaler.py +0 -0
  302. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_storage.py +0 -0
  303. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_wheels.py +0 -0
  304. {skypilot_nightly-1.0.0.dev20241203 → skypilot_nightly-1.0.0.dev20241205}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20241203
3
+ Version: 1.0.0.dev20241205
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -291,10 +291,11 @@ SkyPilot then performs the heavy-lifting for you, including:
291
291
  Refer to [Quickstart](https://skypilot.readthedocs.io/en/latest/getting-started/quickstart.html) to get started with SkyPilot.
292
292
 
293
293
  ## More Information
294
- To learn more, see our [documentation](https://skypilot.readthedocs.io/en/latest/), [blog](https://blog.skypilot.co/), and [community integrations](https://blog.skypilot.co/community/).
294
+ To learn more, see [Concept: Sky Computing](https://docs.skypilot.co/en/latest/sky-computing.html), [SkyPilot docs](https://skypilot.readthedocs.io/en/latest/), and [SkyPilot blog](https://blog.skypilot.co/).
295
295
 
296
296
  <!-- Keep this section in sync with index.rst in SkyPilot Docs -->
297
297
  Runnable examples:
298
+ - [**AI Gallery**](https://docs.skypilot.co/en/latest/gallery/index.html)
298
299
  - LLMs on SkyPilot
299
300
  - [Llama 3.2: lightweight and vision models](./llm/llama-3_2/)
300
301
  - [Pixtral](./llm/pixtral/)
@@ -155,10 +155,11 @@ SkyPilot then performs the heavy-lifting for you, including:
155
155
  Refer to [Quickstart](https://skypilot.readthedocs.io/en/latest/getting-started/quickstart.html) to get started with SkyPilot.
156
156
 
157
157
  ## More Information
158
- To learn more, see our [documentation](https://skypilot.readthedocs.io/en/latest/), [blog](https://blog.skypilot.co/), and [community integrations](https://blog.skypilot.co/community/).
158
+ To learn more, see [Concept: Sky Computing](https://docs.skypilot.co/en/latest/sky-computing.html), [SkyPilot docs](https://skypilot.readthedocs.io/en/latest/), and [SkyPilot blog](https://blog.skypilot.co/).
159
159
 
160
160
  <!-- Keep this section in sync with index.rst in SkyPilot Docs -->
161
161
  Runnable examples:
162
+ - [**AI Gallery**](https://docs.skypilot.co/en/latest/gallery/index.html)
162
163
  - LLMs on SkyPilot
163
164
  - [Llama 3.2: lightweight and vision models](./llm/llama-3_2/)
164
165
  - [Pixtral](./llm/pixtral/)
@@ -18,19 +18,28 @@ import io
18
18
  import os
19
19
  import platform
20
20
  import re
21
+ import runpy
21
22
  import subprocess
22
23
  import sys
23
- from typing import Dict, List
24
24
 
25
25
  import setuptools
26
26
 
27
+ # __file__ is setup.py at the root of the repo. We shouldn't assume it's a
28
+ # symlink - e.g. in the sdist it's resolved to a normal file.
27
29
  ROOT_DIR = os.path.dirname(__file__)
30
+ DEPENDENCIES_FILE_PATH = os.path.join(ROOT_DIR, 'sky', 'setup_files',
31
+ 'dependencies.py')
28
32
  INIT_FILE_PATH = os.path.join(ROOT_DIR, 'sky', '__init__.py')
29
33
  _COMMIT_FAILURE_MESSAGE = (
30
34
  'WARNING: SkyPilot fail to {verb} the commit hash in '
31
35
  f'{INIT_FILE_PATH!r} (SkyPilot can still be normally used): '
32
36
  '{error}')
33
37
 
38
+ # setuptools does not include the script dir on the search path, so we can't
39
+ # just do `import dependencies`. Instead, use runpy to manually load it. Note:
40
+ # dependencies here is a dict, not a module, so we access it by subscripting.
41
+ dependencies = runpy.run_path(DEPENDENCIES_FILE_PATH)
42
+
34
43
  original_init_content = None
35
44
 
36
45
  system = platform.system()
@@ -130,127 +139,6 @@ def parse_readme(readme: str) -> str:
130
139
  return readme
131
140
 
132
141
 
133
- install_requires = [
134
- 'wheel',
135
- 'cachetools',
136
- # NOTE: ray requires click>=7.0.
137
- 'click >= 7.0',
138
- 'colorama',
139
- 'cryptography',
140
- # Jinja has a bug in older versions because of the lack of pinning
141
- # the version of the underlying markupsafe package. See:
142
- # https://github.com/pallets/jinja/issues/1585
143
- 'jinja2 >= 3.0',
144
- 'jsonschema',
145
- 'networkx',
146
- 'pandas>=1.3.0',
147
- 'pendulum',
148
- # PrettyTable with version >=2.0.0 is required for the support of
149
- # `add_rows` method.
150
- 'PrettyTable >= 2.0.0',
151
- 'python-dotenv',
152
- 'rich',
153
- 'tabulate',
154
- # Light weight requirement, can be replaced with "typing" once
155
- # we deprecate Python 3.7 (this will take a while).
156
- 'typing_extensions',
157
- 'filelock >= 3.6.0',
158
- 'packaging',
159
- 'psutil',
160
- 'pulp',
161
- # Cython 3.0 release breaks PyYAML 5.4.* (https://github.com/yaml/pyyaml/issues/601)
162
- # <= 3.13 may encounter https://github.com/ultralytics/yolov5/issues/414
163
- 'pyyaml > 3.13, != 5.4.*',
164
- 'requests',
165
- ]
166
-
167
- local_ray = [
168
- # Lower version of ray will cause dependency conflict for
169
- # click/grpcio/protobuf.
170
- # Excluded 2.6.0 as it has a bug in the cluster launcher:
171
- # https://github.com/ray-project/ray/releases/tag/ray-2.6.1
172
- 'ray[default] >= 2.2.0, != 2.6.0',
173
- ]
174
-
175
- remote = [
176
- # Adopted from ray's setup.py: https://github.com/ray-project/ray/blob/ray-2.4.0/python/setup.py
177
- # SkyPilot: != 1.48.0 is required to avoid the error where ray dashboard fails to start when
178
- # ray start is called (#2054).
179
- # Tracking issue: https://github.com/ray-project/ray/issues/30984
180
- "grpcio >= 1.32.0, <= 1.49.1, != 1.48.0; python_version < '3.10' and sys_platform == 'darwin'", # noqa:E501
181
- "grpcio >= 1.42.0, <= 1.49.1, != 1.48.0; python_version >= '3.10' and sys_platform == 'darwin'", # noqa:E501
182
- # Original issue: https://github.com/ray-project/ray/issues/33833
183
- "grpcio >= 1.32.0, <= 1.51.3, != 1.48.0; python_version < '3.10' and sys_platform != 'darwin'", # noqa:E501
184
- "grpcio >= 1.42.0, <= 1.51.3, != 1.48.0; python_version >= '3.10' and sys_platform != 'darwin'", # noqa:E501
185
- # Adopted from ray's setup.py:
186
- # https://github.com/ray-project/ray/blob/ray-2.9.3/python/setup.py#L343
187
- 'protobuf >= 3.15.3, != 3.19.5',
188
- # Some pydantic versions are not compatible with ray. Adopted from ray's
189
- # setup.py: https://github.com/ray-project/ray/blob/ray-2.9.3/python/setup.py#L254
190
- 'pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<3',
191
- ]
192
-
193
- # NOTE: Change the templates/jobs-controller.yaml.j2 file if any of the
194
- # following packages dependencies are changed.
195
- aws_dependencies = [
196
- # botocore does not work with urllib3>=2.0.0, according to https://github.com/boto/botocore/issues/2926
197
- # We have to explicitly pin the version to optimize the time for
198
- # poetry install. See https://github.com/orgs/python-poetry/discussions/7937
199
- 'urllib3<2',
200
- # NOTE: this installs CLI V1. To use AWS SSO (e.g., `aws sso login`), users
201
- # should instead use CLI V2 which is not pip-installable. See
202
- # https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html.
203
- 'awscli>=1.27.10',
204
- 'botocore>=1.29.10',
205
- 'boto3>=1.26.1',
206
- # NOTE: required by awscli. To avoid ray automatically installing
207
- # the latest version.
208
- 'colorama < 0.4.5',
209
- ]
210
-
211
- extras_require: Dict[str, List[str]] = {
212
- 'aws': aws_dependencies,
213
- # TODO(zongheng): azure-cli is huge and takes a long time to install.
214
- # Tracked in: https://github.com/Azure/azure-cli/issues/7387
215
- # azure-identity is needed in node_provider.
216
- # We need azure-identity>=1.13.0 to enable the customization of the
217
- # timeout of AzureCliCredential.
218
- 'azure': [
219
- 'azure-cli>=2.65.0', 'azure-core>=1.31.0', 'azure-identity>=1.19.0',
220
- 'azure-mgmt-network>=27.0.0', 'azure-mgmt-compute>=33.0.0',
221
- 'azure-storage-blob>=12.23.1', 'msgraph-sdk'
222
- ] + local_ray,
223
- # We need google-api-python-client>=2.69.0 to enable 'discardLocalSsd'
224
- # parameter for stopping instances.
225
- # Reference: https://github.com/googleapis/google-api-python-client/commit/f6e9d3869ed605b06f7cbf2e8cf2db25108506e6
226
- 'gcp': ['google-api-python-client>=2.69.0', 'google-cloud-storage'],
227
- 'ibm': [
228
- 'ibm-cloud-sdk-core', 'ibm-vpc', 'ibm-platform-services', 'ibm-cos-sdk'
229
- ] + local_ray,
230
- 'docker': ['docker'] + local_ray,
231
- 'lambda': local_ray,
232
- 'cloudflare': aws_dependencies,
233
- 'scp': local_ray,
234
- 'oci': ['oci'] + local_ray,
235
- 'kubernetes': ['kubernetes>=20.0.0'],
236
- 'remote': remote,
237
- 'runpod': ['runpod>=1.5.1'],
238
- 'fluidstack': [], # No dependencies needed for fluidstack
239
- 'cudo': ['cudo-compute>=0.1.10'],
240
- 'paperspace': [], # No dependencies needed for paperspace
241
- 'vsphere': [
242
- 'pyvmomi==8.0.1.0.2',
243
- # vsphere-automation-sdk is also required, but it does not have
244
- # pypi release, which cause failure of our pypi release.
245
- # https://peps.python.org/pep-0440/#direct-references
246
- # We have the instruction for its installation in our
247
- # docs instead.
248
- # 'vsphere-automation-sdk @ git+https://github.com/vmware/vsphere-automation-sdk-python.git@v8.0.1.0'
249
- ],
250
- }
251
-
252
- extras_require['all'] = sum(extras_require.values(), [])
253
-
254
142
  long_description = ''
255
143
  readme_filepath = 'README.md'
256
144
  # When sky/backends/wheel_utils.py builds wheels, it will not contain the
@@ -277,8 +165,8 @@ setuptools.setup(
277
165
  long_description_content_type='text/markdown',
278
166
  setup_requires=['wheel'],
279
167
  requires_python='>=3.7',
280
- install_requires=install_requires,
281
- extras_require=extras_require,
168
+ install_requires=dependencies['install_requires'],
169
+ extras_require=dependencies['extras_require'],
282
170
  entry_points={
283
171
  'console_scripts': ['sky = sky.cli:cli'],
284
172
  },
@@ -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 = '747382a7cf75c691c91846efe708ce25b2a3aeb8'
8
+ _SKYPILOT_COMMIT_SHA = '6e5083293f0d9a9d069d51274c57f0e59e47e5ce'
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.dev20241203'
38
+ __version__ = '1.0.0.dev20241205'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -105,6 +105,7 @@ from sky.data import StorageMode
105
105
  from sky.data import StoreType
106
106
  from sky.execution import exec # pylint: disable=redefined-builtin
107
107
  from sky.execution import launch
108
+ from sky.jobs import ManagedJobStatus
108
109
  # TODO (zhwu): These imports are for backward compatibility, and spot APIs
109
110
  # should be called with `sky.spot.xxx` instead. Remove in release 0.8.0
110
111
  from sky.jobs.core import spot_cancel
@@ -163,6 +164,7 @@ __all__ = [
163
164
  'StoreType',
164
165
  'ClusterStatus',
165
166
  'JobStatus',
167
+ 'ManagedJobStatus',
166
168
  # APIs
167
169
  'Dag',
168
170
  'Task',
@@ -45,20 +45,45 @@ class Backend(Generic[_ResourceHandleType]):
45
45
  @timeline.event
46
46
  @usage_lib.messages.usage.update_runtime('provision')
47
47
  def provision(
48
- self,
49
- task: 'task_lib.Task',
50
- to_provision: Optional['resources.Resources'],
51
- dryrun: bool,
52
- stream_logs: bool,
53
- cluster_name: Optional[str] = None,
54
- retry_until_up: bool = False) -> Optional[_ResourceHandleType]:
48
+ self,
49
+ task: 'task_lib.Task',
50
+ to_provision: Optional['resources.Resources'],
51
+ dryrun: bool,
52
+ stream_logs: bool,
53
+ cluster_name: Optional[str] = None,
54
+ retry_until_up: bool = False,
55
+ skip_unnecessary_provisioning: bool = False,
56
+ ) -> Optional[_ResourceHandleType]:
57
+ """Provisions resources for the given task.
58
+
59
+ Args:
60
+ task: The task to provision resources for.
61
+ to_provision: Resource config to provision. Should only be None if
62
+ cluster_name refers to an existing cluster, whose resources will
63
+ be used.
64
+ dryrun: If True, don't actually provision anything.
65
+ stream_logs: If True, stream additional logs to console.
66
+ cluster_name: Name of the cluster to provision. If None, a name will
67
+ be auto-generated. If the name refers to an existing cluster,
68
+ the existing cluster will be reused and re-provisioned.
69
+ retry_until_up: If True, retry provisioning until resources are
70
+ successfully launched.
71
+ skip_if_no_cluster_updates: If True, compare the cluster config to
72
+ the existing cluster_name's config. Skip provisioning if no
73
+ updates are needed for the existing cluster.
74
+
75
+ Returns:
76
+ A ResourceHandle object for the provisioned resources, or None if
77
+ dryrun is True.
78
+ """
55
79
  if cluster_name is None:
56
80
  cluster_name = sky.backends.backend_utils.generate_cluster_name()
57
81
  usage_lib.record_cluster_name_for_current_operation(cluster_name)
58
82
  usage_lib.messages.usage.update_actual_task(task)
59
83
  with rich_utils.safe_status(ux_utils.spinner_message('Launching')):
60
84
  return self._provision(task, to_provision, dryrun, stream_logs,
61
- cluster_name, retry_until_up)
85
+ cluster_name, retry_until_up,
86
+ skip_unnecessary_provisioning)
62
87
 
63
88
  @timeline.event
64
89
  @usage_lib.messages.usage.update_runtime('sync_workdir')
@@ -126,13 +151,15 @@ class Backend(Generic[_ResourceHandleType]):
126
151
 
127
152
  # --- Implementations of the APIs ---
128
153
  def _provision(
129
- self,
130
- task: 'task_lib.Task',
131
- to_provision: Optional['resources.Resources'],
132
- dryrun: bool,
133
- stream_logs: bool,
134
- cluster_name: str,
135
- retry_until_up: bool = False) -> Optional[_ResourceHandleType]:
154
+ self,
155
+ task: 'task_lib.Task',
156
+ to_provision: Optional['resources.Resources'],
157
+ dryrun: bool,
158
+ stream_logs: bool,
159
+ cluster_name: str,
160
+ retry_until_up: bool = False,
161
+ skip_unnecessary_provisioning: bool = False,
162
+ ) -> Optional[_ResourceHandleType]:
136
163
  raise NotImplementedError
137
164
 
138
165
  def _sync_workdir(self, handle: _ResourceHandleType, workdir: Path) -> None:
@@ -3,6 +3,7 @@ from datetime import datetime
3
3
  import enum
4
4
  import fnmatch
5
5
  import functools
6
+ import hashlib
6
7
  import os
7
8
  import pathlib
8
9
  import pprint
@@ -644,11 +645,17 @@ def write_cluster_config(
644
645
  keep_launch_fields_in_existing_config: bool = True) -> Dict[str, str]:
645
646
  """Fills in cluster configuration templates and writes them out.
646
647
 
647
- Returns: {provisioner: path to yaml, the provisioning spec}.
648
- 'provisioner' can be
649
- - 'ray'
650
- - 'tpu-create-script' (if TPU is requested)
651
- - 'tpu-delete-script' (if TPU is requested)
648
+ Returns:
649
+ Dict with the following keys:
650
+ - 'ray': Path to the generated Ray yaml config file
651
+ - 'cluster_name': Name of the cluster
652
+ - 'cluster_name_on_cloud': Name of the cluster as it appears in the
653
+ cloud provider
654
+ - 'config_hash': Hash of the cluster config and file mounts contents.
655
+ Can be missing if we unexpectedly failed to calculate the hash for
656
+ some reason. In that case we will continue without the optimization to
657
+ skip provisioning.
658
+
652
659
  Raises:
653
660
  exceptions.ResourcesUnavailableError: if the region/zones requested does
654
661
  not appear in the catalog, or an ssh_proxy_command is specified but
@@ -903,6 +910,12 @@ def write_cluster_config(
903
910
  if dryrun:
904
911
  # If dryrun, return the unfinished tmp yaml path.
905
912
  config_dict['ray'] = tmp_yaml_path
913
+ try:
914
+ config_dict['config_hash'] = _deterministic_cluster_yaml_hash(
915
+ tmp_yaml_path)
916
+ except Exception as e: # pylint: disable=broad-except
917
+ logger.warning(f'Failed to calculate config_hash: {e}')
918
+ logger.debug('Full exception:', exc_info=e)
906
919
  return config_dict
907
920
  _add_auth_to_cluster_config(cloud, tmp_yaml_path)
908
921
 
@@ -925,6 +938,17 @@ def write_cluster_config(
925
938
  yaml_config = common_utils.read_yaml(tmp_yaml_path)
926
939
  config_dict['cluster_name_on_cloud'] = yaml_config['cluster_name']
927
940
 
941
+ # Make sure to do this before we optimize file mounts. Optimization is
942
+ # non-deterministic, but everything else before this point should be
943
+ # deterministic.
944
+ try:
945
+ config_dict['config_hash'] = _deterministic_cluster_yaml_hash(
946
+ tmp_yaml_path)
947
+ except Exception as e: # pylint: disable=broad-except
948
+ logger.warning('Failed to calculate config_hash: '
949
+ f'{common_utils.format_exception(e)}')
950
+ logger.debug('Full exception:', exc_info=e)
951
+
928
952
  # Optimization: copy the contents of source files in file_mounts to a
929
953
  # special dir, and upload that as the only file_mount instead. Delay
930
954
  # calling this optimization until now, when all source files have been
@@ -1033,6 +1057,115 @@ def _count_healthy_nodes_from_ray(output: str,
1033
1057
  return ready_head, ready_workers
1034
1058
 
1035
1059
 
1060
+ @timeline.event
1061
+ def _deterministic_cluster_yaml_hash(yaml_path: str) -> str:
1062
+ """Hash the cluster yaml and contents of file mounts to a unique string.
1063
+
1064
+ Two invocations of this function should return the same string if and only
1065
+ if the contents of the yaml are the same and the file contents of all the
1066
+ file_mounts specified in the yaml are the same.
1067
+
1068
+ Limitations:
1069
+ - This function can be expensive if the file mounts are large. (E.g. a few
1070
+ seconds for ~1GB.) This should be okay since we expect that the
1071
+ file_mounts in the cluster yaml (the wheel and cloud credentials) will be
1072
+ small.
1073
+ - Symbolic links are not explicitly handled. Some symbolic link changes may
1074
+ not be detected.
1075
+
1076
+ Implementation: We create a byte sequence that captures the state of the
1077
+ yaml file and all the files in the file mounts, then hash the byte sequence.
1078
+
1079
+ The format of the byte sequence is:
1080
+ 32 bytes - sha256 hash of the yaml file
1081
+ for each file mount:
1082
+ file mount remote destination (UTF-8), \0
1083
+ if the file mount source is a file:
1084
+ 'file' encoded to UTF-8
1085
+ 32 byte sha256 hash of the file contents
1086
+ if the file mount source is a directory:
1087
+ 'dir' encoded to UTF-8
1088
+ for each directory and subdirectory withinin the file mount (starting from
1089
+ the root and descending recursively):
1090
+ name of the directory (UTF-8), \0
1091
+ name of each subdirectory within the directory (UTF-8) terminated by \0
1092
+ \0
1093
+ for each file in the directory:
1094
+ name of the file (UTF-8), \0
1095
+ 32 bytes - sha256 hash of the file contents
1096
+ \0
1097
+ if the file mount source is something else or does not exist, nothing
1098
+ \0\0
1099
+
1100
+ Rather than constructing the whole byte sequence, which may be quite large,
1101
+ we construct it incrementally by using hash.update() to add new bytes.
1102
+ """
1103
+
1104
+ def _hash_file(path: str) -> bytes:
1105
+ return common_utils.hash_file(path, 'sha256').digest()
1106
+
1107
+ config_hash = hashlib.sha256()
1108
+
1109
+ config_hash.update(_hash_file(yaml_path))
1110
+
1111
+ yaml_config = common_utils.read_yaml(yaml_path)
1112
+ file_mounts = yaml_config.get('file_mounts', {})
1113
+ # Remove the file mounts added by the newline.
1114
+ if '' in file_mounts:
1115
+ assert file_mounts[''] == '', file_mounts['']
1116
+ file_mounts.pop('')
1117
+
1118
+ for dst, src in sorted(file_mounts.items()):
1119
+ expanded_src = os.path.expanduser(src)
1120
+ config_hash.update(dst.encode('utf-8') + b'\0')
1121
+
1122
+ # If the file mount source is a symlink, this should be true. In that
1123
+ # case we hash the contents of the symlink destination.
1124
+ if os.path.isfile(expanded_src):
1125
+ config_hash.update('file'.encode('utf-8'))
1126
+ config_hash.update(_hash_file(expanded_src))
1127
+
1128
+ # This can also be a symlink to a directory. os.walk will treat it as a
1129
+ # normal directory and list the contents of the symlink destination.
1130
+ elif os.path.isdir(expanded_src):
1131
+ config_hash.update('dir'.encode('utf-8'))
1132
+
1133
+ # Aside from expanded_src, os.walk will list symlinks to directories
1134
+ # but will not recurse into them.
1135
+ for (dirpath, dirnames, filenames) in os.walk(expanded_src):
1136
+ config_hash.update(dirpath.encode('utf-8') + b'\0')
1137
+
1138
+ # Note: inplace sort will also affect the traversal order of
1139
+ # os.walk. We need it so that the os.walk order is
1140
+ # deterministic.
1141
+ dirnames.sort()
1142
+ # This includes symlinks to directories. os.walk will recurse
1143
+ # into all the directories but not the symlinks. We don't hash
1144
+ # the link destination, so if a symlink to a directory changes,
1145
+ # we won't notice.
1146
+ for dirname in dirnames:
1147
+ config_hash.update(dirname.encode('utf-8') + b'\0')
1148
+ config_hash.update(b'\0')
1149
+
1150
+ filenames.sort()
1151
+ # This includes symlinks to files. We could hash the symlink
1152
+ # destination itself but instead just hash the destination
1153
+ # contents.
1154
+ for filename in filenames:
1155
+ config_hash.update(filename.encode('utf-8') + b'\0')
1156
+ config_hash.update(
1157
+ _hash_file(os.path.join(dirpath, filename)))
1158
+ config_hash.update(b'\0')
1159
+
1160
+ else:
1161
+ logger.debug(
1162
+ f'Unexpected file_mount that is not a file or dir: {src}')
1163
+
1164
+ config_hash.update(b'\0\0')
1165
+
1166
+ return config_hash.hexdigest()
1167
+
1168
+
1036
1169
  def get_docker_user(ip: str, cluster_config_file: str) -> str:
1037
1170
  """Find docker container username."""
1038
1171
  ssh_credentials = ssh_credential_from_yaml(cluster_config_file)
@@ -1612,14 +1745,14 @@ def check_can_clone_disk_and_override_task(
1612
1745
  The task to use and the resource handle of the source cluster.
1613
1746
 
1614
1747
  Raises:
1615
- ValueError: If the source cluster does not exist.
1748
+ exceptions.ClusterDoesNotExist: If the source cluster does not exist.
1616
1749
  exceptions.NotSupportedError: If the source cluster is not valid or the
1617
1750
  task is not compatible to clone disk from the source cluster.
1618
1751
  """
1619
1752
  source_cluster_status, handle = refresh_cluster_status_handle(cluster_name)
1620
1753
  if source_cluster_status is None:
1621
1754
  with ux_utils.print_exception_no_traceback():
1622
- raise ValueError(
1755
+ raise exceptions.ClusterDoesNotExist(
1623
1756
  f'Cannot find cluster {cluster_name!r} to clone disk from.')
1624
1757
 
1625
1758
  if not isinstance(handle, backends.CloudVmRayResourceHandle):
@@ -2136,7 +2269,7 @@ def check_cluster_available(
2136
2269
  """Check if the cluster is available.
2137
2270
 
2138
2271
  Raises:
2139
- ValueError: if the cluster does not exist.
2272
+ exceptions.ClusterDoesNotExist: if the cluster does not exist.
2140
2273
  exceptions.ClusterNotUpError: if the cluster is not UP.
2141
2274
  exceptions.NotSupportedError: if the cluster is not based on
2142
2275
  CloudVmRayBackend.
@@ -2201,7 +2334,8 @@ def check_cluster_available(
2201
2334
  error_msg += message
2202
2335
 
2203
2336
  with ux_utils.print_exception_no_traceback():
2204
- raise ValueError(f'{colorama.Fore.YELLOW}{error_msg}{reset}')
2337
+ raise exceptions.ClusterDoesNotExist(
2338
+ f'{colorama.Fore.YELLOW}{error_msg}{reset}')
2205
2339
  assert cluster_status is not None, 'handle is not None but status is None'
2206
2340
  backend = get_backend_from_handle(handle)
2207
2341
  if check_cloud_vm_ray_backend and not isinstance(