skypilot-nightly 1.0.0.dev20250206__tar.gz → 1.0.0.dev20250208__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 (326) hide show
  1. {skypilot_nightly-1.0.0.dev20250206/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250208}/PKG-INFO +2 -2
  2. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/README.md +1 -1
  3. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/__init__.py +2 -2
  4. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/authentication.py +1 -1
  5. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/backend_utils.py +1 -6
  6. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/cloud_vm_ray_backend.py +6 -12
  7. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/do.py +6 -0
  8. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +6 -0
  9. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/exceptions.py +8 -0
  10. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/controller.py +3 -5
  11. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/core.py +0 -21
  12. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/recovery_strategy.py +2 -2
  13. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/state.py +91 -26
  14. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/utils.py +28 -50
  15. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/azure/instance.py +0 -31
  16. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/constants.py +2 -2
  17. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/common_utils.py +1 -2
  18. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/controller_utils.py +1 -5
  19. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/dag_utils.py +2 -2
  20. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/log_utils.py +2 -1
  21. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/schemas.py +0 -19
  22. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208/skypilot_nightly.egg-info}/PKG-INFO +2 -2
  23. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_config.py +3 -3
  24. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/LICENSE +0 -0
  25. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/MANIFEST.in +0 -0
  26. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/pyproject.toml +0 -0
  27. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/setup.cfg +0 -0
  28. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/setup.py +0 -0
  29. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/__init__.py +0 -0
  30. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/aws.py +0 -0
  31. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/azure.py +0 -0
  32. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/cloudflare.py +0 -0
  33. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/common.py +0 -0
  34. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/cudo.py +0 -0
  35. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/do.py +0 -0
  36. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/docker.py +0 -0
  37. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/gcp.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/ibm.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/kubernetes.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/oci.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/runpod.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/vast.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/adaptors/vsphere.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/admin_policy.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/__init__.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/backend.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/docker_utils.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/local_docker_backend.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/backends/wheel_utils.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/benchmark/__init__.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/benchmark/benchmark_state.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/benchmark/benchmark_utils.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/check.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/cli.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/cloud_stores.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/__init__.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/aws.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/azure.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/cloud.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/cloud_registry.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/cudo.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/fluidstack.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/gcp.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/ibm.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/kubernetes.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/lambda_cloud.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/oci.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/paperspace.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/runpod.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/scp.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/__init__.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/common.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/config.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/constants.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/do_catalog.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/vast_catalog.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/__init__.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/aws_utils.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/azure_utils.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/gcp_utils.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/oci_utils.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/utils/scp_utils.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/vast.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/clouds/vsphere.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/core.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/dag.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/__init__.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/data_transfer.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/data_utils.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/mounting_utils.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/storage.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/data/storage_utils.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/execution.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/global_user_state.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/__init__.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/constants.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/dashboard/dashboard.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/dashboard/static/favicon.ico +0 -0
  121. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/dashboard/templates/index.html +0 -0
  122. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/jobs/scheduler.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/optimizer.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/__init__.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/aws/__init__.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/aws/config.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/aws/instance.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/aws/utils.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/azure/__init__.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/azure/azure-config-template.json +0 -0
  131. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/azure/config.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/common.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/constants.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/__init__.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/config.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/cudo_machine_type.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/cudo_utils.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/cudo_wrapper.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/cudo/instance.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/do/__init__.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/do/config.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/do/constants.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/do/instance.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/do/utils.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/docker_utils.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/fluidstack/__init__.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/fluidstack/config.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/fluidstack/instance.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/__init__.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/config.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/constants.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/instance.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/instance_utils.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/gcp/mig_utils.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/instance_setup.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/__init__.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/config.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/instance.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  161. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  162. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/network.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/network_utils.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/kubernetes/utils.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/lambda_cloud/__init__.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/lambda_cloud/config.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/lambda_cloud/instance.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/logging.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/metadata_utils.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/oci/__init__.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/oci/config.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/oci/instance.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/oci/query_utils.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/paperspace/__init__.py +0 -0
  176. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/paperspace/config.py +0 -0
  177. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/paperspace/constants.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/paperspace/instance.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/paperspace/utils.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/provisioner.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/__init__.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/api/__init__.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/api/commands.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/api/pods.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/config.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/instance.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/runpod/utils.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vast/__init__.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vast/config.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vast/instance.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vast/utils.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/__init__.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/__init__.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/custom_script.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/id_generator.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/service_manager.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/common/vim_utils.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/config.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/instance.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/provision/vsphere/vsphere_utils.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/resources.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/__init__.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/autoscalers.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/constants.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/controller.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/core.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/load_balancer.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/load_balancing_policies.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/replica_managers.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/serve_state.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/serve_utils.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/service.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/serve/service_spec.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/setup_files/MANIFEST.in +0 -0
  221. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/setup_files/dependencies.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/setup_files/setup.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/sky_logging.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/LICENSE +0 -0
  225. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/__init__.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/attempt_skylet.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/autostop_lib.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/configs.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/events.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/job_lib.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/log_lib.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/log_lib.pyi +0 -0
  233. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/__init__.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/command_runner.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/ibm/__init__.py +0 -0
  236. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/ibm/node_provider.py +0 -0
  237. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/ibm/utils.py +0 -0
  238. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/scp/__init__.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/scp/config.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/providers/scp/node_provider.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/__init__.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  244. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/cli.py.patch +0 -0
  245. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  246. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  247. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  248. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/updater.py.patch +0 -0
  249. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/ray_patches/worker.py.patch +0 -0
  250. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/skylet.py +0 -0
  251. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skylet/subprocess_daemon.py +0 -0
  252. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/skypilot_config.py +0 -0
  253. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/status_lib.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/task.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/aws-ray.yml.j2 +0 -0
  256. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/azure-ray.yml.j2 +0 -0
  257. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/cudo-ray.yml.j2 +0 -0
  258. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/do-ray.yml.j2 +0 -0
  259. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  260. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/gcp-ray.yml.j2 +0 -0
  261. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/ibm-ray.yml.j2 +0 -0
  262. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/jobs-controller.yaml.j2 +0 -0
  263. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  264. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  265. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  266. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/kubernetes-ray.yml.j2 +0 -0
  267. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  268. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/lambda-ray.yml.j2 +0 -0
  269. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/local-ray.yml.j2 +0 -0
  270. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/oci-ray.yml.j2 +0 -0
  271. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/paperspace-ray.yml.j2 +0 -0
  272. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/runpod-ray.yml.j2 +0 -0
  273. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/scp-ray.yml.j2 +0 -0
  274. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  275. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/vast-ray.yml.j2 +0 -0
  276. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/templates/vsphere-ray.yml.j2 +0 -0
  277. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/usage/__init__.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/usage/constants.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/usage/usage_lib.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/__init__.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/accelerator_registry.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/admin_policy_utils.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/cli_utils/__init__.py +0 -0
  284. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/cli_utils/status_utils.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/cluster_yaml_utils.py +0 -0
  286. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/command_runner.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/command_runner.pyi +0 -0
  288. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/control_master_utils.py +0 -0
  289. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/db_utils.py +0 -0
  290. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/env_options.py +0 -0
  291. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/__init__.py +0 -0
  292. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/create_cluster.sh +0 -0
  293. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  294. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  295. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  297. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  298. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  299. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  300. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  301. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  302. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/kubernetes_enums.py +0 -0
  303. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/resources_utils.py +0 -0
  304. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/rich_utils.py +0 -0
  305. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/subprocess_utils.py +0 -0
  306. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/timeline.py +0 -0
  307. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/ux_utils.py +0 -0
  308. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/sky/utils/validator.py +0 -0
  309. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/skypilot_nightly.egg-info/SOURCES.txt +0 -0
  310. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  311. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  312. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/skypilot_nightly.egg-info/requires.txt +0 -0
  313. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/skypilot_nightly.egg-info/top_level.txt +0 -0
  314. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_api.py +0 -0
  315. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_cli.py +0 -0
  316. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_global_user_state.py +0 -0
  317. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_jobs.py +0 -0
  318. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_jobs_and_serve.py +0 -0
  319. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_list_accelerators.py +0 -0
  320. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_optimizer_dryruns.py +0 -0
  321. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_optimizer_random_dag.py +0 -0
  322. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_serve_autoscaler.py +0 -0
  323. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_smoke.py +0 -0
  324. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_storage.py +0 -0
  325. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_wheels.py +0 -0
  326. {skypilot_nightly-1.0.0.dev20250206 → skypilot_nightly-1.0.0.dev20250208}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250206
3
+ Version: 1.0.0.dev20250208
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -244,7 +244,7 @@ To get the latest features and fixes, use the nightly build or [install from sou
244
244
  pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp]"
245
245
  ```
246
246
 
247
- [Current supported infra](https://docs.skypilot.co/en/latest/getting-started/installation.html) (Kubernetes; AWS, GCP, Azure, OCI, Lambda Cloud, Fluidstack, RunPod, Cudo, Paperspace, Cloudflare, Samsung, IBM, VMware vSphere):
247
+ [Current supported infra](https://docs.skypilot.co/en/latest/getting-started/installation.html) (Kubernetes; AWS, GCP, Azure, OCI, Lambda Cloud, Fluidstack, RunPod, Cudo, Digital Ocean, Paperspace, Cloudflare, Samsung, IBM, Vast.ai, VMware vSphere):
248
248
  <p align="center">
249
249
  <img alt="SkyPilot" src="https://raw.githubusercontent.com/skypilot-org/skypilot/master/docs/source/images/cloud-logos-light.png" width=85%>
250
250
  </p>
@@ -86,7 +86,7 @@ To get the latest features and fixes, use the nightly build or [install from sou
86
86
  pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp]"
87
87
  ```
88
88
 
89
- [Current supported infra](https://docs.skypilot.co/en/latest/getting-started/installation.html) (Kubernetes; AWS, GCP, Azure, OCI, Lambda Cloud, Fluidstack, RunPod, Cudo, Paperspace, Cloudflare, Samsung, IBM, VMware vSphere):
89
+ [Current supported infra](https://docs.skypilot.co/en/latest/getting-started/installation.html) (Kubernetes; AWS, GCP, Azure, OCI, Lambda Cloud, Fluidstack, RunPod, Cudo, Digital Ocean, Paperspace, Cloudflare, Samsung, IBM, Vast.ai, VMware vSphere):
90
90
  <p align="center">
91
91
  <picture>
92
92
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/skypilot-org/skypilot/master/docs/source/images/cloud-logos-dark.png">
@@ -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 = '1e284afda6c2808e521e629a025267a12744b0db'
8
+ _SKYPILOT_COMMIT_SHA = '54fe787d1fb31687cc78eb307db59d54c2d79076'
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.dev20250206'
38
+ __version__ = '1.0.0.dev20250208'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -289,7 +289,7 @@ def setup_lambda_authentication(config: Dict[str, Any]) -> Dict[str, Any]:
289
289
  config['auth']['ssh_public_key'] = PUBLIC_SSH_KEY_PATH
290
290
 
291
291
  # TODO(zhwu): we need to avoid uploading the public ssh key to the
292
- # nodes, as that will cause problem when the node is used as spot
292
+ # nodes, as that will cause problem when the node is used as jobs
293
293
  # controller, i.e., the public and private key on the node may
294
294
  # not match.
295
295
  file_mounts = config['file_mounts']
@@ -844,11 +844,6 @@ def write_cluster_config(
844
844
 
845
845
  # User-supplied global instance tags from ~/.sky/config.yaml.
846
846
  labels = skypilot_config.get_nested((str(cloud).lower(), 'labels'), {})
847
- # Deprecated: instance_tags have been replaced by labels. For backward
848
- # compatibility, we support them and the schema allows them only if
849
- # `labels` are not specified. This should be removed after 0.8.0.
850
- labels = skypilot_config.get_nested((str(cloud).lower(), 'instance_tags'),
851
- labels)
852
847
  # labels is a dict, which is guaranteed by the type check in
853
848
  # schemas.py
854
849
  assert isinstance(labels, dict), labels
@@ -997,7 +992,7 @@ def write_cluster_config(
997
992
 
998
993
  # Read the cluster name from the tmp yaml file, to take the backward
999
994
  # compatbility restortion above into account.
1000
- # TODO: remove this after 2 minor releases, 0.8.0.
995
+ # TODO: remove this after 2 minor releases, 0.10.0.
1001
996
  yaml_config = common_utils.read_yaml(tmp_yaml_path)
1002
997
  config_dict['cluster_name_on_cloud'] = yaml_config['cluster_name']
1003
998
 
@@ -2446,7 +2446,7 @@ class CloudVmRayResourceHandle(backends.backend.ResourceHandle):
2446
2446
  # can be None. We need to update it here, even when force_cached is
2447
2447
  # set to True.
2448
2448
  # TODO: We can remove `self.cached_external_ips is None` after
2449
- # version 0.8.0.
2449
+ # all clouds moved to new provisioner.
2450
2450
  if force_cached and self.cached_external_ips is None:
2451
2451
  raise RuntimeError(
2452
2452
  'Tried to use cached cluster info, but it\'s missing for '
@@ -3416,17 +3416,11 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3416
3416
  managed_job_code = managed_job_codegen.set_pending(
3417
3417
  job_id, managed_job_dag)
3418
3418
  # Set the managed job to PENDING state to make sure that this
3419
- # managed job appears in the `sky jobs queue`, when there are
3420
- # already 2x vCPU controller processes running on the controller VM,
3421
- # e.g., 16 controller processes running on a controller with 8
3422
- # vCPUs.
3423
- # The managed job should be set to PENDING state *after* the
3424
- # controller process job has been queued, as our skylet on spot
3425
- # controller will set the managed job in FAILED state if the
3426
- # controller process job does not exist.
3427
- # We cannot set the managed job to PENDING state in the codegen for
3428
- # the controller process job, as it will stay in the job pending
3429
- # table and not be executed until there is an empty slot.
3419
+ # managed job appears in the `sky jobs queue`, even if it needs to
3420
+ # wait to be submitted.
3421
+ # We cannot set the managed job to PENDING state in the job template
3422
+ # (jobs-controller.yaml.j2), as it may need to wait for the run
3423
+ # commands to be scheduled on the job controller in high-load cases.
3430
3424
  job_submit_cmd = job_submit_cmd + ' && ' + managed_job_code
3431
3425
 
3432
3426
  returncode, stdout, stderr = self.run_on_head(handle,
@@ -257,6 +257,12 @@ class DO(clouds.Cloud):
257
257
  @classmethod
258
258
  def check_credentials(cls) -> Tuple[bool, Optional[str]]:
259
259
  """Verify that the user has valid credentials for DO."""
260
+
261
+ try:
262
+ do.exceptions()
263
+ except ImportError as err:
264
+ return False, str(err)
265
+
260
266
  try:
261
267
  # attempt to make a CURL request for listing instances
262
268
  do_utils.client().droplets.list()
@@ -306,6 +306,12 @@ def _get_instance_types_df(region: str) -> Union[str, 'pd.DataFrame']:
306
306
  assert find_num_in_name is not None, row['InstanceType']
307
307
  num_in_name = find_num_in_name.group(1)
308
308
  acc_count = int(num_in_name) // 2
309
+ if row['InstanceType'] == 'p5en.48xlarge':
310
+ # TODO(andyl): Check if this workaround still needed after
311
+ # v0.10.0 released. Currently, the acc_name returned by the
312
+ # AWS API is 'NVIDIA', which is incorrect. See #4652.
313
+ acc_name = 'H200'
314
+ acc_count = 8
309
315
  return pd.Series({
310
316
  'AcceleratorName': acc_name,
311
317
  'AcceleratorCount': acc_count,
@@ -81,6 +81,14 @@ class ManagedJobReachedMaxRetriesError(Exception):
81
81
  pass
82
82
 
83
83
 
84
+ class ManagedJobStatusError(Exception):
85
+ """Raised when a managed job task status update is invalid.
86
+
87
+ For instance, a RUNNING job cannot become SUBMITTED.
88
+ """
89
+ pass
90
+
91
+
84
92
  class ResourcesMismatchError(Exception):
85
93
  """Raised when resources are mismatched."""
86
94
  pass
@@ -68,7 +68,7 @@ class JobsController:
68
68
  else:
69
69
  assert task.name is not None, task
70
70
  task_name = task.name
71
- # This is guaranteed by the spot_launch API, where we fill in
71
+ # This is guaranteed by the jobs.launch API, where we fill in
72
72
  # the task.name with
73
73
  # dag_utils.maybe_infer_and_fill_dag_and_task_names.
74
74
  assert task_name is not None, self._dag
@@ -137,8 +137,8 @@ class JobsController:
137
137
  1. The optimizer cannot find a feasible solution.
138
138
  2. Precheck errors: invalid cluster name, failure in getting
139
139
  cloud user identity, or unsupported feature.
140
- exceptions.SpotJobReachedMaxRetryError: This will be raised when
141
- all prechecks passed but the maximum number of retries is
140
+ exceptions.ManagedJobReachedMaxRetriesError: This will be raised
141
+ when all prechecks passed but the maximum number of retries is
142
142
  reached for `sky.launch`. The failure of `sky.launch` can be
143
143
  due to:
144
144
  1. Any of the underlying failover exceptions is due to resources
@@ -482,8 +482,6 @@ def _cleanup(job_id: int, dag_yaml: str):
482
482
  when reaching here, as we currently only support chain DAGs, and only
483
483
  task is executed at a time.
484
484
  """
485
- # NOTE: The code to get cluster name is same as what we did in the spot
486
- # controller, we should keep it in sync with JobsController.__init__()
487
485
  dag, _ = _get_dag_and_name(dag_yaml)
488
486
  for task in dag.tasks:
489
487
  assert task.name is not None, task
@@ -472,24 +472,3 @@ def sync_down_logs(
472
472
  job_name=name,
473
473
  controller=controller,
474
474
  local_dir=local_dir)
475
-
476
-
477
- spot_launch = common_utils.deprecated_function(
478
- launch,
479
- name='sky.jobs.launch',
480
- deprecated_name='spot_launch',
481
- removing_version='0.8.0',
482
- override_argument={'use_spot': True})
483
- spot_queue = common_utils.deprecated_function(queue,
484
- name='sky.jobs.queue',
485
- deprecated_name='spot_queue',
486
- removing_version='0.8.0')
487
- spot_cancel = common_utils.deprecated_function(cancel,
488
- name='sky.jobs.cancel',
489
- deprecated_name='spot_cancel',
490
- removing_version='0.8.0')
491
- spot_tail_logs = common_utils.deprecated_function(
492
- tail_logs,
493
- name='sky.jobs.tail_logs',
494
- deprecated_name='spot_tail_logs',
495
- removing_version='0.8.0')
@@ -263,8 +263,8 @@ class StrategyExecutor:
263
263
  1. The optimizer cannot find a feasible solution.
264
264
  2. Precheck errors: invalid cluster name, failure in getting
265
265
  cloud user identity, or unsupported feature.
266
- exceptions.SpotJobReachedMaxRetryError: This will be raised when
267
- all prechecks passed but the maximum number of retries is
266
+ exceptions.ManagedJobReachedMaxRetriesError: This will be raised
267
+ when all prechecks passed but the maximum number of retries is
268
268
  reached for `sky.launch`. The failure of `sky.launch` can be
269
269
  due to:
270
270
  1. Any of the underlying failover exceptions is due to resources
@@ -11,6 +11,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
11
11
 
12
12
  import colorama
13
13
 
14
+ from sky import exceptions
14
15
  from sky import sky_logging
15
16
  from sky.utils import common_utils
16
17
  from sky.utils import db_utils
@@ -32,7 +33,7 @@ logger = sky_logging.init_logger(__name__)
32
33
  # the same content as the `task_name` column.
33
34
  # The `job_id` is now not really a job id, but a only a unique
34
35
  # identifier/primary key for all the tasks. We will use `spot_job_id`
35
- # to identify the spot job.
36
+ # to identify the job.
36
37
  # TODO(zhwu): schema migration may be needed.
37
38
  def create_table(cursor, conn):
38
39
  # Enable WAL mode to avoid locking issues.
@@ -420,9 +421,16 @@ def set_submitted(job_id: int, task_id: int, run_timestamp: str,
420
421
  run_timestamp=(?),
421
422
  specs=(?)
422
423
  WHERE spot_job_id=(?) AND
423
- task_id=(?)""",
424
+ task_id=(?) AND
425
+ status=(?) AND
426
+ end_at IS null""",
424
427
  (resources_str, submit_time, ManagedJobStatus.SUBMITTED.value,
425
- run_timestamp, json.dumps(specs), job_id, task_id))
428
+ run_timestamp, json.dumps(specs), job_id, task_id,
429
+ ManagedJobStatus.PENDING.value))
430
+ if cursor.rowcount != 1:
431
+ raise exceptions.ManagedJobStatusError(
432
+ f'Failed to set the task to submitted. '
433
+ f'({cursor.rowcount} rows updated)')
426
434
  callback_func('SUBMITTED')
427
435
 
428
436
 
@@ -434,7 +442,14 @@ def set_starting(job_id: int, task_id: int, callback_func: CallbackType):
434
442
  """\
435
443
  UPDATE spot SET status=(?)
436
444
  WHERE spot_job_id=(?) AND
437
- task_id=(?)""", (ManagedJobStatus.STARTING.value, job_id, task_id))
445
+ task_id=(?) AND
446
+ status=(?) AND
447
+ end_at IS null""", (ManagedJobStatus.STARTING.value, job_id,
448
+ task_id, ManagedJobStatus.SUBMITTED.value))
449
+ if cursor.rowcount != 1:
450
+ raise exceptions.ManagedJobStatusError(
451
+ f'Failed to set the task to starting. '
452
+ f'({cursor.rowcount} rows updated)')
438
453
  callback_func('STARTING')
439
454
 
440
455
 
@@ -447,15 +462,25 @@ def set_started(job_id: int, task_id: int, start_time: float,
447
462
  """\
448
463
  UPDATE spot SET status=(?), start_at=(?), last_recovered_at=(?)
449
464
  WHERE spot_job_id=(?) AND
450
- task_id=(?)""",
465
+ task_id=(?) AND
466
+ status IN (?, ?) AND
467
+ end_at IS null""",
451
468
  (
452
469
  ManagedJobStatus.RUNNING.value,
453
470
  start_time,
454
471
  start_time,
455
472
  job_id,
456
473
  task_id,
474
+ ManagedJobStatus.STARTING.value,
475
+ # If the task is empty, we will jump straight from PENDING to
476
+ # RUNNING
477
+ ManagedJobStatus.PENDING.value,
457
478
  ),
458
479
  )
480
+ if cursor.rowcount != 1:
481
+ raise exceptions.ManagedJobStatusError(
482
+ f'Failed to set the task to started. '
483
+ f'({cursor.rowcount} rows updated)')
459
484
  callback_func('STARTED')
460
485
 
461
486
 
@@ -468,8 +493,15 @@ def set_recovering(job_id: int, task_id: int, callback_func: CallbackType):
468
493
  UPDATE spot SET
469
494
  status=(?), job_duration=job_duration+(?)-last_recovered_at
470
495
  WHERE spot_job_id=(?) AND
471
- task_id=(?)""",
472
- (ManagedJobStatus.RECOVERING.value, time.time(), job_id, task_id))
496
+ task_id=(?) AND
497
+ status=(?) AND
498
+ end_at IS null""",
499
+ (ManagedJobStatus.RECOVERING.value, time.time(), job_id, task_id,
500
+ ManagedJobStatus.RUNNING.value))
501
+ if cursor.rowcount != 1:
502
+ raise exceptions.ManagedJobStatusError(
503
+ f'Failed to set the task to recovering. '
504
+ f'({cursor.rowcount} rows updated)')
473
505
  callback_func('RECOVERING')
474
506
 
475
507
 
@@ -482,8 +514,15 @@ def set_recovered(job_id: int, task_id: int, recovered_time: float,
482
514
  UPDATE spot SET
483
515
  status=(?), last_recovered_at=(?), recovery_count=recovery_count+1
484
516
  WHERE spot_job_id=(?) AND
485
- task_id=(?)""",
486
- (ManagedJobStatus.RUNNING.value, recovered_time, job_id, task_id))
517
+ task_id=(?) AND
518
+ status=(?) AND
519
+ end_at IS null""",
520
+ (ManagedJobStatus.RUNNING.value, recovered_time, job_id, task_id,
521
+ ManagedJobStatus.RECOVERING.value))
522
+ if cursor.rowcount != 1:
523
+ raise exceptions.ManagedJobStatusError(
524
+ f'Failed to set the task to recovered. '
525
+ f'({cursor.rowcount} rows updated)')
487
526
  logger.info('==== Recovered. ====')
488
527
  callback_func('RECOVERED')
489
528
 
@@ -496,10 +535,16 @@ def set_succeeded(job_id: int, task_id: int, end_time: float,
496
535
  """\
497
536
  UPDATE spot SET
498
537
  status=(?), end_at=(?)
499
- WHERE spot_job_id=(?) AND task_id=(?)
500
- AND end_at IS null""",
501
- (ManagedJobStatus.SUCCEEDED.value, end_time, job_id, task_id))
502
-
538
+ WHERE spot_job_id=(?) AND
539
+ task_id=(?) AND
540
+ status=(?) AND
541
+ end_at IS null""",
542
+ (ManagedJobStatus.SUCCEEDED.value, end_time, job_id, task_id,
543
+ ManagedJobStatus.RUNNING.value))
544
+ if cursor.rowcount != 1:
545
+ raise exceptions.ManagedJobStatusError(
546
+ f'Failed to set the task to succeeded. '
547
+ f'({cursor.rowcount} rows updated)')
503
548
  callback_func('SUCCEEDED')
504
549
  logger.info('Job succeeded.')
505
550
 
@@ -571,7 +616,9 @@ def set_failed(
571
616
  {set_str}
572
617
  WHERE spot_job_id=(?) {task_query_str} AND end_at IS null""",
573
618
  (end_time, *list(fields_to_set.values()), job_id, *task_value))
574
- if callback_func:
619
+
620
+ updated = cursor.rowcount > 0
621
+ if callback_func and updated:
575
622
  callback_func('FAILED')
576
623
  logger.info(failure_reason)
577
624
 
@@ -586,12 +633,15 @@ def set_cancelling(job_id: int, callback_func: CallbackType):
586
633
  rows = cursor.execute(
587
634
  """\
588
635
  UPDATE spot SET
589
- status=(?), end_at=(?)
636
+ status=(?)
590
637
  WHERE spot_job_id=(?) AND end_at IS null""",
591
- (ManagedJobStatus.CANCELLING.value, time.time(), job_id))
592
- if rows.rowcount > 0:
593
- logger.info('Cancelling the job...')
594
- callback_func('CANCELLING')
638
+ (ManagedJobStatus.CANCELLING.value, job_id))
639
+ updated = rows.rowcount > 0
640
+ if updated:
641
+ logger.info('Cancelling the job...')
642
+ callback_func('CANCELLING')
643
+ else:
644
+ logger.info('Cancellation skipped, job is already terminal')
595
645
 
596
646
 
597
647
  def set_cancelled(job_id: int, callback_func: CallbackType):
@@ -607,9 +657,12 @@ def set_cancelled(job_id: int, callback_func: CallbackType):
607
657
  WHERE spot_job_id=(?) AND status=(?)""",
608
658
  (ManagedJobStatus.CANCELLED.value, time.time(), job_id,
609
659
  ManagedJobStatus.CANCELLING.value))
610
- if rows.rowcount > 0:
611
- logger.info('Job cancelled.')
612
- callback_func('CANCELLED')
660
+ updated = rows.rowcount > 0
661
+ if updated:
662
+ logger.info('Job cancelled.')
663
+ callback_func('CANCELLED')
664
+ else:
665
+ logger.info('Cancellation skipped, job is not CANCELLING')
613
666
 
614
667
 
615
668
  def set_local_log_file(job_id: int, task_id: Optional[int],
@@ -705,8 +758,9 @@ def get_jobs_to_check_status(job_id: Optional[int] = None) -> List[int]:
705
758
  job_id: Optional job ID to check. If None, checks all jobs.
706
759
 
707
760
  Returns a list of job_ids, including the following:
708
- - For jobs with schedule state: jobs that have schedule state not DONE
709
- - For legacy jobs (no schedule state): jobs that are in non-terminal status
761
+ - Jobs that have a schedule_state that is not DONE
762
+ - Jobs have schedule_state DONE but are in a non-terminal status
763
+ - Legacy jobs (that is, no schedule state) that are in non-terminal status
710
764
  """
711
765
  job_filter = '' if job_id is None else 'AND spot.spot_job_id=(?)'
712
766
  job_value = () if job_id is None else (job_id,)
@@ -719,7 +773,9 @@ def get_jobs_to_check_status(job_id: Optional[int] = None) -> List[int]:
719
773
 
720
774
  # Get jobs that are either:
721
775
  # 1. Have schedule state that is not DONE, or
722
- # 2. Have no schedule state (legacy) AND are in non-terminal status
776
+ # 2. Have schedule state DONE AND are in non-terminal status (unexpected
777
+ # inconsistent state), or
778
+ # 3. Have no schedule state (legacy) AND are in non-terminal status
723
779
  with db_utils.safe_cursor(_DB_PATH) as cursor:
724
780
  rows = cursor.execute(
725
781
  f"""\
@@ -728,14 +784,23 @@ def get_jobs_to_check_status(job_id: Optional[int] = None) -> List[int]:
728
784
  LEFT OUTER JOIN job_info
729
785
  ON spot.spot_job_id=job_info.spot_job_id
730
786
  WHERE (
787
+ -- non-legacy jobs that are not DONE
731
788
  (job_info.schedule_state IS NOT NULL AND
732
789
  job_info.schedule_state IS NOT ?)
733
790
  OR
734
- (job_info.schedule_state IS NULL AND
791
+ -- legacy or that are in non-terminal status or
792
+ -- DONE jobs that are in non-terminal status
793
+ ((-- legacy jobs
794
+ job_info.schedule_state IS NULL OR
795
+ -- non-legacy DONE jobs
796
+ job_info.schedule_state IS ?
797
+ ) AND
798
+ -- non-terminal
735
799
  status NOT IN ({status_filter_str}))
736
800
  )
737
801
  {job_filter}
738
802
  ORDER BY spot.spot_job_id DESC""", [
803
+ ManagedJobScheduleState.DONE.value,
739
804
  ManagedJobScheduleState.DONE.value, *terminal_status_values,
740
805
  *job_value
741
806
  ]).fetchall()
@@ -6,11 +6,9 @@ ManagedJobCodeGen.
6
6
  """
7
7
  import collections
8
8
  import enum
9
- import inspect
10
9
  import os
11
10
  import pathlib
12
11
  import shlex
13
- import shutil
14
12
  import textwrap
15
13
  import time
16
14
  import traceback
@@ -53,7 +51,6 @@ JOB_CONTROLLER_NAME: str = (
53
51
  LEGACY_JOB_CONTROLLER_NAME: str = (
54
52
  f'sky-spot-controller-{common_utils.get_user_hash()}')
55
53
  SIGNAL_FILE_PREFIX = '/tmp/sky_jobs_controller_signal_{}'
56
- LEGACY_SIGNAL_FILE_PREFIX = '/tmp/sky_spot_controller_signal_{}'
57
54
  # Controller checks its job's status every this many seconds.
58
55
  JOB_STATUS_CHECK_GAP_SECONDS = 20
59
56
 
@@ -248,16 +245,35 @@ def update_managed_jobs_statuses(job_id: Optional[int] = None):
248
245
  schedule_state = tasks[0]['schedule_state']
249
246
 
250
247
  # Backwards compatibility: this job was submitted when ray was still
251
- # used for managing the parallelism of job controllers.
248
+ # used for managing the parallelism of job controllers, before #4485.
252
249
  # TODO(cooperc): Remove before 0.11.0.
253
250
  if (schedule_state is
254
251
  managed_job_state.ManagedJobScheduleState.INVALID):
255
252
  _handle_legacy_job(job_id)
256
253
  continue
257
254
 
258
- # For jobs with schedule state:
255
+ # Handle jobs with schedule state (non-legacy jobs):
259
256
  pid = tasks[0]['controller_pid']
260
- if pid is None:
257
+ if schedule_state == managed_job_state.ManagedJobScheduleState.DONE:
258
+ # There are two cases where we could get a job that is DONE.
259
+ # 1. At query time (get_jobs_to_check_status), the job was not yet
260
+ # DONE, but since then (before get_managed_jobs is called) it has
261
+ # hit a terminal status, marked itself done, and exited. This is
262
+ # fine.
263
+ # 2. The job is DONE, but in a non-terminal status. This is
264
+ # unexpected. For instance, the task status is RUNNING, but the
265
+ # job schedule_state is DONE.
266
+ if all(task['status'].is_terminal() for task in tasks):
267
+ # Turns out this job is fine, even though it got pulled by
268
+ # get_jobs_to_check_status. Probably case #1 above.
269
+ continue
270
+
271
+ logger.error(f'Job {job_id} has DONE schedule state, but some '
272
+ f'tasks are not terminal. Task statuses: '
273
+ f'{", ".join(task["status"].value for task in tasks)}')
274
+ failure_reason = ('Inconsistent internal job state. This is a bug.')
275
+ elif pid is None:
276
+ # Non-legacy job and controller process has not yet started.
261
277
  if schedule_state in (
262
278
  managed_job_state.ManagedJobScheduleState.INACTIVE,
263
279
  managed_job_state.ManagedJobScheduleState.WAITING):
@@ -458,17 +474,12 @@ def cancel_jobs_by_id(job_ids: Optional[List[int]]) -> str:
458
474
 
459
475
  # Send the signal to the jobs controller.
460
476
  signal_file = pathlib.Path(SIGNAL_FILE_PREFIX.format(job_id))
461
- legacy_signal_file = pathlib.Path(
462
- LEGACY_SIGNAL_FILE_PREFIX.format(job_id))
463
477
  # Filelock is needed to prevent race condition between signal
464
478
  # check/removal and signal writing.
465
479
  with filelock.FileLock(str(signal_file) + '.lock'):
466
480
  with signal_file.open('w', encoding='utf-8') as f:
467
481
  f.write(UserSignal.CANCEL.value)
468
482
  f.flush()
469
- # Backward compatibility for managed jobs launched before #3419. It
470
- # can be removed in the future 0.8.0 release.
471
- shutil.copy(str(signal_file), str(legacy_signal_file))
472
483
  cancelled_job_ids.append(job_id)
473
484
 
474
485
  if not cancelled_job_ids:
@@ -1116,28 +1127,15 @@ class ManagedJobCodeGen:
1116
1127
 
1117
1128
  >> codegen = ManagedJobCodeGen.show_jobs(...)
1118
1129
  """
1119
- # TODO: the try..except.. block is for backward compatibility. Remove it in
1120
- # v0.8.0.
1121
1130
  _PREFIX = textwrap.dedent("""\
1122
- managed_job_version = 0
1123
- try:
1124
- from sky.jobs import utils
1125
- from sky.jobs import constants as managed_job_constants
1126
- from sky.jobs import state as managed_job_state
1127
-
1128
- managed_job_version = managed_job_constants.MANAGED_JOBS_VERSION
1129
- except ImportError:
1130
- from sky.spot import spot_state as managed_job_state
1131
- from sky.spot import spot_utils as utils
1131
+ from sky.jobs import utils
1132
+ from sky.jobs import state as managed_job_state
1132
1133
  """)
1133
1134
 
1134
1135
  @classmethod
1135
1136
  def get_job_table(cls) -> str:
1136
1137
  code = textwrap.dedent("""\
1137
- if managed_job_version < 1:
1138
- job_table = utils.dump_spot_job_queue()
1139
- else:
1140
- job_table = utils.dump_managed_job_queue()
1138
+ job_table = utils.dump_managed_job_queue()
1141
1139
  print(job_table, flush=True)
1142
1140
  """)
1143
1141
  return cls._build(code)
@@ -1173,29 +1171,9 @@ class ManagedJobCodeGen:
1173
1171
  job_id: Optional[int],
1174
1172
  follow: bool = True,
1175
1173
  controller: bool = False) -> str:
1176
- # We inspect the source code of the function here for backward
1177
- # compatibility.
1178
- # TODO: change to utils.stream_logs(job_id, job_name, follow) in v0.8.0.
1179
- # Import libraries required by `stream_logs`. The try...except... block
1180
- # should be removed in v0.8.0.
1181
- code = textwrap.dedent("""\
1182
- import os
1183
- import time
1184
-
1185
- from sky.skylet import job_lib, log_lib
1186
- from sky.skylet import constants
1187
- from sky.utils import ux_utils
1188
- try:
1189
- from sky.jobs.utils import stream_logs_by_id
1190
- except ImportError:
1191
- from sky.spot.spot_utils import stream_logs_by_id
1192
- from typing import Optional
1193
- """)
1194
- code += inspect.getsource(stream_logs)
1195
- code += textwrap.dedent(f"""\
1196
-
1197
- msg = stream_logs({job_id!r}, {job_name!r},
1198
- follow={follow}, controller={controller})
1174
+ code = textwrap.dedent(f"""\
1175
+ msg = utils.stream_logs({job_id!r}, {job_name!r},
1176
+ follow={follow}, controller={controller})
1199
1177
  print(msg, flush=True)
1200
1178
  """)
1201
1179
  return cls._build(code)
@@ -15,7 +15,6 @@ from sky import status_lib
15
15
  from sky.adaptors import azure
16
16
  from sky.provision import common
17
17
  from sky.provision import constants
18
- from sky.provision.azure import config as config_lib
19
18
  from sky.utils import common_utils
20
19
  from sky.utils import subprocess_utils
21
20
  from sky.utils import ux_utils
@@ -52,10 +51,6 @@ _RESOURCE_NETWORK_INTERFACE_TYPE = 'Microsoft.Network/networkInterfaces'
52
51
 
53
52
  _RESOURCE_GROUP_NOT_FOUND_ERROR_MESSAGE = 'ResourceGroupNotFound'
54
53
  _POLL_INTERVAL = 1
55
- # TODO(Doyoung): _LEGACY_NSG_NAME can be remove this after 0.8.0 to ignore
56
- # legacy nsg names.
57
- _LEGACY_NSG_NAME = 'ray-{cluster_name_on_cloud}-nsg'
58
- _SECOND_LEGACY_NSG_NAME = 'sky-{cluster_name_on_cloud}-nsg'
59
54
 
60
55
 
61
56
  class AzureInstanceStatus(enum.Enum):
@@ -987,32 +982,6 @@ def query_instances(
987
982
  return statuses
988
983
 
989
984
 
990
- # TODO(Doyoung): _get_cluster_nsg can be remove this after 0.8.0 to ignore
991
- # legacy nsg names.
992
- def _get_cluster_nsg(network_client: Client, resource_group: str,
993
- cluster_name_on_cloud: str) -> NetworkSecurityGroup:
994
- """Retrieve the NSG associated with the given name of the cluster."""
995
- list_network_security_groups = _get_azure_sdk_function(
996
- client=network_client.network_security_groups, function_name='list')
997
- legacy_nsg_name = _LEGACY_NSG_NAME.format(
998
- cluster_name_on_cloud=cluster_name_on_cloud)
999
- second_legacy_nsg_name = _SECOND_LEGACY_NSG_NAME.format(
1000
- cluster_name_on_cloud=cluster_name_on_cloud)
1001
- _, nsg_name = config_lib.get_cluster_id_and_nsg_name(
1002
- resource_group=resource_group,
1003
- cluster_name_on_cloud=cluster_name_on_cloud)
1004
- possible_nsg_names = [nsg_name, legacy_nsg_name, second_legacy_nsg_name]
1005
- for nsg in list_network_security_groups(resource_group):
1006
- if nsg.name in possible_nsg_names:
1007
- return nsg
1008
-
1009
- # Raise an error if no matching NSG is found
1010
- raise ValueError('Failed to find a matching NSG for cluster '
1011
- f'{cluster_name_on_cloud!r} in resource group '
1012
- f'{resource_group!r}. Expected NSG names were: '
1013
- f'{possible_nsg_names}.')
1014
-
1015
-
1016
985
  def open_ports(
1017
986
  cluster_name_on_cloud: str,
1018
987
  ports: List[str],