skypilot-nightly 1.0.0.dev20250106__tar.gz → 1.0.0.dev20250108__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 (316) hide show
  1. {skypilot_nightly-1.0.0.dev20250106/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250108}/PKG-INFO +3 -3
  2. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/cloud_vm_ray_backend.py +21 -7
  4. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +10 -51
  5. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/oci_utils.py +9 -0
  6. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/docker_utils.py +8 -3
  7. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/oci/query_utils.py +17 -17
  8. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/instance.py +10 -1
  9. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/utils.py +170 -13
  10. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/setup_files/dependencies.py +3 -1
  11. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/command_runner.py +5 -7
  12. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/runpod-ray.yml.j2 +13 -0
  13. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/schemas.py +3 -0
  14. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108/skypilot_nightly.egg-info}/PKG-INFO +3 -3
  15. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/skypilot_nightly.egg-info/requires.txt +2 -2
  16. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/LICENSE +0 -0
  17. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/MANIFEST.in +0 -0
  18. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/README.md +0 -0
  19. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/pyproject.toml +0 -0
  20. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/setup.cfg +0 -0
  21. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/setup.py +0 -0
  22. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/__init__.py +0 -0
  23. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/aws.py +0 -0
  24. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/azure.py +0 -0
  25. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/cloudflare.py +0 -0
  26. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/common.py +0 -0
  27. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/cudo.py +0 -0
  28. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/do.py +0 -0
  29. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/docker.py +0 -0
  30. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/gcp.py +0 -0
  31. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/ibm.py +0 -0
  32. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/kubernetes.py +0 -0
  33. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/oci.py +0 -0
  34. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/runpod.py +0 -0
  35. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/adaptors/vsphere.py +0 -0
  36. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/admin_policy.py +0 -0
  37. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/authentication.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/__init__.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/backend.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/backend_utils.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/docker_utils.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/local_docker_backend.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/backends/wheel_utils.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/benchmark/__init__.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/benchmark/benchmark_state.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/benchmark/benchmark_utils.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/check.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/cli.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/cloud_stores.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/__init__.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/aws.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/azure.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/cloud.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/cloud_registry.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/cudo.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/do.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/fluidstack.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/gcp.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/ibm.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/kubernetes.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/lambda_cloud.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/oci.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/paperspace.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/runpod.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/scp.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/__init__.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/common.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/config.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/constants.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/do_catalog.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/__init__.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/aws_utils.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/azure_utils.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/gcp_utils.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/utils/scp_utils.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/clouds/vsphere.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/core.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/dag.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/__init__.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/data_transfer.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/data_utils.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/mounting_utils.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/storage.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/data/storage_utils.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/exceptions.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/execution.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/global_user_state.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/__init__.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/constants.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/controller.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/core.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/dashboard/dashboard.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/dashboard/static/favicon.ico +0 -0
  115. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/dashboard/templates/index.html +0 -0
  116. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/recovery_strategy.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/state.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/jobs/utils.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/optimizer.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/__init__.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/aws/__init__.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/aws/config.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/aws/instance.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/aws/utils.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/azure/__init__.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/azure/azure-config-template.json +0 -0
  127. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/azure/config.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/azure/instance.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/common.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/constants.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/__init__.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/config.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/cudo_machine_type.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/cudo_utils.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/cudo_wrapper.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/cudo/instance.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/do/__init__.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/do/config.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/do/constants.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/do/instance.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/do/utils.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/fluidstack/__init__.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/fluidstack/config.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/fluidstack/instance.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/__init__.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/config.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/constants.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/instance.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/instance_utils.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/gcp/mig_utils.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/instance_setup.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/__init__.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/config.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/instance.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  157. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  158. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/network.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/network_utils.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/kubernetes/utils.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/lambda_cloud/__init__.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/lambda_cloud/config.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/lambda_cloud/instance.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/logging.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/metadata_utils.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/oci/__init__.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/oci/config.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/oci/instance.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/paperspace/__init__.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/paperspace/config.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/paperspace/constants.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/paperspace/instance.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/paperspace/utils.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/provisioner.py +0 -0
  176. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/__init__.py +0 -0
  177. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/api/__init__.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/api/commands.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/api/pods.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/runpod/config.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/__init__.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/__init__.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/custom_script.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/id_generator.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/service_manager.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/common/vim_utils.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/config.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/instance.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/provision/vsphere/vsphere_utils.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/resources.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/__init__.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/autoscalers.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/constants.py +0 -0
  200. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/controller.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/core.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/load_balancer.py +0 -0
  203. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/load_balancing_policies.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/replica_managers.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/serve_state.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/serve_utils.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/service.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/serve/service_spec.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/setup_files/MANIFEST.in +0 -0
  210. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/setup_files/setup.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/sky_logging.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/LICENSE +0 -0
  213. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/__init__.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/attempt_skylet.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/autostop_lib.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/configs.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/constants.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/events.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/job_lib.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/log_lib.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/log_lib.pyi +0 -0
  222. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/__init__.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/ibm/__init__.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/ibm/node_provider.py +0 -0
  225. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/ibm/utils.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/scp/__init__.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/scp/config.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/providers/scp/node_provider.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/__init__.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  232. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/cli.py.patch +0 -0
  233. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  234. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  235. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  236. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/updater.py.patch +0 -0
  237. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/ray_patches/worker.py.patch +0 -0
  238. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/skylet.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skylet/subprocess_daemon.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/skypilot_config.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/status_lib.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/task.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/aws-ray.yml.j2 +0 -0
  244. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/azure-ray.yml.j2 +0 -0
  245. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/cudo-ray.yml.j2 +0 -0
  246. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/do-ray.yml.j2 +0 -0
  247. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  248. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/gcp-ray.yml.j2 +0 -0
  249. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/ibm-ray.yml.j2 +0 -0
  250. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/jobs-controller.yaml.j2 +0 -0
  251. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  252. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  253. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  254. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/kubernetes-ray.yml.j2 +0 -0
  255. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  256. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/lambda-ray.yml.j2 +0 -0
  257. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/local-ray.yml.j2 +0 -0
  258. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/oci-ray.yml.j2 +0 -0
  259. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/paperspace-ray.yml.j2 +0 -0
  260. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/scp-ray.yml.j2 +0 -0
  261. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  262. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/templates/vsphere-ray.yml.j2 +0 -0
  263. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/usage/__init__.py +0 -0
  264. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/usage/constants.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/usage/usage_lib.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/__init__.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/accelerator_registry.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/admin_policy_utils.py +0 -0
  269. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/cli_utils/__init__.py +0 -0
  270. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/cli_utils/status_utils.py +0 -0
  271. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/cluster_yaml_utils.py +0 -0
  272. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/command_runner.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/command_runner.pyi +0 -0
  274. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/common_utils.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/control_master_utils.py +0 -0
  276. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/controller_utils.py +0 -0
  277. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/dag_utils.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/db_utils.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/env_options.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/__init__.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/create_cluster.sh +0 -0
  282. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  283. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  284. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  286. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  288. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  289. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  290. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  291. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/kubernetes_enums.py +0 -0
  292. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/log_utils.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/resources_utils.py +0 -0
  294. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/rich_utils.py +0 -0
  295. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/subprocess_utils.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/timeline.py +0 -0
  297. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/ux_utils.py +0 -0
  298. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/sky/utils/validator.py +0 -0
  299. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/skypilot_nightly.egg-info/SOURCES.txt +0 -0
  300. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  301. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  302. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/skypilot_nightly.egg-info/top_level.txt +0 -0
  303. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_api.py +0 -0
  304. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_cli.py +0 -0
  305. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_config.py +0 -0
  306. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_global_user_state.py +0 -0
  307. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_jobs.py +0 -0
  308. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_jobs_and_serve.py +0 -0
  309. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_list_accelerators.py +0 -0
  310. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_optimizer_dryruns.py +0 -0
  311. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_optimizer_random_dag.py +0 -0
  312. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_serve_autoscaler.py +0 -0
  313. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_smoke.py +0 -0
  314. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_storage.py +0 -0
  315. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_wheels.py +0 -0
  316. {skypilot_nightly-1.0.0.dev20250106 → skypilot_nightly-1.0.0.dev20250108}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250106
3
+ Version: 1.0.0.dev20250108
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -90,7 +90,7 @@ Requires-Dist: grpcio!=1.48.0,<=1.51.3,>=1.42.0; (python_version >= "3.10" and s
90
90
  Requires-Dist: protobuf!=3.19.5,>=3.15.3; extra == "remote"
91
91
  Requires-Dist: pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<3; extra == "remote"
92
92
  Provides-Extra: runpod
93
- Requires-Dist: runpod>=1.5.1; extra == "runpod"
93
+ Requires-Dist: runpod>=1.6.1; extra == "runpod"
94
94
  Provides-Extra: fluidstack
95
95
  Provides-Extra: cudo
96
96
  Requires-Dist: cudo-compute>=0.1.10; extra == "cudo"
@@ -140,7 +140,7 @@ Requires-Dist: grpcio!=1.48.0,<=1.51.3,>=1.32.0; (python_version < "3.10" and sy
140
140
  Requires-Dist: grpcio!=1.48.0,<=1.51.3,>=1.42.0; (python_version >= "3.10" and sys_platform != "darwin") and extra == "all"
141
141
  Requires-Dist: protobuf!=3.19.5,>=3.15.3; extra == "all"
142
142
  Requires-Dist: pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<3; extra == "all"
143
- Requires-Dist: runpod>=1.5.1; extra == "all"
143
+ Requires-Dist: runpod>=1.6.1; extra == "all"
144
144
  Requires-Dist: cudo-compute>=0.1.10; extra == "all"
145
145
  Requires-Dist: pydo>=0.3.0; extra == "all"
146
146
  Requires-Dist: azure-core>=1.24.0; extra == "all"
@@ -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 = '38a822ac6b553df0e784e559715ee4269c21f780'
8
+ _SKYPILOT_COMMIT_SHA = '2fa37ec2a68bdd1e69f3726ca46aaeebcaf07a2d'
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.dev20250106'
38
+ __version__ = '1.0.0.dev20250108'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -4216,11 +4216,20 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4216
4216
  attempts = 0
4217
4217
  while True:
4218
4218
  logger.debug(f'instance statuses attempt {attempts + 1}')
4219
- node_status_dict = provision_lib.query_instances(
4220
- repr(cloud),
4221
- cluster_name_on_cloud,
4222
- config['provider'],
4223
- non_terminated_only=False)
4219
+ try:
4220
+ node_status_dict = provision_lib.query_instances(
4221
+ repr(cloud),
4222
+ cluster_name_on_cloud,
4223
+ config['provider'],
4224
+ non_terminated_only=False)
4225
+ except Exception as e: # pylint: disable=broad-except
4226
+ if purge:
4227
+ logger.warning(
4228
+ f'Failed to query instances. Skipping since purge is '
4229
+ f'set. Details: '
4230
+ f'{common_utils.format_exception(e, use_bracket=True)}')
4231
+ break
4232
+ raise
4224
4233
 
4225
4234
  unexpected_node_state: Optional[Tuple[str, str]] = None
4226
4235
  for node_id, node_status in node_status_dict.items():
@@ -4239,8 +4248,13 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4239
4248
  time.sleep(_TEARDOWN_WAIT_BETWEEN_ATTEMPS_SECONDS)
4240
4249
  else:
4241
4250
  (node_id, node_status) = unexpected_node_state
4242
- raise RuntimeError(f'Instance {node_id} in unexpected state '
4243
- f'{node_status}.')
4251
+ if purge:
4252
+ logger.warning(f'Instance {node_id} in unexpected '
4253
+ f'state {node_status}. Skipping since purge '
4254
+ 'is set.')
4255
+ break
4256
+ raise RuntimeError(f'Instance {node_id} in unexpected '
4257
+ f'state {node_status}.')
4244
4258
 
4245
4259
  global_user_state.remove_cluster(handle.cluster_name,
4246
4260
  terminate=terminate)
@@ -47,10 +47,6 @@ TPU_RETRY_CNT = 3
47
47
  TPU_V4_ZONES = ['us-central2-b']
48
48
  # TPU v3 pods are available in us-east1-d, but hidden in the skus.
49
49
  # We assume the TPU prices are the same as us-central1.
50
- # TPU v6e's pricing info is not available on the SKUs. However, in
51
- # https://cloud.google.com/tpu/pricing, it listed the price for 4 regions:
52
- # us-east1, us-east5, europe-west4, and asia-northeast1. We hardcode them here
53
- # and filtered out the other regions (us-central{1,2}, us-south1).
54
50
  HIDDEN_TPU_DF = pd.read_csv(
55
51
  io.StringIO(
56
52
  textwrap.dedent("""\
@@ -62,49 +58,10 @@ HIDDEN_TPU_DF = pd.read_csv(
62
58
  ,tpu-v3-512,1,,,tpu-v3-512,512.0,153.6,us-east1,us-east1-d
63
59
  ,tpu-v3-1024,1,,,tpu-v3-1024,1024.0,307.2,us-east1,us-east1-d
64
60
  ,tpu-v3-2048,1,,,tpu-v3-2048,2048.0,614.4,us-east1,us-east1-d
65
- ,tpu-v6e-1,1,,,tpu-v6e-1,2.7,,us-east5,us-east5-b
66
- ,tpu-v6e-1,1,,,tpu-v6e-1,2.7,,us-east5,us-east5-c
67
- ,tpu-v6e-1,1,,,tpu-v6e-1,2.97,,europe-west4,europe-west4-a
68
- ,tpu-v6e-1,1,,,tpu-v6e-1,3.24,,asia-northeast1,asia-northeast1-b
69
- ,tpu-v6e-1,1,,,tpu-v6e-1,2.7,,us-east1,us-east1-d
70
- ,tpu-v6e-4,1,,,tpu-v6e-4,10.8,,us-east5,us-east5-b
71
- ,tpu-v6e-4,1,,,tpu-v6e-4,10.8,,us-east5,us-east5-c
72
- ,tpu-v6e-4,1,,,tpu-v6e-4,11.88,,europe-west4,europe-west4-a
73
- ,tpu-v6e-4,1,,,tpu-v6e-4,12.96,,asia-northeast1,asia-northeast1-b
74
- ,tpu-v6e-4,1,,,tpu-v6e-4,10.8,,us-east1,us-east1-d
75
- ,tpu-v6e-8,1,,,tpu-v6e-8,21.6,,us-east5,us-east5-b
76
- ,tpu-v6e-8,1,,,tpu-v6e-8,21.6,,us-east5,us-east5-c
77
- ,tpu-v6e-8,1,,,tpu-v6e-8,23.76,,europe-west4,europe-west4-a
78
- ,tpu-v6e-8,1,,,tpu-v6e-8,25.92,,asia-northeast1,asia-northeast1-b
79
- ,tpu-v6e-8,1,,,tpu-v6e-8,21.6,,us-east1,us-east1-d
80
- ,tpu-v6e-16,1,,,tpu-v6e-16,43.2,,us-east5,us-east5-b
81
- ,tpu-v6e-16,1,,,tpu-v6e-16,43.2,,us-east5,us-east5-c
82
- ,tpu-v6e-16,1,,,tpu-v6e-16,47.52,,europe-west4,europe-west4-a
83
- ,tpu-v6e-16,1,,,tpu-v6e-16,51.84,,asia-northeast1,asia-northeast1-b
84
- ,tpu-v6e-16,1,,,tpu-v6e-16,43.2,,us-east1,us-east1-d
85
- ,tpu-v6e-32,1,,,tpu-v6e-32,86.4,,us-east5,us-east5-b
86
- ,tpu-v6e-32,1,,,tpu-v6e-32,86.4,,us-east5,us-east5-c
87
- ,tpu-v6e-32,1,,,tpu-v6e-32,95.04,,europe-west4,europe-west4-a
88
- ,tpu-v6e-32,1,,,tpu-v6e-32,103.68,,asia-northeast1,asia-northeast1-b
89
- ,tpu-v6e-32,1,,,tpu-v6e-32,86.4,,us-east1,us-east1-d
90
- ,tpu-v6e-64,1,,,tpu-v6e-64,172.8,,us-east5,us-east5-b
91
- ,tpu-v6e-64,1,,,tpu-v6e-64,172.8,,us-east5,us-east5-c
92
- ,tpu-v6e-64,1,,,tpu-v6e-64,190.08,,europe-west4,europe-west4-a
93
- ,tpu-v6e-64,1,,,tpu-v6e-64,207.36,,asia-northeast1,asia-northeast1-b
94
- ,tpu-v6e-64,1,,,tpu-v6e-64,172.8,,us-east1,us-east1-d
95
- ,tpu-v6e-128,1,,,tpu-v6e-128,345.6,,us-east5,us-east5-b
96
- ,tpu-v6e-128,1,,,tpu-v6e-128,345.6,,us-east5,us-east5-c
97
- ,tpu-v6e-128,1,,,tpu-v6e-128,380.16,,europe-west4,europe-west4-a
98
- ,tpu-v6e-128,1,,,tpu-v6e-128,414.72,,asia-northeast1,asia-northeast1-b
99
- ,tpu-v6e-128,1,,,tpu-v6e-128,345.6,,us-east1,us-east1-d
100
- ,tpu-v6e-256,1,,,tpu-v6e-256,691.2,,us-east5,us-east5-b
101
- ,tpu-v6e-256,1,,,tpu-v6e-256,691.2,,us-east5,us-east5-c
102
- ,tpu-v6e-256,1,,,tpu-v6e-256,760.32,,europe-west4,europe-west4-a
103
- ,tpu-v6e-256,1,,,tpu-v6e-256,829.44,,asia-northeast1,asia-northeast1-b
104
- ,tpu-v6e-256,1,,,tpu-v6e-256,691.2,,us-east1,us-east1-d
105
61
  """)))
106
62
 
107
- TPU_V6E_MISSING_REGIONS = ['us-central1', 'us-central2', 'us-south1']
63
+ # TPU V6e price for us-central2 is missing in the SKUs.
64
+ TPU_V6E_MISSING_REGIONS = ['us-central2']
108
65
 
109
66
  # TPU V5 is not visible in specific zones. We hardcode the missing zones here.
110
67
  # NOTE(dev): Keep the zones and the df in sync.
@@ -670,6 +627,8 @@ def get_tpu_df(gce_skus: List[Dict[str, Any]],
670
627
  return 'TpuV5p'
671
628
  assert tpu_version == 'v5litepod', tpu_version
672
629
  return 'TpuV5e'
630
+ if tpu_version.startswith('v6e'):
631
+ return 'TpuV6e'
673
632
  return f'Tpu-{tpu_version}'
674
633
 
675
634
  def get_tpu_price(row: pd.Series, spot: bool) -> Optional[float]:
@@ -684,10 +643,10 @@ def get_tpu_df(gce_skus: List[Dict[str, Any]],
684
643
  # whether the TPU is a single device or a pod.
685
644
  # For TPU-v4, the pricing is uniform, and thus the pricing API
686
645
  # only provides the price of TPU-v4 pods.
687
- # The price shown for v5 TPU is per chip hour, so there is no 'Pod'
688
- # keyword in the description.
646
+ # The price shown for v5 & v6e TPU is per chip hour, so there is
647
+ # no 'Pod' keyword in the description.
689
648
  is_pod = ((num_cores > 8 or tpu_version == 'v4') and
690
- not tpu_version.startswith('v5'))
649
+ not tpu_version.startswith('v5') and tpu_version != 'v6e')
691
650
 
692
651
  for sku in gce_skus + tpu_skus:
693
652
  if tpu_region not in sku['serviceRegions']:
@@ -718,7 +677,9 @@ def get_tpu_df(gce_skus: List[Dict[str, Any]],
718
677
  # for v5e. Reference here:
719
678
  # https://cloud.google.com/tpu/docs/v5p#using-accelerator-type
720
679
  # https://cloud.google.com/tpu/docs/v5e#tpu-v5e-config
721
- core_per_sku = (1 if tpu_version == 'v5litepod' else
680
+ # v6e is also per chip price. Reference here:
681
+ # https://cloud.google.com/tpu/docs/v6e#configurations
682
+ core_per_sku = (1 if tpu_version in ['v5litepod', 'v6e'] else
722
683
  2 if tpu_version == 'v5p' else 8)
723
684
  tpu_core_price = tpu_device_price / core_per_sku
724
685
  tpu_price = num_cores * tpu_core_price
@@ -738,8 +699,6 @@ def get_tpu_df(gce_skus: List[Dict[str, Any]],
738
699
  spot_str = 'spot ' if spot else ''
739
700
  print(f'The {spot_str}price of {tpu_name} in {tpu_region} is '
740
701
  'not found in SKUs or hidden TPU price DF.')
741
- # TODO(tian): Hack. Should investigate how to retrieve the price
742
- # for TPU-v6e.
743
702
  if (tpu_name.startswith('tpu-v6e') and
744
703
  tpu_region in TPU_V6E_MISSING_REGIONS):
745
704
  if not spot:
@@ -10,6 +10,8 @@ History:
10
10
  from ubuntu 20.04 to ubuntu 22.04, including:
11
11
  - GPU: skypilot:gpu-ubuntu-2004 -> skypilot:gpu-ubuntu-2204
12
12
  - CPU: skypilot:cpu-ubuntu-2004 -> skypilot:cpu-ubuntu-2204
13
+ - Hysun He (hysun.he@oracle.com) @ Jan.01, 2025: Support reuse existing
14
+ VCN for SkyServe.
13
15
  """
14
16
  import os
15
17
 
@@ -109,8 +111,15 @@ class OCIConfig:
109
111
  ('oci', region, 'compartment_ocid'), default_compartment_ocid)
110
112
  return compartment
111
113
 
114
+ @classmethod
115
+ def get_vcn_ocid(cls, region):
116
+ # Will reuse the regional VCN if specified.
117
+ vcn = skypilot_config.get_nested(('oci', region, 'vcn_ocid'), None)
118
+ return vcn
119
+
112
120
  @classmethod
113
121
  def get_vcn_subnet(cls, region):
122
+ # Will reuse the subnet if specified.
114
123
  vcn = skypilot_config.get_nested(('oci', region, 'vcn_subnet'), None)
115
124
  return vcn
116
125
 
@@ -38,6 +38,13 @@ class DockerLoginConfig:
38
38
  password: str
39
39
  server: str
40
40
 
41
+ def format_image(self, image: str) -> str:
42
+ """Format the image name with the server prefix."""
43
+ server_prefix = f'{self.server}/'
44
+ if not image.startswith(server_prefix):
45
+ return f'{server_prefix}{image}'
46
+ return image
47
+
41
48
  @classmethod
42
49
  def from_env_vars(cls, d: Dict[str, str]) -> 'DockerLoginConfig':
43
50
  return cls(
@@ -220,9 +227,7 @@ class DockerInitializer:
220
227
  wait_for_docker_daemon=True)
221
228
  # We automatically add the server prefix to the image name if
222
229
  # the user did not add it.
223
- server_prefix = f'{docker_login_config.server}/'
224
- if not specific_image.startswith(server_prefix):
225
- specific_image = f'{server_prefix}{specific_image}'
230
+ specific_image = docker_login_config.format_image(specific_image)
226
231
 
227
232
  if self.docker_config.get('pull_before_run', True):
228
233
  assert specific_image, ('Image must be included in config if ' +
@@ -7,6 +7,8 @@ History:
7
7
  find_compartment: allow search subtree when find a compartment.
8
8
  - Hysun He (hysun.he@oracle.com) @ Nov.12, 2024: Add methods to
9
9
  Add/remove security rules: create_nsg_rules & remove_nsg
10
+ - Hysun He (hysun.he@oracle.com) @ Jan.01, 2025: Support reuse existing
11
+ VCN for SkyServe.
10
12
  """
11
13
  from datetime import datetime
12
14
  import functools
@@ -17,7 +19,6 @@ import traceback
17
19
  import typing
18
20
  from typing import List, Optional, Tuple
19
21
 
20
- from sky import exceptions
21
22
  from sky import sky_logging
22
23
  from sky.adaptors import common as adaptors_common
23
24
  from sky.adaptors import oci as oci_adaptor
@@ -496,26 +497,25 @@ class QueryHelper:
496
497
 
497
498
  compartment = cls.find_compartment(region)
498
499
 
499
- list_vcns_resp = net_client.list_vcns(
500
- compartment_id=compartment,
501
- display_name=oci_utils.oci_config.VCN_NAME,
502
- lifecycle_state='AVAILABLE',
503
- )
504
-
505
- if not list_vcns_resp:
506
- raise exceptions.ResourcesUnavailableError(
507
- 'The VCN is not available')
500
+ vcn_id = oci_utils.oci_config.get_vcn_ocid(region)
501
+ if vcn_id is None:
502
+ list_vcns_resp = net_client.list_vcns(
503
+ compartment_id=compartment,
504
+ display_name=oci_utils.oci_config.VCN_NAME,
505
+ lifecycle_state='AVAILABLE',
506
+ )
508
507
 
509
- # Get the primary vnic. The vnic might be an empty list for the
510
- # corner case when the cluster was exited during provision.
511
- if not list_vcns_resp.data:
512
- return None
508
+ # Get the primary vnic. The vnic might be an empty list for the
509
+ # corner case when the cluster was exited during provision.
510
+ if not list_vcns_resp.data:
511
+ return None
513
512
 
514
- vcn = list_vcns_resp.data[0]
513
+ vcn = list_vcns_resp.data[0]
514
+ vcn_id = vcn.id
515
515
 
516
516
  list_nsg_resp = net_client.list_network_security_groups(
517
517
  compartment_id=compartment,
518
- vcn_id=vcn.id,
518
+ vcn_id=vcn_id,
519
519
  limit=1,
520
520
  display_name=nsg_name,
521
521
  )
@@ -532,7 +532,7 @@ class QueryHelper:
532
532
  create_network_security_group_details=oci_adaptor.oci.core.models.
533
533
  CreateNetworkSecurityGroupDetails(
534
534
  compartment_id=compartment,
535
- vcn_id=vcn.id,
535
+ vcn_id=vcn_id,
536
536
  display_name=nsg_name,
537
537
  ))
538
538
  get_nsg_resp = net_client.get_network_security_group(
@@ -83,7 +83,8 @@ def run_instances(region: str, cluster_name_on_cloud: str,
83
83
  node_type = 'head' if head_instance_id is None else 'worker'
84
84
  try:
85
85
  instance_id = utils.launch(
86
- name=f'{cluster_name_on_cloud}-{node_type}',
86
+ cluster_name=cluster_name_on_cloud,
87
+ node_type=node_type,
87
88
  instance_type=config.node_config['InstanceType'],
88
89
  region=region,
89
90
  disk_size=config.node_config['DiskSize'],
@@ -92,6 +93,8 @@ def run_instances(region: str, cluster_name_on_cloud: str,
92
93
  public_key=config.node_config['PublicKey'],
93
94
  preemptible=config.node_config['Preemptible'],
94
95
  bid_per_gpu=config.node_config['BidPerGPU'],
96
+ docker_login_config=config.provider_config.get(
97
+ 'docker_login_config'),
95
98
  )
96
99
  except Exception as e: # pylint: disable=broad-except
97
100
  logger.warning(f'run_instances error: {e}')
@@ -145,6 +148,8 @@ def terminate_instances(
145
148
  """See sky/provision/__init__.py"""
146
149
  del provider_config # unused
147
150
  instances = _filter_instances(cluster_name_on_cloud, None)
151
+ template_name, registry_auth_id = utils.get_registry_auth_resources(
152
+ cluster_name_on_cloud)
148
153
  for inst_id, inst in instances.items():
149
154
  logger.debug(f'Terminating instance {inst_id}: {inst}')
150
155
  if worker_only and inst['name'].endswith('-head'):
@@ -157,6 +162,10 @@ def terminate_instances(
157
162
  f'Failed to terminate instance {inst_id}: '
158
163
  f'{common_utils.format_exception(e, use_bracket=False)}'
159
164
  ) from e
165
+ if template_name is not None:
166
+ utils.delete_pod_template(template_name)
167
+ if registry_auth_id is not None:
168
+ utils.delete_register_auth(registry_auth_id)
160
169
 
161
170
 
162
171
  def get_cluster_info(
@@ -2,10 +2,11 @@
2
2
 
3
3
  import base64
4
4
  import time
5
- from typing import Any, Dict, List, Optional
5
+ from typing import Any, Dict, List, Optional, Tuple
6
6
 
7
7
  from sky import sky_logging
8
8
  from sky.adaptors import runpod
9
+ from sky.provision import docker_utils
9
10
  import sky.provision.runpod.api.commands as runpod_commands
10
11
  from sky.skylet import constants
11
12
  from sky.utils import common_utils
@@ -47,6 +48,11 @@ GPU_NAME_MAP = {
47
48
  }
48
49
 
49
50
 
51
+ def _construct_docker_login_template_name(cluster_name: str) -> str:
52
+ """Constructs the registry auth template name."""
53
+ return f'{cluster_name}-docker-login-template'
54
+
55
+
50
56
  def retry(func):
51
57
  """Decorator to retry a function."""
52
58
 
@@ -66,9 +72,83 @@ def retry(func):
66
72
  return wrapper
67
73
 
68
74
 
75
+ # Adapted from runpod.api.queries.pods.py::QUERY_POD.
76
+ # Adding containerRegistryAuthId to the query.
77
+ _QUERY_POD = """
78
+ query myPods {
79
+ myself {
80
+ pods {
81
+ id
82
+ containerDiskInGb
83
+ containerRegistryAuthId
84
+ costPerHr
85
+ desiredStatus
86
+ dockerArgs
87
+ dockerId
88
+ env
89
+ gpuCount
90
+ imageName
91
+ lastStatusChange
92
+ machineId
93
+ memoryInGb
94
+ name
95
+ podType
96
+ port
97
+ ports
98
+ uptimeSeconds
99
+ vcpuCount
100
+ volumeInGb
101
+ volumeMountPath
102
+ runtime {
103
+ ports{
104
+ ip
105
+ isIpPublic
106
+ privatePort
107
+ publicPort
108
+ type
109
+ }
110
+ }
111
+ machine {
112
+ gpuDisplayName
113
+ }
114
+ }
115
+ }
116
+ }
117
+ """
118
+
119
+
120
+ def _sky_get_pods() -> dict:
121
+ """List all pods with extra registry auth information.
122
+
123
+ Adapted from runpod.get_pods() to include containerRegistryAuthId.
124
+ """
125
+ raw_return = runpod.runpod.api.graphql.run_graphql_query(_QUERY_POD)
126
+ cleaned_return = raw_return['data']['myself']['pods']
127
+ return cleaned_return
128
+
129
+
130
+ _QUERY_POD_TEMPLATE_WITH_REGISTRY_AUTH = """
131
+ query myself {
132
+ myself {
133
+ podTemplates {
134
+ name
135
+ containerRegistryAuthId
136
+ }
137
+ }
138
+ }
139
+ """
140
+
141
+
142
+ def _list_pod_templates_with_container_registry() -> dict:
143
+ """List all pod templates."""
144
+ raw_return = runpod.runpod.api.graphql.run_graphql_query(
145
+ _QUERY_POD_TEMPLATE_WITH_REGISTRY_AUTH)
146
+ return raw_return['data']['myself']['podTemplates']
147
+
148
+
69
149
  def list_instances() -> Dict[str, Dict[str, Any]]:
70
150
  """Lists instances associated with API key."""
71
- instances = runpod.runpod.get_pods()
151
+ instances = _sky_get_pods()
72
152
 
73
153
  instance_dict: Dict[str, Dict[str, Any]] = {}
74
154
  for instance in instances:
@@ -100,14 +180,75 @@ def list_instances() -> Dict[str, Dict[str, Any]]:
100
180
  return instance_dict
101
181
 
102
182
 
103
- def launch(name: str, instance_type: str, region: str, disk_size: int,
104
- image_name: str, ports: Optional[List[int]], public_key: str,
105
- preemptible: Optional[bool], bid_per_gpu: float) -> str:
183
+ def delete_pod_template(template_name: str) -> None:
184
+ """Deletes a pod template."""
185
+ try:
186
+ runpod.runpod.api.graphql.run_graphql_query(
187
+ f'mutation {{deleteTemplate(templateName: "{template_name}")}}')
188
+ except runpod.runpod.error.QueryError as e:
189
+ logger.warning(f'Failed to delete template {template_name}: {e}'
190
+ 'Please delete it manually.')
191
+
192
+
193
+ def delete_register_auth(registry_auth_id: str) -> None:
194
+ """Deletes a registry auth."""
195
+ try:
196
+ runpod.runpod.delete_container_registry_auth(registry_auth_id)
197
+ except runpod.runpod.error.QueryError as e:
198
+ logger.warning(f'Failed to delete registry auth {registry_auth_id}: {e}'
199
+ 'Please delete it manually.')
200
+
201
+
202
+ def _create_template_for_docker_login(
203
+ cluster_name: str,
204
+ image_name: str,
205
+ docker_login_config: Optional[Dict[str, str]],
206
+ ) -> Tuple[str, Optional[str]]:
207
+ """Creates a template for the given image with the docker login config.
208
+
209
+ Returns:
210
+ formatted_image_name: The formatted image name.
211
+ template_id: The template ID. None for no docker login config.
212
+ """
213
+ if docker_login_config is None:
214
+ return image_name, None
215
+ login_config = docker_utils.DockerLoginConfig(**docker_login_config)
216
+ container_registry_auth_name = f'{cluster_name}-registry-auth'
217
+ container_template_name = _construct_docker_login_template_name(
218
+ cluster_name)
219
+ # The `name` argument is only for display purpose and the registry server
220
+ # will be splitted from the docker image name (Tested with AWS ECR).
221
+ # Here we only need the username and password to create the registry auth.
222
+ # TODO(tian): Now we create a template and a registry auth for each cluster.
223
+ # Consider create one for each server and reuse them. Challenges including
224
+ # calculate the reference count and delete them when no longer needed.
225
+ create_auth_resp = runpod.runpod.create_container_registry_auth(
226
+ name=container_registry_auth_name,
227
+ username=login_config.username,
228
+ password=login_config.password,
229
+ )
230
+ registry_auth_id = create_auth_resp['id']
231
+ create_template_resp = runpod.runpod.create_template(
232
+ name=container_template_name,
233
+ image_name=None,
234
+ registry_auth_id=registry_auth_id,
235
+ )
236
+ return login_config.format_image(image_name), create_template_resp['id']
237
+
238
+
239
+ def launch(cluster_name: str, node_type: str, instance_type: str, region: str,
240
+ disk_size: int, image_name: str, ports: Optional[List[int]],
241
+ public_key: str, preemptible: Optional[bool], bid_per_gpu: float,
242
+ docker_login_config: Optional[Dict[str, str]]) -> str:
106
243
  """Launches an instance with the given parameters.
107
244
 
108
245
  Converts the instance_type to the RunPod GPU name, finds the specs for the
109
246
  GPU, and launches the instance.
247
+
248
+ Returns:
249
+ instance_id: The instance ID.
110
250
  """
251
+ name = f'{cluster_name}-{node_type}'
111
252
  gpu_type = GPU_NAME_MAP[instance_type.split('_')[1]]
112
253
  gpu_quantity = int(instance_type.split('_')[0].replace('x', ''))
113
254
  cloud_type = instance_type.split('_')[2]
@@ -139,21 +280,24 @@ def launch(name: str, instance_type: str, region: str, disk_size: int,
139
280
  # Use base64 to deal with the tricky quoting issues caused by runpod API.
140
281
  encoded = base64.b64encode(setup_cmd.encode('utf-8')).decode('utf-8')
141
282
 
283
+ docker_args = (f'bash -c \'echo {encoded} | base64 --decode > init.sh; '
284
+ f'bash init.sh\'')
285
+
142
286
  # Port 8081 is occupied for nginx in the base image.
143
287
  custom_ports_str = ''
144
288
  if ports is not None:
145
289
  custom_ports_str = ''.join([f'{p}/tcp,' for p in ports])
290
+ ports_str = (f'22/tcp,'
291
+ f'{custom_ports_str}'
292
+ f'{constants.SKY_REMOTE_RAY_DASHBOARD_PORT}/http,'
293
+ f'{constants.SKY_REMOTE_RAY_PORT}/http')
146
294
 
147
- docker_args = (f'bash -c \'echo {encoded} | base64 --decode > init.sh; '
148
- f'bash init.sh\'')
149
- ports = (f'22/tcp,'
150
- f'{custom_ports_str}'
151
- f'{constants.SKY_REMOTE_RAY_DASHBOARD_PORT}/http,'
152
- f'{constants.SKY_REMOTE_RAY_PORT}/http')
295
+ image_name_formatted, template_id = _create_template_for_docker_login(
296
+ cluster_name, image_name, docker_login_config)
153
297
 
154
298
  params = {
155
299
  'name': name,
156
- 'image_name': image_name,
300
+ 'image_name': image_name_formatted,
157
301
  'gpu_type_id': gpu_type,
158
302
  'cloud_type': cloud_type,
159
303
  'container_disk_in_gb': disk_size,
@@ -161,9 +305,10 @@ def launch(name: str, instance_type: str, region: str, disk_size: int,
161
305
  'min_memory_in_gb': gpu_specs['memoryInGb'] * gpu_quantity,
162
306
  'gpu_count': gpu_quantity,
163
307
  'country_code': region,
164
- 'ports': ports,
308
+ 'ports': ports_str,
165
309
  'support_public_ip': True,
166
310
  'docker_args': docker_args,
311
+ 'template_id': template_id,
167
312
  }
168
313
 
169
314
  if preemptible is None or not preemptible:
@@ -177,6 +322,18 @@ def launch(name: str, instance_type: str, region: str, disk_size: int,
177
322
  return new_instance['id']
178
323
 
179
324
 
325
+ def get_registry_auth_resources(
326
+ cluster_name: str) -> Tuple[Optional[str], Optional[str]]:
327
+ """Gets the registry auth resources."""
328
+ container_registry_auth_name = _construct_docker_login_template_name(
329
+ cluster_name)
330
+ for template in _list_pod_templates_with_container_registry():
331
+ if template['name'] == container_registry_auth_name:
332
+ return container_registry_auth_name, template[
333
+ 'containerRegistryAuthId']
334
+ return None, None
335
+
336
+
180
337
  def remove(instance_id: str) -> None:
181
338
  """Terminates the given instance."""
182
339
  runpod.runpod.terminate_pod(instance_id)
@@ -123,7 +123,9 @@ extras_require: Dict[str, List[str]] = {
123
123
  'oci': ['oci'] + local_ray,
124
124
  'kubernetes': ['kubernetes>=20.0.0'],
125
125
  'remote': remote,
126
- 'runpod': ['runpod>=1.5.1'],
126
+ # For the container registry auth api. Reference:
127
+ # https://github.com/runpod/runpod-python/releases/tag/1.6.1
128
+ 'runpod': ['runpod>=1.6.1'],
127
129
  'fluidstack': [], # No dependencies needed for fluidstack
128
130
  'cudo': ['cudo-compute>=0.1.10'],
129
131
  'paperspace': [], # No dependencies needed for paperspace
@@ -25,7 +25,7 @@ def docker_start_cmds(
25
25
  docker_cmd,
26
26
  ):
27
27
  """Generating docker start command without --rm.
28
-
28
+
29
29
  The code is borrowed from `ray.autoscaler._private.docker`.
30
30
 
31
31
  Changes we made:
@@ -159,19 +159,17 @@ class SkyDockerCommandRunner(DockerCommandRunner):
159
159
  return True
160
160
 
161
161
  # SkyPilot: Docker login if user specified a private docker registry.
162
- if "docker_login_config" in self.docker_config:
162
+ if 'docker_login_config' in self.docker_config:
163
163
  # TODO(tian): Maybe support a command to get the login password?
164
- docker_login_config: docker_utils.DockerLoginConfig = self.docker_config[
165
- "docker_login_config"]
164
+ docker_login_config: docker_utils.DockerLoginConfig = (
165
+ self.docker_config['docker_login_config'])
166
166
  self._run_with_retry(
167
167
  f'{self.docker_cmd} login --username '
168
168
  f'{docker_login_config.username} --password '
169
169
  f'{docker_login_config.password} {docker_login_config.server}')
170
170
  # We automatically add the server prefix to the image name if
171
171
  # the user did not add it.
172
- server_prefix = f'{docker_login_config.server}/'
173
- if not specific_image.startswith(server_prefix):
174
- specific_image = f'{server_prefix}{specific_image}'
172
+ specific_image = docker_login_config.format_image(specific_image)
175
173
 
176
174
  if self.docker_config.get('pull_before_run', True):
177
175
  assert specific_image, ('Image must be included in config if '
@@ -10,6 +10,19 @@ provider:
10
10
  module: sky.provision.runpod
11
11
  region: "{{region}}"
12
12
  disable_launch_config_check: true
13
+ # For RunPod, we directly set the image id for the docker as runtime environment
14
+ # support, thus we need to avoid the DockerInitializer detects the docker field
15
+ # and performs the initialization. Therefore we put the docker login config in
16
+ # the provider config here.
17
+ {%- if docker_login_config is not none %}
18
+ docker_login_config:
19
+ username: |-
20
+ {{docker_login_config.username}}
21
+ password: |-
22
+ {{docker_login_config.password}}
23
+ server: |-
24
+ {{docker_login_config.server}}
25
+ {%- endif %}
13
26
 
14
27
  auth:
15
28
  ssh_user: root