skypilot-nightly 1.0.0.dev20250311__tar.gz → 1.0.0.dev20250312__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 (375) hide show
  1. {skypilot_nightly-1.0.0.dev20250311/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250312}/PKG-INFO +1 -1
  2. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/nebius.py +11 -1
  4. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/backend_utils.py +38 -15
  5. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/cloud_vm_ray_backend.py +17 -52
  6. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/nebius.py +8 -6
  7. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/exceptions.py +11 -3
  8. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/utils.py +1 -1
  9. skypilot_nightly-1.0.0.dev20250312/sky/server/requests/event_loop.py +31 -0
  10. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/executor.py +50 -22
  11. skypilot_nightly-1.0.0.dev20250312/sky/server/requests/preconditions.py +174 -0
  12. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/requests.py +42 -3
  13. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/server.py +29 -8
  14. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/stream_utils.py +9 -6
  15. skypilot_nightly-1.0.0.dev20250312/sky/server/uvicorn.py +81 -0
  16. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/accelerator_registry.py +1 -1
  17. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/subprocess_utils.py +56 -1
  18. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312/skypilot_nightly.egg-info}/PKG-INFO +1 -1
  19. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/SOURCES.txt +3 -0
  20. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/LICENSE +0 -0
  21. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/MANIFEST.in +0 -0
  22. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/README.md +0 -0
  23. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/pyproject.toml +0 -0
  24. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/setup.cfg +0 -0
  25. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/setup.py +0 -0
  26. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/__init__.py +0 -0
  27. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/aws.py +0 -0
  28. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/azure.py +0 -0
  29. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/cloudflare.py +0 -0
  30. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/common.py +0 -0
  31. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/cudo.py +0 -0
  32. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/do.py +0 -0
  33. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/docker.py +0 -0
  34. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/gcp.py +0 -0
  35. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/ibm.py +0 -0
  36. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/kubernetes.py +0 -0
  37. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/oci.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/runpod.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/vast.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/adaptors/vsphere.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/admin_policy.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/authentication.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/__init__.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/backend.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/docker_utils.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/local_docker_backend.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/backends/wheel_utils.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/__init__.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/benchmark_state.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/benchmark/benchmark_utils.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/check.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/cli.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/__init__.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/cli.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/common.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/client/sdk.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/cloud_stores.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/__init__.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/aws.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/azure.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/cloud.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/cudo.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/do.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/fluidstack.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/gcp.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/ibm.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/kubernetes.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/lambda_cloud.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/oci.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/paperspace.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/runpod.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/scp.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/__init__.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/common.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/config.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/constants.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/do_catalog.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/vast_catalog.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/__init__.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/aws_utils.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/azure_utils.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/gcp_utils.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/oci_utils.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/utils/scp_utils.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/vast.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/clouds/vsphere.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/core.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/dag.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/__init__.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/data_transfer.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/data_utils.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/mounting_utils.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/storage.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/data/storage_utils.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/execution.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/global_user_state.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/__init__.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/client/__init__.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/client/sdk.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/constants.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/controller.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/dashboard.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/static/favicon.ico +0 -0
  128. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/dashboard/templates/index.html +0 -0
  129. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/recovery_strategy.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/scheduler.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/__init__.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/core.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/dashboard_utils.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/server/server.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/state.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/jobs/utils.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/models.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/optimizer.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/__init__.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/__init__.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/config.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/instance.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/aws/utils.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/__init__.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/azure-config-template.json +0 -0
  146. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/config.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/azure/instance.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/common.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/constants.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/__init__.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/config.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_machine_type.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_utils.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/cudo_wrapper.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/cudo/instance.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/__init__.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/config.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/constants.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/instance.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/do/utils.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/docker_utils.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/__init__.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/config.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/fluidstack/instance.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/__init__.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/config.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/constants.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/instance.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/instance_utils.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/gcp/mig_utils.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/instance_setup.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/__init__.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/config.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/constants.py +0 -0
  176. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/instance.py +0 -0
  177. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  178. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  179. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/network.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/kubernetes/network_utils.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/__init__.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/config.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/instance.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/logging.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/metadata_utils.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/__init__.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/config.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/instance.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/nebius/utils.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/__init__.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/config.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/instance.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/oci/query_utils.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/__init__.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/config.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/constants.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/instance.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/paperspace/utils.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/provisioner.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/__init__.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/__init__.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/commands.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/api/pods.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/config.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/instance.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/runpod/utils.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/__init__.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/config.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/instance.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vast/utils.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/__init__.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/__init__.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/custom_script.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/id_generator.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/service_manager.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/common/vim_utils.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/config.py +0 -0
  225. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/instance.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/provision/vsphere/vsphere_utils.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/resources.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/__init__.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/autoscalers.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/client/__init__.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/client/sdk.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/constants.py +0 -0
  233. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/controller.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/load_balancer.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/load_balancing_policies.py +0 -0
  236. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/replica_managers.py +0 -0
  237. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/serve_state.py +0 -0
  238. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/serve_utils.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/__init__.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/core.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/server/server.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/service.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/serve/service_spec.py +0 -0
  244. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/__init__.py +0 -0
  245. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/common.py +0 -0
  246. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/constants.py +0 -0
  247. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/html/log.html +0 -0
  248. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/__init__.py +0 -0
  249. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/payloads.py +0 -0
  250. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/queues/__init__.py +0 -0
  251. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/queues/mp_queue.py +0 -0
  252. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/__init__.py +0 -0
  253. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/decoders.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/server/requests/serializers/encoders.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/MANIFEST.in +0 -0
  256. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/dependencies.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/setup_files/setup.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/sky_logging.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/LICENSE +0 -0
  260. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/__init__.py +0 -0
  261. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/attempt_skylet.py +0 -0
  262. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/autostop_lib.py +0 -0
  263. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/configs.py +0 -0
  264. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/constants.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/events.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/job_lib.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/log_lib.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/log_lib.pyi +0 -0
  269. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/__init__.py +0 -0
  270. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/command_runner.py +0 -0
  271. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/__init__.py +0 -0
  272. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/node_provider.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/utils.py +0 -0
  274. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/__init__.py +0 -0
  276. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/config.py +0 -0
  277. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/providers/scp/node_provider.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/__init__.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  280. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/cli.py.patch +0 -0
  281. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  282. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  283. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  284. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/updater.py.patch +0 -0
  285. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/ray_patches/worker.py.patch +0 -0
  286. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/skylet.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skylet/subprocess_daemon.py +0 -0
  288. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/skypilot_config.py +0 -0
  289. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/task.py +0 -0
  290. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/aws-ray.yml.j2 +0 -0
  291. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/azure-ray.yml.j2 +0 -0
  292. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/cudo-ray.yml.j2 +0 -0
  293. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/do-ray.yml.j2 +0 -0
  294. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  295. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/gcp-ray.yml.j2 +0 -0
  296. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/ibm-ray.yml.j2 +0 -0
  297. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/jobs-controller.yaml.j2 +0 -0
  298. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  299. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  300. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  301. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ray.yml.j2 +0 -0
  302. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  303. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/lambda-ray.yml.j2 +0 -0
  304. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/local-ray.yml.j2 +0 -0
  305. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/nebius-ray.yml.j2 +0 -0
  306. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/oci-ray.yml.j2 +0 -0
  307. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/paperspace-ray.yml.j2 +0 -0
  308. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/runpod-ray.yml.j2 +0 -0
  309. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/scp-ray.yml.j2 +0 -0
  310. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  311. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
  312. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/vast-ray.yml.j2 +0 -0
  313. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/vsphere-ray.yml.j2 +0 -0
  314. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/templates/websocket_proxy.py +0 -0
  315. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/__init__.py +0 -0
  316. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/constants.py +0 -0
  317. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/usage/usage_lib.py +0 -0
  318. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/__init__.py +0 -0
  319. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/admin_policy_utils.py +0 -0
  320. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/annotations.py +0 -0
  321. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cli_utils/__init__.py +0 -0
  322. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cli_utils/status_utils.py +0 -0
  323. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/cluster_utils.py +0 -0
  324. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/command_runner.py +0 -0
  325. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/command_runner.pyi +0 -0
  326. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/common.py +0 -0
  327. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/common_utils.py +0 -0
  328. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/config_utils.py +0 -0
  329. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/control_master_utils.py +0 -0
  330. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/controller_utils.py +0 -0
  331. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/dag_utils.py +0 -0
  332. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/db_utils.py +0 -0
  333. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/env_options.py +0 -0
  334. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/__init__.py +0 -0
  335. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/create_cluster.sh +0 -0
  336. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  337. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  338. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
  339. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  340. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  341. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  342. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  343. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  344. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
  345. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  346. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  347. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/kubernetes_enums.py +0 -0
  348. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/log_utils.py +0 -0
  349. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/message_utils.py +0 -0
  350. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/registry.py +0 -0
  351. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/resources_utils.py +0 -0
  352. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/rich_utils.py +0 -0
  353. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/schemas.py +0 -0
  354. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/status_lib.py +0 -0
  355. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/timeline.py +0 -0
  356. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/ux_utils.py +0 -0
  357. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/sky/utils/validator.py +0 -0
  358. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  359. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  360. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/requires.txt +0 -0
  361. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/skypilot_nightly.egg-info/top_level.txt +0 -0
  362. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_api.py +0 -0
  363. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_cli.py +0 -0
  364. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_config.py +0 -0
  365. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_global_user_state.py +0 -0
  366. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_jobs.py +0 -0
  367. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_jobs_and_serve.py +0 -0
  368. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_list_accelerators.py +0 -0
  369. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_optimizer_dryruns.py +0 -0
  370. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_optimizer_random_dag.py +0 -0
  371. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_serve_autoscaler.py +0 -0
  372. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_smoke.py +0 -0
  373. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_storage.py +0 -0
  374. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/tests/test_wheels.py +0 -0
  375. {skypilot_nightly-1.0.0.dev20250311 → skypilot_nightly-1.0.0.dev20250312}/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.dev20250311
3
+ Version: 1.0.0.dev20250312
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = '439de1a24a6f0a9601051ecdc3e565308bac442a'
8
+ _SKYPILOT_COMMIT_SHA = '78a42b6e733bbc29b68efe0e9c79191eaaca9fcd'
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.dev20250311'
38
+ __version__ = '1.0.0.dev20250312'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -6,9 +6,11 @@ from sky.adaptors import common
6
6
  NEBIUS_TENANT_ID_FILENAME = 'NEBIUS_TENANT_ID.txt'
7
7
  NEBIUS_IAM_TOKEN_FILENAME = 'NEBIUS_IAM_TOKEN.txt'
8
8
  NEBIUS_PROJECT_ID_FILENAME = 'NEBIUS_PROJECT_ID.txt'
9
+ NEBIUS_CREDENTIALS_FILENAME = 'credentials.json'
9
10
  NEBIUS_TENANT_ID_PATH = '~/.nebius/' + NEBIUS_TENANT_ID_FILENAME
10
11
  NEBIUS_IAM_TOKEN_PATH = '~/.nebius/' + NEBIUS_IAM_TOKEN_FILENAME
11
12
  NEBIUS_PROJECT_ID_PATH = '~/.nebius/' + NEBIUS_PROJECT_ID_FILENAME
13
+ NEBIUS_CREDENTIALS_PATH = '~/.nebius/' + NEBIUS_CREDENTIALS_FILENAME
12
14
 
13
15
  MAX_RETRIES_TO_DISK_CREATE = 120
14
16
  MAX_RETRIES_TO_INSTANCE_STOP = 120
@@ -72,6 +74,11 @@ def get_iam_token():
72
74
  return _iam_token
73
75
 
74
76
 
77
+ def is_token_or_cred_file_exist():
78
+ return (os.path.exists(os.path.expanduser(NEBIUS_IAM_TOKEN_PATH)) or
79
+ os.path.exists(os.path.expanduser(NEBIUS_CREDENTIALS_PATH)))
80
+
81
+
75
82
  def get_project_id():
76
83
  global _project_id
77
84
  if _project_id is None:
@@ -97,4 +104,7 @@ def get_tenant_id():
97
104
 
98
105
 
99
106
  def sdk():
100
- return nebius.sdk.SDK(credentials=get_iam_token())
107
+ if get_iam_token() is not None:
108
+ return nebius.sdk.SDK(credentials=get_iam_token())
109
+ return nebius.sdk.SDK(
110
+ credentials_file_name=os.path.expanduser(NEBIUS_CREDENTIALS_PATH))
@@ -1802,6 +1802,21 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
1802
1802
  status == status_lib.ClusterStatus.UP for status in node_statuses) and
1803
1803
  len(node_statuses) == handle.launched_nodes)
1804
1804
 
1805
+ def get_node_counts_from_ray_status(
1806
+ runner: command_runner.CommandRunner) -> Tuple[int, int, str, str]:
1807
+ rc, output, stderr = runner.run(
1808
+ instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND,
1809
+ stream_logs=False,
1810
+ require_outputs=True,
1811
+ separate_stderr=True)
1812
+ if rc:
1813
+ raise RuntimeError(
1814
+ f'Refreshing status ({cluster_name!r}): Failed to check '
1815
+ f'ray cluster\'s healthiness with '
1816
+ f'{instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND}.\n'
1817
+ f'-- stdout --\n{output}\n-- stderr --\n{stderr}')
1818
+ return (*_count_healthy_nodes_from_ray(output), output, stderr)
1819
+
1805
1820
  def run_ray_status_to_check_ray_cluster_healthy() -> bool:
1806
1821
  try:
1807
1822
  # NOTE: fetching the IPs is very slow as it calls into
@@ -1822,26 +1837,34 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
1822
1837
  raise exceptions.FetchClusterInfoError(
1823
1838
  reason=exceptions.FetchClusterInfoError.Reason.HEAD)
1824
1839
  head_runner = runners[0]
1825
- rc, output, stderr = head_runner.run(
1826
- instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND,
1827
- stream_logs=False,
1828
- require_outputs=True,
1829
- separate_stderr=True)
1830
- if rc:
1831
- raise RuntimeError(
1832
- f'Refreshing status ({cluster_name!r}): Failed to check '
1833
- f'ray cluster\'s healthiness with '
1834
- f'{instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND}.\n'
1835
- f'-- stdout --\n{output}\n-- stderr --\n{stderr}')
1836
1840
 
1837
- ready_head, ready_workers = _count_healthy_nodes_from_ray(output)
1838
1841
  total_nodes = handle.launched_nodes * handle.num_ips_per_node
1839
- if ready_head + ready_workers == total_nodes:
1840
- return True
1842
+
1843
+ for i in range(5):
1844
+ ready_head, ready_workers, output, stderr = (
1845
+ get_node_counts_from_ray_status(head_runner))
1846
+ if ready_head + ready_workers == total_nodes:
1847
+ return True
1848
+ logger.debug(f'Refreshing status ({cluster_name!r}) attempt '
1849
+ f'{i}: ray status not showing all nodes '
1850
+ f'({ready_head + ready_workers}/{total_nodes});\n'
1851
+ f'output:\n{output}\nstderr:\n{stderr}')
1852
+
1853
+ # If cluster JUST started, maybe not all the nodes have shown
1854
+ # up. Try again for a few seconds.
1855
+ # Note: We are okay with this performance hit because it's very
1856
+ # rare to normally hit this case. It requires:
1857
+ # - All the instances in the cluster are up on the cloud side
1858
+ # (not preempted), but
1859
+ # - The ray cluster is somehow degraded so not all instances are
1860
+ # showing up
1861
+ time.sleep(1)
1862
+
1841
1863
  raise RuntimeError(
1842
1864
  f'Refreshing status ({cluster_name!r}): ray status not showing '
1843
1865
  f'all nodes ({ready_head + ready_workers}/'
1844
- f'{total_nodes}); output: {output}; stderr: {stderr}')
1866
+ f'{total_nodes});\noutput:\n{output}\nstderr:\n{stderr}')
1867
+
1845
1868
  except exceptions.FetchClusterInfoError:
1846
1869
  logger.debug(
1847
1870
  f'Refreshing status ({cluster_name!r}) failed to get IPs.')
@@ -772,32 +772,6 @@ class FailoverCloudErrorHandlerV1:
772
772
  setattr(e, 'detailed_reason', detailed_reason)
773
773
  raise e
774
774
 
775
- @staticmethod
776
- def _lambda_handler(blocked_resources: Set['resources_lib.Resources'],
777
- launchable_resources: 'resources_lib.Resources',
778
- region: 'clouds.Region',
779
- zones: Optional[List['clouds.Zone']], stdout: str,
780
- stderr: str):
781
- del region, zones # Unused.
782
- errors = FailoverCloudErrorHandlerV1._handle_errors(
783
- stdout,
784
- stderr,
785
- is_error_str_known=lambda x: 'LambdaCloudError:' in x.strip())
786
- messages = '\n '.join(errors)
787
- style = colorama.Style
788
- logger.warning(f' {style.DIM}{messages}{style.RESET_ALL}')
789
- _add_to_blocked_resources(blocked_resources,
790
- launchable_resources.copy(zone=None))
791
-
792
- # Sometimes, LambdaCloudError will list available regions.
793
- for e in errors:
794
- if e.find('Regions with capacity available:') != -1:
795
- for r in service_catalog.regions('lambda'):
796
- if e.find(r.name) == -1:
797
- _add_to_blocked_resources(
798
- blocked_resources,
799
- launchable_resources.copy(region=r.name, zone=None))
800
-
801
775
  @staticmethod
802
776
  def _scp_handler(blocked_resources: Set['resources_lib.Resources'],
803
777
  launchable_resources: 'resources_lib.Resources',
@@ -846,32 +820,6 @@ class FailoverCloudErrorHandlerV1:
846
820
  _add_to_blocked_resources(blocked_resources,
847
821
  launchable_resources.copy(zone=zone.name))
848
822
 
849
- # Apr, 2023 by Hysun(hysun.he@oracle.com): Added support for OCI
850
- @staticmethod
851
- def _oci_handler(blocked_resources: Set['resources_lib.Resources'],
852
- launchable_resources: 'resources_lib.Resources',
853
- region: 'clouds.Region',
854
- zones: Optional[List['clouds.Zone']], stdout: str,
855
- stderr: str):
856
- known_service_errors = [
857
- 'NotAuthorizedOrNotFound', 'CannotParseRequest', 'InternalError',
858
- 'LimitExceeded', 'NotAuthenticated'
859
- ]
860
- errors = FailoverCloudErrorHandlerV1._handle_errors(
861
- stdout, stderr, lambda x: 'VcnSubnetNotFound' in x.strip() or
862
- ('oci.exceptions.ServiceError' in x.strip() and any(
863
- known_err in x.strip() for known_err in known_service_errors)))
864
- logger.warning(f'Got error(s) in {region.name}:')
865
- messages = '\n\t'.join(errors)
866
- style = colorama.Style
867
- logger.warning(f'{style.DIM}\t{messages}{style.RESET_ALL}')
868
-
869
- if zones is not None:
870
- for zone in zones:
871
- _add_to_blocked_resources(
872
- blocked_resources,
873
- launchable_resources.copy(zone=zone.name))
874
-
875
823
  @staticmethod
876
824
  def update_blocklist_on_error(
877
825
  blocked_resources: Set['resources_lib.Resources'],
@@ -1123,6 +1071,23 @@ class FailoverCloudErrorHandlerV2:
1123
1071
  blocked_resources,
1124
1072
  launchable_resources.copy(zone=zone.name))
1125
1073
 
1074
+ @staticmethod
1075
+ def _lambda_handler(blocked_resources: Set['resources_lib.Resources'],
1076
+ launchable_resources: 'resources_lib.Resources',
1077
+ region: 'clouds.Region',
1078
+ zones: Optional[List['clouds.Zone']], error: Exception):
1079
+ output = str(error)
1080
+ # Sometimes, lambda cloud error will list available regions.
1081
+ if output.find('Regions with capacity available:') != -1:
1082
+ for r in service_catalog.regions('lambda'):
1083
+ if output.find(r.name) == -1:
1084
+ _add_to_blocked_resources(
1085
+ blocked_resources,
1086
+ launchable_resources.copy(region=r.name, zone=None))
1087
+ else:
1088
+ FailoverCloudErrorHandlerV2._default_handler(
1089
+ blocked_resources, launchable_resources, region, zones, error)
1090
+
1126
1091
  @staticmethod
1127
1092
  def _default_handler(blocked_resources: Set['resources_lib.Resources'],
1128
1093
  launchable_resources: 'resources_lib.Resources',
@@ -17,6 +17,7 @@ _CREDENTIAL_FILES = [
17
17
  nebius.NEBIUS_TENANT_ID_FILENAME,
18
18
  nebius.NEBIUS_IAM_TOKEN_FILENAME,
19
19
  nebius.NEBIUS_PROJECT_ID_FILENAME,
20
+ nebius.NEBIUS_CREDENTIALS_FILENAME
20
21
  ]
21
22
 
22
23
 
@@ -252,15 +253,16 @@ class Nebius(clouds.Cloud):
252
253
  def check_credentials(cls) -> Tuple[bool, Optional[str]]:
253
254
  """ Verify that the user has valid credentials for Nebius. """
254
255
  logging.debug('Nebius cloud check credentials')
255
- token = nebius.get_iam_token()
256
- token_msg = (' Credentials can be set up by running: \n'\
257
- f' $ nebius iam get-access-token > {nebius.NEBIUS_IAM_TOKEN_PATH} \n') # pylint: disable=line-too-long
256
+ token_cred_msg = (' Credentials can be set up by running: \n'\
257
+ f' $ nebius iam get-access-token > {nebius.NEBIUS_IAM_TOKEN_PATH} \n'\
258
+ ' or generate ~/.nebius/credentials.json') # pylint: disable=line-too-long
259
+
258
260
  tenant_msg = (' Copy your tenat ID from the web console and save it to file \n' # pylint: disable=line-too-long
259
261
  f' $ echo $NEBIUS_TENANT_ID_PATH > {nebius.NEBIUS_TENANT_ID_PATH} \n' # pylint: disable=line-too-long
260
262
  ' Or if you have 1 tenant you can run:\n' # pylint: disable=line-too-long
261
263
  f' $ nebius --format json iam whoami|jq -r \'.user_profile.tenants[0].tenant_id\' > {nebius.NEBIUS_TENANT_ID_PATH} \n') # pylint: disable=line-too-long
262
- if token is None:
263
- return False, f'{token_msg}'
264
+ if not nebius.is_token_or_cred_file_exist():
265
+ return False, f'{token_cred_msg}'
264
266
  sdk = nebius.sdk()
265
267
  tenant_id = nebius.get_tenant_id()
266
268
  if tenant_id is None:
@@ -272,7 +274,7 @@ class Nebius(clouds.Cloud):
272
274
  except nebius.request_error() as e:
273
275
  return False, (
274
276
  f'{e.status} \n' # First line is indented by 4 spaces
275
- f'{token_msg}'
277
+ f'{token_cred_msg}'
276
278
  f'{tenant_msg}')
277
279
  return True, None
278
280
 
@@ -28,12 +28,19 @@ GIT_FATAL_EXIT_CODE = 128
28
28
  ARCH_NOT_SUPPORTED_EXIT_CODE = 133
29
29
 
30
30
 
31
- def is_safe_exception(exc: Exception) -> bool:
31
+ def is_safe_exception(exc: BaseException) -> bool:
32
32
  """Returns True if the exception is safe to send to clients.
33
33
 
34
34
  Safe exceptions are:
35
35
  1. Built-in exceptions
36
36
  2. SkyPilot's own exceptions
37
+
38
+ Args:
39
+ exc: The exception to check, accept BaseException to handle SystemExit
40
+ and KeyboardInterrupt.
41
+
42
+ Returns:
43
+ True if the exception is safe to send to clients, False otherwise.
37
44
  """
38
45
  module = type(exc).__module__
39
46
 
@@ -48,7 +55,7 @@ def is_safe_exception(exc: Exception) -> bool:
48
55
  return False
49
56
 
50
57
 
51
- def wrap_exception(exc: Exception) -> Exception:
58
+ def wrap_exception(exc: BaseException) -> BaseException:
52
59
  """Wraps non-safe exceptions into SkyPilot exceptions
53
60
 
54
61
  This is used to wrap exceptions that are not safe to deserialize at clients.
@@ -64,7 +71,8 @@ def wrap_exception(exc: Exception) -> Exception:
64
71
  error_type=type(exc).__name__)
65
72
 
66
73
 
67
- def serialize_exception(e: Exception) -> Dict[str, Any]:
74
+ # Accept BaseException to handle SystemExit and KeyboardInterrupt
75
+ def serialize_exception(e: BaseException) -> Dict[str, Any]:
68
76
  """Serialize the exception.
69
77
 
70
78
  This function also wraps any unsafe exceptions (e.g., cloud exceptions)
@@ -853,7 +853,7 @@ def get_accelerator_label_key_value(
853
853
  for label, value in label_list:
854
854
  if (label_formatter.match_label_key(label) and
855
855
  label_formatter.get_accelerator_from_label_value(
856
- value) == acc_type):
856
+ value).lower() == acc_type.lower()):
857
857
  if is_tpu_on_gke(acc_type):
858
858
  assert isinstance(label_formatter,
859
859
  GKELabelFormatter)
@@ -0,0 +1,31 @@
1
+ """Executor event loop to process tasks in coroutines."""
2
+ import asyncio
3
+ import concurrent.futures
4
+ import threading
5
+ from typing import Coroutine, Optional
6
+
7
+ # Dedicated event loop for requests, isolated with the event loop managed
8
+ # by uvicorn. This is responsible for light-weight async tasks or sub-tasks,
9
+ # refer to `executor.py` for more details about cooperation between the event
10
+ # loop and executor process pool.
11
+ _EVENT_LOOP: Optional[asyncio.AbstractEventLoop] = None
12
+ _LOCK = threading.Lock()
13
+
14
+
15
+ def run(coro: Coroutine) -> concurrent.futures.Future:
16
+ """Run a coroutine asynchronously in the request event loop."""
17
+ return asyncio.run_coroutine_threadsafe(coro, get_event_loop())
18
+
19
+
20
+ def get_event_loop() -> asyncio.AbstractEventLoop:
21
+ """Open and get the event loop."""
22
+ global _EVENT_LOOP
23
+ if _EVENT_LOOP is not None and not _EVENT_LOOP.is_closed():
24
+ return _EVENT_LOOP
25
+ with _LOCK:
26
+ if _EVENT_LOOP is None or _EVENT_LOOP.is_closed():
27
+ _EVENT_LOOP = asyncio.new_event_loop()
28
+ loop_thread = threading.Thread(target=_EVENT_LOOP.run_forever,
29
+ daemon=True)
30
+ loop_thread.start()
31
+ return _EVENT_LOOP
@@ -27,8 +27,8 @@ import os
27
27
  import queue as queue_lib
28
28
  import signal
29
29
  import sys
30
+ import threading
30
31
  import time
31
- import traceback
32
32
  import typing
33
33
  from typing import Any, Callable, Generator, List, Optional, TextIO, Tuple
34
34
 
@@ -41,11 +41,13 @@ from sky import skypilot_config
41
41
  from sky.server import common as server_common
42
42
  from sky.server import constants as server_constants
43
43
  from sky.server.requests import payloads
44
+ from sky.server.requests import preconditions
44
45
  from sky.server.requests import requests as api_requests
45
46
  from sky.server.requests.queues import mp_queue
46
47
  from sky.skylet import constants
47
48
  from sky.utils import annotations
48
49
  from sky.utils import common_utils
50
+ from sky.utils import subprocess_utils
49
51
  from sky.utils import timeline
50
52
  from sky.utils import ux_utils
51
53
 
@@ -262,13 +264,7 @@ def _request_execution_wrapper(request_id: str,
262
264
  _restore_output(original_stdout, original_stderr)
263
265
  return
264
266
  except (Exception, SystemExit) as e: # pylint: disable=broad-except
265
- with ux_utils.enable_traceback():
266
- stacktrace = traceback.format_exc()
267
- setattr(e, 'stacktrace', stacktrace)
268
- with api_requests.update_request(request_id) as request_task:
269
- assert request_task is not None, request_id
270
- request_task.status = api_requests.RequestStatus.FAILED
271
- request_task.set_error(e)
267
+ api_requests.set_request_failed(request_id, e)
272
268
  _restore_output(original_stdout, original_stderr)
273
269
  logger.info(f'Request {request_id} failed due to '
274
270
  f'{common_utils.format_exception(e)}')
@@ -283,16 +279,37 @@ def _request_execution_wrapper(request_id: str,
283
279
  logger.info(f'Request {request_id} finished')
284
280
 
285
281
 
286
- def schedule_request(request_id: str,
287
- request_name: str,
288
- request_body: payloads.RequestBody,
289
- func: Callable[P, Any],
290
- request_cluster_name: Optional[str] = None,
291
- ignore_return_value: bool = False,
292
- schedule_type: api_requests.ScheduleType = api_requests.
293
- ScheduleType.LONG,
294
- is_skypilot_system: bool = False) -> None:
295
- """Enqueue a request to the request queue."""
282
+ def schedule_request(
283
+ request_id: str,
284
+ request_name: str,
285
+ request_body: payloads.RequestBody,
286
+ func: Callable[P, Any],
287
+ request_cluster_name: Optional[str] = None,
288
+ ignore_return_value: bool = False,
289
+ schedule_type: api_requests.ScheduleType = (
290
+ api_requests.ScheduleType.LONG),
291
+ is_skypilot_system: bool = False,
292
+ precondition: Optional[preconditions.Precondition] = None) -> None:
293
+ """Enqueue a request to the request queue.
294
+
295
+ Args:
296
+ request_id: ID of the request.
297
+ request_name: Name of the request type, e.g. "sky.launch".
298
+ request_body: The request body containing parameters and environment
299
+ variables.
300
+ func: The function to execute when the request is processed.
301
+ request_cluster_name: The name of the cluster associated with this
302
+ request, if any.
303
+ ignore_return_value: If True, the return value of the function will be
304
+ ignored.
305
+ schedule_type: The type of scheduling to use for this request, refer to
306
+ `api_requests.ScheduleType` for more details.
307
+ is_skypilot_system: Denote whether the request is from SkyPilot system.
308
+ precondition: If a precondition is provided, the request will only be
309
+ scheduled for execution when the precondition is met (returns True).
310
+ The precondition is waited asynchronously and does not block the
311
+ caller.
312
+ """
296
313
  user_id = request_body.env_vars[constants.USER_ID_ENV_VAR]
297
314
  if is_skypilot_system:
298
315
  user_id = server_constants.SKYPILOT_SYSTEM_USER_ID
@@ -314,10 +331,17 @@ def schedule_request(request_id: str,
314
331
  return
315
332
 
316
333
  request.log_path.touch()
317
- input_tuple = (request_id, ignore_return_value)
318
334
 
319
- logger.info(f'Queuing request: {request_id}')
320
- _get_queue(schedule_type).put(input_tuple)
335
+ def enqueue():
336
+ input_tuple = (request_id, ignore_return_value)
337
+ logger.info(f'Queuing request: {request_id}')
338
+ _get_queue(schedule_type).put(input_tuple)
339
+
340
+ if precondition is not None:
341
+ # Wait async to avoid blocking caller.
342
+ precondition.wait_async(on_condition_met=enqueue)
343
+ else:
344
+ enqueue()
321
345
 
322
346
 
323
347
  def executor_initializer(proc_group: str):
@@ -431,13 +455,17 @@ def start(deploy: bool) -> List[multiprocessing.Process]:
431
455
 
432
456
  logger.info('Request queues created')
433
457
 
458
+ long_workers = []
434
459
  for worker_id in range(max_parallel_for_long):
435
460
  worker = RequestWorker(id=worker_id,
436
461
  schedule_type=api_requests.ScheduleType.LONG)
437
462
  worker_proc = multiprocessing.Process(target=request_worker,
438
463
  args=(worker, 1))
439
- worker_proc.start()
464
+ long_workers.append(worker_proc)
440
465
  sub_procs.append(worker_proc)
466
+ threading.Thread(target=subprocess_utils.slow_start_processes,
467
+ args=(long_workers,),
468
+ daemon=True).start()
441
469
 
442
470
  # Start a worker for short requests.
443
471
  worker = RequestWorker(id=1, schedule_type=api_requests.ScheduleType.SHORT)
@@ -0,0 +1,174 @@
1
+ """Precondition for a request to be executed.
2
+
3
+ Preconditions are introduced so that:
4
+ - Wait for precondition does not block executor process, which is expensive;
5
+ - Cross requests knowledge (e.g. waiting for other requests to be completed)
6
+ can be handled at precondition level, instead of invading the execution
7
+ logic of specific requests.
8
+ """
9
+ import abc
10
+ import asyncio
11
+ import time
12
+ from typing import Callable, Optional, Tuple
13
+
14
+ from sky import exceptions
15
+ from sky import global_user_state
16
+ from sky import sky_logging
17
+ from sky.server.requests import event_loop
18
+ from sky.server.requests import requests as api_requests
19
+ from sky.utils import common_utils
20
+ from sky.utils import status_lib
21
+
22
+ # The default interval seconds to check the precondition.
23
+ _PRECONDITION_CHECK_INTERVAL = 1
24
+ # The default timeout seconds to wait for the precondition to be met.
25
+ _PRECONDITION_TIMEOUT = 60 * 60
26
+
27
+ logger = sky_logging.init_logger(__name__)
28
+
29
+
30
+ class Precondition(abc.ABC):
31
+ """Abstract base class for a precondition for a request to be executed.
32
+
33
+ A Precondition can be waited in either of the following ways:
34
+ - await Precondition: wait for the precondition to be met.
35
+ - Precondition.wait_async: wait for the precondition to be met in background
36
+ and execute the given callback on met.
37
+ """
38
+
39
+ def __init__(self,
40
+ request_id: str,
41
+ check_interval: float = _PRECONDITION_CHECK_INTERVAL,
42
+ timeout: float = _PRECONDITION_TIMEOUT):
43
+ self.request_id = request_id
44
+ self.check_interval = check_interval
45
+ self.timeout = timeout
46
+
47
+ def __await__(self):
48
+ """Make Precondition awaitable."""
49
+ return self._wait().__await__()
50
+
51
+ def wait_async(
52
+ self,
53
+ on_condition_met: Optional[Callable[[], None]] = None) -> None:
54
+ """Wait precondition asynchronously and execute the callback on met."""
55
+
56
+ async def wait_with_callback():
57
+ met = await self
58
+ if met and on_condition_met is not None:
59
+ on_condition_met()
60
+
61
+ event_loop.run(wait_with_callback())
62
+
63
+ @abc.abstractmethod
64
+ async def check(self) -> Tuple[bool, Optional[str]]:
65
+ """Check if the precondition is met.
66
+
67
+ Note that compared to _request_execution_wrapper, the env vars and
68
+ skypilot config here are not overridden since the lack of process
69
+ isolation, which may cause issues if the check accidentally depends on
70
+ these. Make sure the check function is independent of the request
71
+ environment.
72
+ TODO(aylei): a new request context isolation mechanism is needed to
73
+ enable more tasks/sub-tasks to be processed in coroutines or threads.
74
+
75
+ Returns:
76
+ A tuple of (bool, Optional[str]).
77
+ The bool indicates if the precondition is met.
78
+ The str is the current status of the precondition if any.
79
+ """
80
+ raise NotImplementedError
81
+
82
+ async def _wait(self) -> bool:
83
+ """Wait for the precondition to be met.
84
+
85
+ Args:
86
+ on_condition_met: Callback to execute when the precondition is met.
87
+ """
88
+ start_time = time.time()
89
+ last_status_msg = ''
90
+ while True:
91
+ if self.timeout > 0 and time.time() - start_time > self.timeout:
92
+ # Cancel the request on timeout.
93
+ api_requests.set_request_failed(
94
+ self.request_id,
95
+ exceptions.RequestCancelled(
96
+ f'Request {self.request_id} precondition wait timed '
97
+ f'out after {self.timeout}s'))
98
+ return False
99
+
100
+ # Check if the request has been cancelled
101
+ request = api_requests.get_request(self.request_id)
102
+ if request is None:
103
+ logger.error(f'Request {self.request_id} not found')
104
+ return False
105
+ if request.status == api_requests.RequestStatus.CANCELLED:
106
+ logger.debug(f'Request {self.request_id} cancelled')
107
+ return False
108
+
109
+ try:
110
+ met, status_msg = await self.check()
111
+ if met:
112
+ return True
113
+ if status_msg is not None and status_msg != last_status_msg:
114
+ # Update the status message if it has changed.
115
+ with api_requests.update_request(self.request_id) as req:
116
+ assert req is not None, self.request_id
117
+ req.status_msg = status_msg
118
+ last_status_msg = status_msg
119
+ except (Exception, SystemExit, KeyboardInterrupt) as e: # pylint: disable=broad-except
120
+ api_requests.set_request_failed(self.request_id, e)
121
+ logger.info(f'Request {self.request_id} failed due to '
122
+ f'{common_utils.format_exception(e)}')
123
+ return False
124
+
125
+ await asyncio.sleep(self.check_interval)
126
+
127
+
128
+ class ClusterStartCompletePrecondition(Precondition):
129
+ """Whether the start process of a cluster is complete.
130
+
131
+ This condition only waits the start process of a cluster to complete, e.g.
132
+ `sky launch` or `sky start`.
133
+ For cluster that has been started but not in UP status, bypass the waiting
134
+ in favor of:
135
+ - allowing the task to refresh cluster status from cloud vendor;
136
+ - unified error message in task handlers.
137
+
138
+ Args:
139
+ request_id: The request ID of the task.
140
+ cluster_name: The name of the cluster to wait for.
141
+ """
142
+
143
+ def __init__(self, request_id: str, cluster_name: str, **kwargs):
144
+ super().__init__(request_id=request_id, **kwargs)
145
+ self.cluster_name = cluster_name
146
+
147
+ async def check(self) -> Tuple[bool, Optional[str]]:
148
+ cluster_record = global_user_state.get_cluster_from_name(
149
+ self.cluster_name)
150
+ if (cluster_record and
151
+ cluster_record['status'] is status_lib.ClusterStatus.UP):
152
+ # Shortcut for started clusters, ignore cluster not found
153
+ # since the cluster record might not yet be created by the
154
+ # launch task.
155
+ return True, None
156
+ # Check if there is a task starting the cluster, we do not check
157
+ # SUCCEEDED requests since successfully launched cluster can be
158
+ # restarted later on.
159
+ # Note that since the requests are not persistent yet between restarts,
160
+ # a cluster might be started in halfway and requests are lost.
161
+ # We unify these situations into a single state: the process of starting
162
+ # the cluster is done (either normally or abnormally) but cluster is not
163
+ # in UP status.
164
+ requests = api_requests.get_request_tasks(
165
+ status=[
166
+ api_requests.RequestStatus.RUNNING,
167
+ api_requests.RequestStatus.PENDING
168
+ ],
169
+ include_request_names=['sky.launch', 'sky.start'],
170
+ cluster_names=[self.cluster_name])
171
+ if len(requests) == 0:
172
+ # No runnning or pending tasks, the start process is done.
173
+ return True, None
174
+ return False, f'Waiting for cluster {self.cluster_name} to be UP.'