skypilot-nightly 1.0.0.dev20250320__tar.gz → 1.0.0.dev20250321__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 (376) hide show
  1. {skypilot_nightly-1.0.0.dev20250320/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250321}/PKG-INFO +11 -1
  2. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/cloudflare.py +16 -4
  4. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/kubernetes.py +2 -1
  5. skypilot_nightly-1.0.0.dev20250321/sky/adaptors/nebius.py +232 -0
  6. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/cloud_vm_ray_backend.py +3 -1
  7. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/benchmark/benchmark_utils.py +3 -2
  8. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/check.py +18 -87
  9. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/cloud_stores.py +66 -0
  10. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/aws.py +14 -7
  11. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/azure.py +13 -6
  12. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/cloud.py +33 -10
  13. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/cudo.py +3 -2
  14. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/do.py +3 -2
  15. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/fluidstack.py +3 -2
  16. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/gcp.py +8 -9
  17. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/ibm.py +15 -6
  18. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/kubernetes.py +3 -1
  19. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/lambda_cloud.py +3 -1
  20. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/nebius.py +7 -3
  21. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/oci.py +15 -6
  22. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/paperspace.py +3 -2
  23. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/runpod.py +7 -1
  24. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/scp.py +3 -1
  25. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/kubernetes_catalog.py +3 -1
  26. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/vast.py +3 -2
  27. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/vsphere.py +3 -2
  28. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/core.py +4 -2
  29. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/data_transfer.py +75 -0
  30. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/data_utils.py +34 -0
  31. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/mounting_utils.py +18 -0
  32. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/storage.py +537 -9
  33. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/storage_utils.py +102 -84
  34. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/exceptions.py +2 -0
  35. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/global_user_state.py +12 -33
  36. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/server/core.py +1 -1
  37. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/utils.py +5 -0
  38. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/optimizer.py +7 -2
  39. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/resources.py +6 -1
  40. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/setup_files/dependencies.py +3 -1
  41. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/task.py +16 -5
  42. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/command_runner.py +2 -0
  43. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/controller_utils.py +8 -5
  44. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/kubernetes_deploy_utils.py +2 -1
  45. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321/skypilot_nightly.egg-info}/PKG-INFO +11 -1
  46. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/skypilot_nightly.egg-info/requires.txt +5 -0
  47. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_global_user_state.py +2 -1
  48. skypilot_nightly-1.0.0.dev20250320/sky/adaptors/nebius.py +0 -110
  49. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/LICENSE +0 -0
  50. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/MANIFEST.in +0 -0
  51. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/README.md +0 -0
  52. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/pyproject.toml +0 -0
  53. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/setup.cfg +0 -0
  54. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/setup.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/__init__.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/aws.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/azure.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/common.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/cudo.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/do.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/docker.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/gcp.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/ibm.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/oci.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/runpod.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/vast.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/adaptors/vsphere.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/admin_policy.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/authentication.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/__init__.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/backend.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/backend_utils.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/docker_utils.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/local_docker_backend.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/backends/wheel_utils.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/benchmark/__init__.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/benchmark/benchmark_state.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/cli.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/client/__init__.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/client/cli.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/client/common.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/client/sdk.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/__init__.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/__init__.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/common.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/config.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/constants.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_vast.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/do_catalog.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/nebius_catalog.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/vast_catalog.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/__init__.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/aws_utils.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/azure_utils.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/gcp_utils.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/oci_utils.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/clouds/utils/scp_utils.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/dag.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/data/__init__.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/execution.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/__init__.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/client/__init__.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/client/sdk.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/constants.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/controller.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/dashboard/dashboard.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/dashboard/static/favicon.ico +0 -0
  129. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/dashboard/templates/index.html +0 -0
  130. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/recovery_strategy.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/scheduler.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/server/__init__.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/server/dashboard_utils.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/server/server.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/jobs/state.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/models.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/__init__.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/aws/__init__.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/aws/config.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/aws/instance.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/aws/utils.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/azure/__init__.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/azure/azure-config-template.json +0 -0
  144. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/azure/config.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/azure/instance.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/common.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/constants.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/__init__.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/config.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/cudo_machine_type.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/cudo_utils.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/cudo_wrapper.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/cudo/instance.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/do/__init__.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/do/config.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/do/constants.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/do/instance.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/do/utils.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/docker_utils.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/fluidstack/__init__.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/fluidstack/config.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/fluidstack/instance.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/__init__.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/config.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/constants.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/instance.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/instance_utils.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/gcp/mig_utils.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/instance_setup.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/__init__.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/config.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/constants.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/instance.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  176. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  177. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/network.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/network_utils.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/kubernetes/utils.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/lambda_cloud/__init__.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/lambda_cloud/config.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/lambda_cloud/instance.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/logging.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/metadata_utils.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/nebius/__init__.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/nebius/config.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/nebius/instance.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/nebius/utils.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/oci/__init__.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/oci/config.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/oci/instance.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/oci/query_utils.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/paperspace/__init__.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/paperspace/config.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/paperspace/constants.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/paperspace/instance.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/paperspace/utils.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/provisioner.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/__init__.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/api/__init__.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/api/commands.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/api/pods.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/config.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/instance.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/runpod/utils.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vast/__init__.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vast/config.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vast/instance.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vast/utils.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/__init__.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/__init__.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/custom_script.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/id_generator.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/service_manager.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/common/vim_utils.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/config.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/instance.py +0 -0
  225. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/provision/vsphere/vsphere_utils.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/__init__.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/autoscalers.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/client/__init__.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/client/sdk.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/constants.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/controller.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/load_balancer.py +0 -0
  233. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/load_balancing_policies.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/replica_managers.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/serve_state.py +0 -0
  236. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/serve_utils.py +0 -0
  237. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/server/__init__.py +0 -0
  238. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/server/core.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/server/server.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/service.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/serve/service_spec.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/__init__.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/common.py +0 -0
  244. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/constants.py +0 -0
  245. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/html/log.html +0 -0
  246. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/__init__.py +0 -0
  247. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/event_loop.py +0 -0
  248. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/executor.py +0 -0
  249. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/payloads.py +0 -0
  250. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/preconditions.py +0 -0
  251. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/queues/__init__.py +0 -0
  252. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/queues/mp_queue.py +0 -0
  253. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/requests.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/serializers/__init__.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/serializers/decoders.py +0 -0
  256. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/requests/serializers/encoders.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/server.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/stream_utils.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/server/uvicorn.py +0 -0
  260. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/setup_files/MANIFEST.in +0 -0
  261. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/setup_files/setup.py +0 -0
  262. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/sky_logging.py +0 -0
  263. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/LICENSE +0 -0
  264. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/__init__.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/attempt_skylet.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/autostop_lib.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/configs.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/constants.py +0 -0
  269. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/events.py +0 -0
  270. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/job_lib.py +0 -0
  271. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/log_lib.py +0 -0
  272. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/log_lib.pyi +0 -0
  273. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/__init__.py +0 -0
  274. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/command_runner.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/ibm/__init__.py +0 -0
  276. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/ibm/node_provider.py +0 -0
  277. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/ibm/utils.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/scp/__init__.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/scp/config.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/providers/scp/node_provider.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/__init__.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  284. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/cli.py.patch +0 -0
  285. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  286. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  287. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  288. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/updater.py.patch +0 -0
  289. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/ray_patches/worker.py.patch +0 -0
  290. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/skylet.py +0 -0
  291. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skylet/subprocess_daemon.py +0 -0
  292. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/skypilot_config.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/aws-ray.yml.j2 +0 -0
  294. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/azure-ray.yml.j2 +0 -0
  295. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/cudo-ray.yml.j2 +0 -0
  296. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/do-ray.yml.j2 +0 -0
  297. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  298. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/gcp-ray.yml.j2 +0 -0
  299. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/ibm-ray.yml.j2 +0 -0
  300. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/jobs-controller.yaml.j2 +0 -0
  301. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  302. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  303. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  304. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/kubernetes-ray.yml.j2 +0 -0
  305. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  306. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/lambda-ray.yml.j2 +0 -0
  307. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/local-ray.yml.j2 +0 -0
  308. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/nebius-ray.yml.j2 +0 -0
  309. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/oci-ray.yml.j2 +0 -0
  310. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/paperspace-ray.yml.j2 +0 -0
  311. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/runpod-ray.yml.j2 +0 -0
  312. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/scp-ray.yml.j2 +0 -0
  313. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  314. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
  315. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/vast-ray.yml.j2 +0 -0
  316. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/vsphere-ray.yml.j2 +0 -0
  317. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/templates/websocket_proxy.py +0 -0
  318. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/usage/__init__.py +0 -0
  319. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/usage/constants.py +0 -0
  320. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/usage/usage_lib.py +0 -0
  321. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/__init__.py +0 -0
  322. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/accelerator_registry.py +0 -0
  323. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/admin_policy_utils.py +0 -0
  324. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/annotations.py +0 -0
  325. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/cli_utils/__init__.py +0 -0
  326. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/cli_utils/status_utils.py +0 -0
  327. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/cluster_utils.py +0 -0
  328. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/command_runner.pyi +0 -0
  329. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/common.py +0 -0
  330. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/common_utils.py +0 -0
  331. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/config_utils.py +0 -0
  332. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/control_master_utils.py +0 -0
  333. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/dag_utils.py +0 -0
  334. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/db_utils.py +0 -0
  335. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/env_options.py +0 -0
  336. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/__init__.py +0 -0
  337. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/create_cluster.sh +0 -0
  338. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  339. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  340. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
  341. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  342. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  343. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  344. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  345. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  346. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  347. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  348. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/kubernetes_enums.py +0 -0
  349. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/log_utils.py +0 -0
  350. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/message_utils.py +0 -0
  351. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/registry.py +0 -0
  352. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/resources_utils.py +0 -0
  353. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/rich_utils.py +0 -0
  354. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/schemas.py +0 -0
  355. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/status_lib.py +0 -0
  356. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/subprocess_utils.py +0 -0
  357. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/timeline.py +0 -0
  358. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/ux_utils.py +0 -0
  359. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/sky/utils/validator.py +0 -0
  360. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/skypilot_nightly.egg-info/SOURCES.txt +0 -0
  361. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  362. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  363. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/skypilot_nightly.egg-info/top_level.txt +0 -0
  364. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_api.py +0 -0
  365. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_cli.py +0 -0
  366. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_config.py +0 -0
  367. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_jobs.py +0 -0
  368. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_jobs_and_serve.py +0 -0
  369. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_list_accelerators.py +0 -0
  370. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_optimizer_dryruns.py +0 -0
  371. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_optimizer_random_dag.py +0 -0
  372. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_serve_autoscaler.py +0 -0
  373. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_smoke.py +0 -0
  374. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_storage.py +0 -0
  375. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_wheels.py +0 -0
  376. {skypilot_nightly-1.0.0.dev20250320 → skypilot_nightly-1.0.0.dev20250321}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250320
3
+ Version: 1.0.0.dev20250321
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -108,6 +108,11 @@ Provides-Extra: vsphere
108
108
  Requires-Dist: pyvmomi==8.0.1.0.2; extra == "vsphere"
109
109
  Provides-Extra: nebius
110
110
  Requires-Dist: nebius>=0.2.0; extra == "nebius"
111
+ Requires-Dist: urllib3<2; extra == "nebius"
112
+ Requires-Dist: awscli>=1.27.10; extra == "nebius"
113
+ Requires-Dist: botocore>=1.29.10; extra == "nebius"
114
+ Requires-Dist: boto3>=1.26.1; extra == "nebius"
115
+ Requires-Dist: colorama<0.4.5; extra == "nebius"
111
116
  Provides-Extra: all
112
117
  Requires-Dist: urllib3<2; extra == "all"
113
118
  Requires-Dist: awscli>=1.27.10; extra == "all"
@@ -151,6 +156,11 @@ Requires-Dist: azure-common; extra == "all"
151
156
  Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
152
157
  Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
153
158
  Requires-Dist: nebius>=0.2.0; extra == "all"
159
+ Requires-Dist: urllib3<2; extra == "all"
160
+ Requires-Dist: awscli>=1.27.10; extra == "all"
161
+ Requires-Dist: botocore>=1.29.10; extra == "all"
162
+ Requires-Dist: boto3>=1.26.1; extra == "all"
163
+ Requires-Dist: colorama<0.4.5; extra == "all"
154
164
  Dynamic: author
155
165
  Dynamic: classifier
156
166
  Dynamic: description
@@ -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 = 'a480f342522afcd17a3b30a20086f28333ddb7b5'
8
+ _SKYPILOT_COMMIT_SHA = 'a7f92951b96fdca825348d8291d01bd88f6f9dfe'
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.dev20250320'
38
+ __version__ = '1.0.0.dev20250321'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -6,7 +6,9 @@ import os
6
6
  import threading
7
7
  from typing import Dict, Optional, Tuple
8
8
 
9
+ from sky import exceptions
9
10
  from sky.adaptors import common
11
+ from sky.clouds import cloud
10
12
  from sky.utils import annotations
11
13
  from sky.utils import ux_utils
12
14
 
@@ -130,8 +132,8 @@ def client(service_name: str, region):
130
132
  @common.load_lazy_modules(_LAZY_MODULES)
131
133
  def botocore_exceptions():
132
134
  """AWS botocore exception."""
133
- from botocore import exceptions
134
- return exceptions
135
+ from botocore import exceptions as boto_exceptions
136
+ return boto_exceptions
135
137
 
136
138
 
137
139
  def create_endpoint():
@@ -148,8 +150,18 @@ def create_endpoint():
148
150
  return endpoint
149
151
 
150
152
 
151
- def check_credentials() -> Tuple[bool, Optional[str]]:
152
- return check_storage_credentials()
153
+ def check_credentials(
154
+ cloud_capability: cloud.CloudCapability) -> Tuple[bool, Optional[str]]:
155
+ if cloud_capability == cloud.CloudCapability.COMPUTE:
156
+ # for backward compatibility,
157
+ # we check storage credentials for compute.
158
+ # TODO(seungjin): properly return not supported error for compute.
159
+ return check_storage_credentials()
160
+ elif cloud_capability == cloud.CloudCapability.STORAGE:
161
+ return check_storage_credentials()
162
+ else:
163
+ raise exceptions.NotSupportedError(
164
+ f'{NAME} does not support {cloud_capability}.')
153
165
 
154
166
 
155
167
  def check_storage_credentials() -> Tuple[bool, Optional[str]]:
@@ -79,10 +79,11 @@ def _load_config(context: Optional[str] = None):
79
79
  ' If you were running a local Kubernetes '
80
80
  'cluster, run `sky local up` to start the cluster.')
81
81
  else:
82
+ kubeconfig_path = os.environ.get('KUBECONFIG', '~/.kube/config')
82
83
  err_str = (
83
84
  f'Failed to load Kubernetes configuration for {context!r}. '
84
85
  'Please check if your kubeconfig file exists at '
85
- f'~/.kube/config and is valid.\n{suffix}')
86
+ f'{kubeconfig_path} and is valid.\n{suffix}')
86
87
  err_str += '\nTo disable Kubernetes for SkyPilot: run `sky check`.'
87
88
  with ux_utils.print_exception_no_traceback():
88
89
  raise ValueError(err_str) from None
@@ -0,0 +1,232 @@
1
+ """Nebius cloud adaptor."""
2
+ import os
3
+ import threading
4
+ from typing import Optional
5
+
6
+ from sky.adaptors import common
7
+ from sky.utils import annotations
8
+ from sky.utils import ux_utils
9
+
10
+ NEBIUS_TENANT_ID_FILENAME = 'NEBIUS_TENANT_ID.txt'
11
+ NEBIUS_IAM_TOKEN_FILENAME = 'NEBIUS_IAM_TOKEN.txt'
12
+ NEBIUS_PROJECT_ID_FILENAME = 'NEBIUS_PROJECT_ID.txt'
13
+ NEBIUS_CREDENTIALS_FILENAME = 'credentials.json'
14
+ NEBIUS_TENANT_ID_PATH = '~/.nebius/' + NEBIUS_TENANT_ID_FILENAME
15
+ NEBIUS_IAM_TOKEN_PATH = '~/.nebius/' + NEBIUS_IAM_TOKEN_FILENAME
16
+ NEBIUS_PROJECT_ID_PATH = '~/.nebius/' + NEBIUS_PROJECT_ID_FILENAME
17
+ NEBIUS_CREDENTIALS_PATH = '~/.nebius/' + NEBIUS_CREDENTIALS_FILENAME
18
+
19
+ DEFAULT_REGION = 'eu-north1'
20
+
21
+ NEBIUS_PROFILE_NAME = 'nebius'
22
+
23
+ MAX_RETRIES_TO_DISK_CREATE = 120
24
+ MAX_RETRIES_TO_INSTANCE_STOP = 120
25
+ MAX_RETRIES_TO_INSTANCE_START = 120
26
+ MAX_RETRIES_TO_INSTANCE_READY = 240
27
+
28
+ MAX_RETRIES_TO_DISK_DELETE = 120
29
+ MAX_RETRIES_TO_INSTANCE_WAIT = 120 # Maximum number of retries
30
+
31
+ POLL_INTERVAL = 5
32
+
33
+ _iam_token = None
34
+ _sdk = None
35
+ _tenant_id = None
36
+ _project_id = None
37
+
38
+ _IMPORT_ERROR_MESSAGE = ('Failed to import dependencies for Nebius AI Cloud.'
39
+ 'Try pip install "skypilot[nebius]"')
40
+
41
+ nebius = common.LazyImport(
42
+ 'nebius',
43
+ import_error_message=_IMPORT_ERROR_MESSAGE,
44
+ # https://github.com/grpc/grpc/issues/37642 to avoid spam in console
45
+ set_loggers=lambda: os.environ.update({'GRPC_VERBOSITY': 'NONE'}))
46
+ boto3 = common.LazyImport('boto3', import_error_message=_IMPORT_ERROR_MESSAGE)
47
+ botocore = common.LazyImport('botocore',
48
+ import_error_message=_IMPORT_ERROR_MESSAGE)
49
+
50
+ _LAZY_MODULES = (boto3, botocore, nebius)
51
+ _session_creation_lock = threading.RLock()
52
+ _INDENT_PREFIX = ' '
53
+ NAME = 'Nebius'
54
+ SKY_CHECK_NAME = 'Nebius (for Nebius Object Storae)'
55
+
56
+
57
+ def request_error():
58
+ return nebius.aio.service_error.RequestError
59
+
60
+
61
+ def compute():
62
+ # pylint: disable=import-outside-toplevel
63
+ from nebius.api.nebius.compute import v1 as compute_v1
64
+ return compute_v1
65
+
66
+
67
+ def iam():
68
+ # pylint: disable=import-outside-toplevel
69
+ from nebius.api.nebius.iam import v1 as iam_v1
70
+ return iam_v1
71
+
72
+
73
+ def nebius_common():
74
+ # pylint: disable=import-outside-toplevel
75
+ from nebius.api.nebius.common import v1 as common_v1
76
+ return common_v1
77
+
78
+
79
+ def vpc():
80
+ # pylint: disable=import-outside-toplevel
81
+ from nebius.api.nebius.vpc import v1 as vpc_v1
82
+ return vpc_v1
83
+
84
+
85
+ def get_iam_token():
86
+ global _iam_token
87
+ if _iam_token is None:
88
+ try:
89
+ with open(os.path.expanduser(NEBIUS_IAM_TOKEN_PATH),
90
+ encoding='utf-8') as file:
91
+ _iam_token = file.read().strip()
92
+ except FileNotFoundError:
93
+ return None
94
+ return _iam_token
95
+
96
+
97
+ def is_token_or_cred_file_exist():
98
+ return (os.path.exists(os.path.expanduser(NEBIUS_IAM_TOKEN_PATH)) or
99
+ os.path.exists(os.path.expanduser(NEBIUS_CREDENTIALS_PATH)))
100
+
101
+
102
+ def get_project_id():
103
+ global _project_id
104
+ if _project_id is None:
105
+ try:
106
+ with open(os.path.expanduser(NEBIUS_PROJECT_ID_PATH),
107
+ encoding='utf-8') as file:
108
+ _project_id = file.read().strip()
109
+ except FileNotFoundError:
110
+ return None
111
+ return _project_id
112
+
113
+
114
+ def get_tenant_id():
115
+ global _tenant_id
116
+ if _tenant_id is None:
117
+ try:
118
+ with open(os.path.expanduser(NEBIUS_TENANT_ID_PATH),
119
+ encoding='utf-8') as file:
120
+ _tenant_id = file.read().strip()
121
+ except FileNotFoundError:
122
+ return None
123
+ return _tenant_id
124
+
125
+
126
+ def sdk():
127
+ global _sdk
128
+ if _sdk is None:
129
+ if get_iam_token() is not None:
130
+ _sdk = nebius.sdk.SDK(credentials=get_iam_token())
131
+ return _sdk
132
+ _sdk = nebius.sdk.SDK(
133
+ credentials_file_name=os.path.expanduser(NEBIUS_CREDENTIALS_PATH))
134
+ return _sdk
135
+
136
+
137
+ def get_nebius_credentials(boto3_session):
138
+ """Gets the Nebius credentials from the boto3 session object.
139
+
140
+ Args:
141
+ boto3_session: The boto3 session object.
142
+ Returns:
143
+ botocore.credentials.ReadOnlyCredentials object with the R2 credentials.
144
+ """
145
+ nebius_credentials = boto3_session.get_credentials()
146
+ if nebius_credentials is None:
147
+ with ux_utils.print_exception_no_traceback():
148
+ raise ValueError('Nebius credentials not found. Run '
149
+ '`sky check` to verify credentials are '
150
+ 'correctly set up.')
151
+ return nebius_credentials.get_frozen_credentials()
152
+
153
+
154
+ # lru_cache() is thread-safe and it will return the same session object
155
+ # for different threads.
156
+ # Reference: https://docs.python.org/3/library/functools.html#functools.lru_cache # pylint: disable=line-too-long
157
+ @annotations.lru_cache(scope='global')
158
+ def session():
159
+ """Create an AWS session."""
160
+ # Creating the session object is not thread-safe for boto3,
161
+ # so we add a reentrant lock to synchronize the session creation.
162
+ # Reference: https://github.com/boto/boto3/issues/1592
163
+ # However, the session object itself is thread-safe, so we are
164
+ # able to use lru_cache() to cache the session object.
165
+ with _session_creation_lock:
166
+ session_ = boto3.session.Session(profile_name=NEBIUS_PROFILE_NAME)
167
+ return session_
168
+
169
+
170
+ @annotations.lru_cache(scope='global')
171
+ def resource(resource_name: str, region: str = DEFAULT_REGION, **kwargs):
172
+ """Create a Nebius resource.
173
+
174
+ Args:
175
+ resource_name: Nebius resource name (e.g., 's3').
176
+ kwargs: Other options.
177
+ """
178
+ # Need to use the resource retrieved from the per-thread session
179
+ # to avoid thread-safety issues (Directly creating the client
180
+ # with boto3.resource() is not thread-safe).
181
+ # Reference: https://stackoverflow.com/a/59635814
182
+
183
+ session_ = session()
184
+ nebius_credentials = get_nebius_credentials(session_)
185
+ endpoint = create_endpoint(region)
186
+
187
+ return session_.resource(
188
+ resource_name,
189
+ endpoint_url=endpoint,
190
+ aws_access_key_id=nebius_credentials.access_key,
191
+ aws_secret_access_key=nebius_credentials.secret_key,
192
+ region_name=region,
193
+ **kwargs)
194
+
195
+
196
+ @annotations.lru_cache(scope='global')
197
+ def client(service_name: str, region):
198
+ """Create an Nebius client of a certain service.
199
+
200
+ Args:
201
+ service_name: Nebius service name (e.g., 's3').
202
+ kwargs: Other options.
203
+ """
204
+ # Need to use the client retrieved from the per-thread session
205
+ # to avoid thread-safety issues (Directly creating the client
206
+ # with boto3.client() is not thread-safe).
207
+ # Reference: https://stackoverflow.com/a/59635814
208
+
209
+ session_ = session()
210
+ nebius_credentials = get_nebius_credentials(session_)
211
+ endpoint = create_endpoint(region)
212
+
213
+ return session_.client(service_name,
214
+ endpoint_url=endpoint,
215
+ aws_access_key_id=nebius_credentials.access_key,
216
+ aws_secret_access_key=nebius_credentials.secret_key,
217
+ region_name=region)
218
+
219
+
220
+ @common.load_lazy_modules(_LAZY_MODULES)
221
+ def botocore_exceptions():
222
+ """AWS botocore exception."""
223
+ # pylint: disable=import-outside-toplevel
224
+ from botocore import exceptions
225
+ return exceptions
226
+
227
+
228
+ def create_endpoint(region: Optional[str] = DEFAULT_REGION) -> str:
229
+ """Reads accountid necessary to interact with Nebius Object Storage"""
230
+ if region is None:
231
+ region = DEFAULT_REGION
232
+ return f'https://storage.{region}.nebius.cloud:443'
@@ -38,6 +38,7 @@ from sky import sky_logging
38
38
  from sky import task as task_lib
39
39
  from sky.backends import backend_utils
40
40
  from sky.backends import wheel_utils
41
+ from sky.clouds import cloud as sky_cloud
41
42
  from sky.clouds import service_catalog
42
43
  from sky.clouds.utils import gcp_utils
43
44
  from sky.data import data_utils
@@ -1981,7 +1982,8 @@ class RetryingVmProvisioner(object):
1981
1982
  # is running. Here we check the enabled clouds and expiring credentials
1982
1983
  # and raise a warning to the user.
1983
1984
  if task.is_controller_task():
1984
- enabled_clouds = sky_check.get_cached_enabled_clouds_or_refresh()
1985
+ enabled_clouds = sky_check.get_cached_enabled_clouds_or_refresh(
1986
+ sky_cloud.CloudCapability.COMPUTE)
1985
1987
  expirable_clouds = backend_utils.get_expirable_clouds(
1986
1988
  enabled_clouds)
1987
1989
 
@@ -172,8 +172,9 @@ def _create_benchmark_bucket() -> Tuple[str, str]:
172
172
  bucket_name = f'sky-bench-{uuid.uuid4().hex[:4]}-{getpass.getuser()}'
173
173
 
174
174
  # Select the bucket type.
175
- enabled_clouds = storage_lib.get_cached_enabled_storage_clouds_or_refresh(
176
- raise_if_no_cloud_access=True)
175
+ enabled_clouds = (
176
+ storage_lib.get_cached_enabled_storage_cloud_names_or_refresh(
177
+ raise_if_no_cloud_access=True))
177
178
  # Sky Benchmark only supports S3 (see _download_remote_dir and
178
179
  # _delete_remote_dir).
179
180
  enabled_clouds = [
@@ -1,5 +1,4 @@
1
1
  """Credential checks: check cloud credentials and enable clouds."""
2
- import enum
3
2
  import os
4
3
  import traceback
5
4
  from types import ModuleType
@@ -13,6 +12,7 @@ from sky import exceptions
13
12
  from sky import global_user_state
14
13
  from sky import skypilot_config
15
14
  from sky.adaptors import cloudflare
15
+ from sky.clouds import cloud as sky_cloud
16
16
  from sky.utils import registry
17
17
  from sky.utils import rich_utils
18
18
  from sky.utils import ux_utils
@@ -21,60 +21,21 @@ CHECK_MARK_EMOJI = '\U00002714' # Heavy check mark unicode
21
21
  PARTY_POPPER_EMOJI = '\U0001F389' # Party popper unicode
22
22
 
23
23
 
24
- # Declaring CloudCapability as a subclass of str
25
- # allows it to be JSON serializable.
26
- class CloudCapability(str, enum.Enum):
27
- # Compute capability.
28
- COMPUTE = 'compute'
29
- # Storage capability.
30
- STORAGE = 'storage'
31
-
32
-
33
- ALL_CAPABILITIES = [CloudCapability.COMPUTE, CloudCapability.STORAGE]
34
-
35
-
36
24
  def check_capabilities(
37
25
  quiet: bool = False,
38
26
  verbose: bool = False,
39
27
  clouds: Optional[Iterable[str]] = None,
40
- capabilities: Optional[List[CloudCapability]] = None,
41
- ) -> Dict[str, List[CloudCapability]]:
28
+ capabilities: Optional[List[sky_cloud.CloudCapability]] = None,
29
+ ) -> Dict[str, List[sky_cloud.CloudCapability]]:
42
30
  echo = (lambda *_args, **_kwargs: None
43
31
  ) if quiet else lambda *args, **kwargs: click.echo(
44
32
  *args, **kwargs, color=True)
45
33
  echo('Checking credentials to enable clouds for SkyPilot.')
46
34
  if capabilities is None:
47
- capabilities = ALL_CAPABILITIES
35
+ capabilities = sky_cloud.ALL_CAPABILITIES
48
36
  assert capabilities is not None
49
- enabled_clouds: Dict[str, List[CloudCapability]] = {}
50
- disabled_clouds: Dict[str, List[CloudCapability]] = {}
51
-
52
- def check_credentials(
53
- cloud: Union[sky_clouds.Cloud, ModuleType],
54
- capability: CloudCapability) -> Tuple[bool, Optional[str]]:
55
- if capability == CloudCapability.COMPUTE:
56
- return cloud.check_credentials()
57
- elif capability == CloudCapability.STORAGE:
58
- return cloud.check_storage_credentials()
59
- else:
60
- raise ValueError(f'Invalid capability: {capability}')
61
-
62
- def get_cached_state(capability: CloudCapability) -> List[sky_clouds.Cloud]:
63
- if capability == CloudCapability.COMPUTE:
64
- return global_user_state.get_cached_enabled_clouds()
65
- elif capability == CloudCapability.STORAGE:
66
- return global_user_state.get_cached_enabled_storage_clouds()
67
- else:
68
- raise ValueError(f'Invalid capability: {capability}')
69
-
70
- def set_cached_state(clouds: List[str],
71
- capability: CloudCapability) -> None:
72
- if capability == CloudCapability.COMPUTE:
73
- global_user_state.set_enabled_clouds(clouds)
74
- elif capability == CloudCapability.STORAGE:
75
- global_user_state.set_enabled_storage_clouds(clouds)
76
- else:
77
- raise ValueError(f'Invalid capability: {capability}')
37
+ enabled_clouds: Dict[str, List[sky_cloud.CloudCapability]] = {}
38
+ disabled_clouds: Dict[str, List[sky_cloud.CloudCapability]] = {}
78
39
 
79
40
  def check_one_cloud(
80
41
  cloud_tuple: Tuple[str, Union[sky_clouds.Cloud,
@@ -84,7 +45,7 @@ def check_capabilities(
84
45
  for capability in capabilities:
85
46
  with rich_utils.safe_status(f'Checking {cloud_repr}...'):
86
47
  try:
87
- ok, reason = check_credentials(cloud, capability)
48
+ ok, reason = cloud.check_credentials(capability)
88
49
  except exceptions.NotSupportedError:
89
50
  continue
90
51
  except Exception: # pylint: disable=broad-except
@@ -170,12 +131,14 @@ def check_capabilities(
170
131
  if not cloud.startswith('Cloudflare')
171
132
  }
172
133
  previously_enabled_clouds_set = {
173
- repr(cloud) for cloud in get_cached_state(capability)
134
+ repr(cloud)
135
+ for cloud in global_user_state.get_cached_enabled_clouds(capability)
174
136
  }
175
137
  enabled_clouds_for_capability = (config_allowed_clouds_set & (
176
138
  (previously_enabled_clouds_set | enabled_clouds_set) -
177
139
  disabled_clouds_set))
178
- set_cached_state(list(enabled_clouds_for_capability), capability)
140
+ global_user_state.set_enabled_clouds(
141
+ list(enabled_clouds_for_capability), capability)
179
142
  all_enabled_clouds = all_enabled_clouds.union(
180
143
  enabled_clouds_for_capability)
181
144
  disallowed_clouds_hint = None
@@ -227,7 +190,7 @@ def check(
227
190
  quiet: bool = False,
228
191
  verbose: bool = False,
229
192
  clouds: Optional[Iterable[str]] = None,
230
- capability: CloudCapability = CloudCapability.COMPUTE,
193
+ capability: sky_cloud.CloudCapability = sky_cloud.CloudCapability.COMPUTE,
231
194
  ) -> List[str]:
232
195
  clouds_with_capability = []
233
196
  enabled_clouds = check_capabilities(quiet, verbose, clouds, [capability])
@@ -238,6 +201,7 @@ def check(
238
201
 
239
202
 
240
203
  def get_cached_enabled_clouds_or_refresh(
204
+ capability: sky_cloud.CloudCapability,
241
205
  raise_if_no_cloud_access: bool = False) -> List[sky_clouds.Cloud]:
242
206
  """Returns cached enabled clouds and if no cloud is enabled, refresh.
243
207
 
@@ -251,16 +215,18 @@ def get_cached_enabled_clouds_or_refresh(
251
215
  exceptions.NoCloudAccessError: if no public cloud is enabled and
252
216
  raise_if_no_cloud_access is set to True.
253
217
  """
254
- cached_enabled_clouds = global_user_state.get_cached_enabled_clouds()
218
+ cached_enabled_clouds = global_user_state.get_cached_enabled_clouds(
219
+ capability)
255
220
  if not cached_enabled_clouds:
256
221
  try:
257
- check(quiet=True, capability=CloudCapability.COMPUTE)
222
+ check(quiet=True, capability=capability)
258
223
  except SystemExit:
259
224
  # If no cloud is enabled, check() will raise SystemExit.
260
225
  # Here we catch it and raise the exception later only if
261
226
  # raise_if_no_cloud_access is set to True.
262
227
  pass
263
- cached_enabled_clouds = global_user_state.get_cached_enabled_clouds()
228
+ cached_enabled_clouds = global_user_state.get_cached_enabled_clouds(
229
+ capability)
264
230
  if raise_if_no_cloud_access and not cached_enabled_clouds:
265
231
  with ux_utils.print_exception_no_traceback():
266
232
  raise exceptions.NoCloudAccessError(
@@ -269,41 +235,6 @@ def get_cached_enabled_clouds_or_refresh(
269
235
  return cached_enabled_clouds
270
236
 
271
237
 
272
- def get_cached_enabled_storage_clouds_or_refresh(
273
- raise_if_no_cloud_access: bool = False) -> List[sky_clouds.Cloud]:
274
- """Returns cached enabled storage clouds and if no cloud is enabled,
275
- refresh.
276
-
277
- This function will perform a refresh if no public cloud is enabled.
278
-
279
- Args:
280
- raise_if_no_cloud_access: if True, raise an exception if no public
281
- cloud is enabled.
282
-
283
- Raises:
284
- exceptions.NoCloudAccessError: if no public cloud is enabled and
285
- raise_if_no_cloud_access is set to True.
286
- """
287
- cached_enabled_storage_clouds = (
288
- global_user_state.get_cached_enabled_storage_clouds())
289
- if not cached_enabled_storage_clouds:
290
- try:
291
- check(quiet=True, capability=CloudCapability.STORAGE)
292
- except SystemExit:
293
- # If no cloud is enabled, check() will raise SystemExit.
294
- # Here we catch it and raise the exception later only if
295
- # raise_if_no_cloud_access is set to True.
296
- pass
297
- cached_enabled_storage_clouds = (
298
- global_user_state.get_cached_enabled_storage_clouds())
299
- if raise_if_no_cloud_access and not cached_enabled_storage_clouds:
300
- with ux_utils.print_exception_no_traceback():
301
- raise exceptions.NoCloudAccessError(
302
- 'Cloud access is not set up. Run: '
303
- f'{colorama.Style.BRIGHT}sky check{colorama.Style.RESET_ALL}')
304
- return cached_enabled_storage_clouds
305
-
306
-
307
238
  def get_cloud_credential_file_mounts(
308
239
  excluded_clouds: Optional[Iterable[sky_clouds.Cloud]]
309
240
  ) -> Dict[str, str]:
@@ -19,6 +19,7 @@ from sky.adaptors import aws
19
19
  from sky.adaptors import azure
20
20
  from sky.adaptors import cloudflare
21
21
  from sky.adaptors import ibm
22
+ from sky.adaptors import nebius
22
23
  from sky.adaptors import oci
23
24
  from sky.clouds import gcp
24
25
  from sky.data import data_utils
@@ -543,6 +544,70 @@ class OciCloudStorage(CloudStorage):
543
544
  return download_via_ocicli
544
545
 
545
546
 
547
+ class NebiusCloudStorage(CloudStorage):
548
+ """Nebius Cloud Storage."""
549
+
550
+ # List of commands to install AWS CLI
551
+ _GET_AWSCLI = [
552
+ 'aws --version >/dev/null 2>&1 || '
553
+ f'{constants.SKY_UV_PIP_CMD} install awscli',
554
+ ]
555
+
556
+ def is_directory(self, url: str) -> bool:
557
+ """Returns whether nebius 'url' is a directory.
558
+
559
+ In cloud object stores, a "directory" refers to a regular object whose
560
+ name is a prefix of other objects.
561
+ """
562
+ nebius_s3 = nebius.resource('s3')
563
+ bucket_name, path = data_utils.split_nebius_path(url)
564
+ bucket = nebius_s3.Bucket(bucket_name)
565
+
566
+ num_objects = 0
567
+ for obj in bucket.objects.filter(Prefix=path):
568
+ num_objects += 1
569
+ if obj.key == path:
570
+ return False
571
+ # If there are more than 1 object in filter, then it is a directory
572
+ if num_objects == 3:
573
+ return True
574
+
575
+ # A directory with few or no items
576
+ return True
577
+
578
+ def make_sync_dir_command(self, source: str, destination: str) -> str:
579
+ """Downloads using AWS CLI."""
580
+ # AWS Sync by default uses 10 threads to upload files to the bucket.
581
+ # To increase parallelism, modify max_concurrent_requests in your
582
+ # aws config file (Default path: ~/.aws/config).
583
+ endpoint_url = nebius.create_endpoint()
584
+ assert 'nebius://' in source, 'nebius:// is not in source'
585
+ source = source.replace('nebius://', 's3://')
586
+ download_via_awscli = (f'{constants.SKY_REMOTE_PYTHON_ENV}/bin/aws s3 '
587
+ 'sync --no-follow-symlinks '
588
+ f'{source} {destination} '
589
+ f'--endpoint {endpoint_url} '
590
+ f'--profile={nebius.NEBIUS_PROFILE_NAME}')
591
+
592
+ all_commands = list(self._GET_AWSCLI)
593
+ all_commands.append(download_via_awscli)
594
+ return ' && '.join(all_commands)
595
+
596
+ def make_sync_file_command(self, source: str, destination: str) -> str:
597
+ """Downloads a file using AWS CLI."""
598
+ endpoint_url = nebius.create_endpoint()
599
+ assert 'nebius://' in source, 'nebius:// is not in source'
600
+ source = source.replace('nebius://', 's3://')
601
+ download_via_awscli = (f'{constants.SKY_REMOTE_PYTHON_ENV}/bin/aws s3 '
602
+ f'cp {source} {destination} '
603
+ f'--endpoint {endpoint_url} '
604
+ f'--profile={nebius.NEBIUS_PROFILE_NAME}')
605
+
606
+ all_commands = list(self._GET_AWSCLI)
607
+ all_commands.append(download_via_awscli)
608
+ return ' && '.join(all_commands)
609
+
610
+
546
611
  def get_storage_from_path(url: str) -> CloudStorage:
547
612
  """Returns a CloudStorage by identifying the scheme:// in a URL."""
548
613
  result = urllib.parse.urlsplit(url)
@@ -559,6 +624,7 @@ _REGISTRY = {
559
624
  'r2': R2CloudStorage(),
560
625
  'cos': IBMCosCloudStorage(),
561
626
  'oci': OciCloudStorage(),
627
+ 'nebius': NebiusCloudStorage(),
562
628
  # TODO: This is a hack, as Azure URL starts with https://, we should
563
629
  # refactor the registry to be able to take regex, so that Azure blob can
564
630
  # be identified with `https://(.*?)\.blob\.core\.windows\.net`
@@ -558,11 +558,23 @@ class AWS(clouds.Cloud):
558
558
  return resources_utils.FeasibleResources(_make(instance_list),
559
559
  fuzzy_candidate_list, None)
560
560
 
561
+ @classmethod
562
+ def _check_compute_credentials(cls) -> Tuple[bool, Optional[str]]:
563
+ """Checks if the user has access credentials to this AWS's compute service."""
564
+ return cls._check_credentials()
565
+
566
+ @classmethod
567
+ def _check_storage_credentials(cls) -> Tuple[bool, Optional[str]]:
568
+ """Checks if the user has access credentials to this AWS's storage service."""
569
+ # TODO(seungjin): Implement separate check for
570
+ # if the user has access to S3.
571
+ return cls._check_credentials()
572
+
561
573
  @classmethod
562
574
  @annotations.lru_cache(scope='global',
563
575
  maxsize=1) # Cache since getting identity is slow.
564
- def check_credentials(cls) -> Tuple[bool, Optional[str]]:
565
- """Checks if the user has access credentials to this cloud."""
576
+ def _check_credentials(cls) -> Tuple[bool, Optional[str]]:
577
+ """Checks if the user has access credentials to AWS."""
566
578
 
567
579
  dependency_installation_hints = (
568
580
  'AWS dependencies are not installed. '
@@ -666,11 +678,6 @@ class AWS(clouds.Cloud):
666
678
  f'{common_utils.format_exception(e, use_bracket=True)}')
667
679
  return True, hints
668
680
 
669
- @classmethod
670
- def check_storage_credentials(cls) -> Tuple[bool, Optional[str]]:
671
- # TODO(seungjin): Check if the user has access to S3.
672
- return cls.check_credentials()
673
-
674
681
  @classmethod
675
682
  def _current_identity_type(cls) -> Optional[AWSIdentityType]:
676
683
  stdout = cls._aws_configure_list()