skypilot-nightly 1.0.0.dev20241107__tar.gz → 1.0.0.dev20241109__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 (303) hide show
  1. {skypilot_nightly-1.0.0.dev20241107/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20241109}/PKG-INFO +1 -1
  2. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/cloud_vm_ray_backend.py +12 -6
  4. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/wheel_utils.py +5 -1
  5. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/cli.py +28 -4
  6. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py +3 -1
  7. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/core.py +3 -2
  8. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/dag.py +1 -0
  9. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/mounting_utils.py +4 -16
  10. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/exceptions.py +4 -1
  11. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/execution.py +10 -8
  12. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/core.py +3 -1
  13. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/dashboard.py +2 -1
  14. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/recovery_strategy.py +16 -5
  15. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/state.py +94 -79
  16. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/utils.py +18 -10
  17. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/config.py +25 -5
  18. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/instance_setup.py +1 -0
  19. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/instance.py +6 -1
  20. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/core.py +11 -1
  21. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/constants.py +1 -1
  22. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/job_lib.py +10 -3
  23. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/log_lib.py +77 -8
  24. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ray.yml.j2 +3 -1
  25. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/admin_policy_utils.py +1 -0
  26. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/command_runner.py +14 -2
  27. skypilot_nightly-1.0.0.dev20241109/sky/utils/control_master_utils.py +49 -0
  28. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109/skypilot_nightly.egg-info}/PKG-INFO +1 -1
  29. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/SOURCES.txt +1 -0
  30. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_optimizer_dryruns.py +2 -1
  31. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_smoke.py +29 -0
  32. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/LICENSE +0 -0
  33. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/MANIFEST.in +0 -0
  34. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/README.md +0 -0
  35. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/pyproject.toml +0 -0
  36. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/setup.cfg +0 -0
  37. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/setup.py +0 -0
  38. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/__init__.py +0 -0
  39. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/aws.py +0 -0
  40. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/azure.py +0 -0
  41. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/cloudflare.py +0 -0
  42. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/common.py +0 -0
  43. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/cudo.py +0 -0
  44. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/docker.py +0 -0
  45. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/gcp.py +0 -0
  46. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/ibm.py +0 -0
  47. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/kubernetes.py +0 -0
  48. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/oci.py +0 -0
  49. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/runpod.py +0 -0
  50. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/adaptors/vsphere.py +0 -0
  51. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/admin_policy.py +0 -0
  52. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/authentication.py +0 -0
  53. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/__init__.py +0 -0
  54. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/backend.py +0 -0
  55. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/backend_utils.py +0 -0
  56. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/docker_utils.py +0 -0
  57. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/local_docker_backend.py +0 -0
  58. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  59. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/__init__.py +0 -0
  60. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/benchmark_state.py +0 -0
  61. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/benchmark/benchmark_utils.py +0 -0
  62. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/check.py +0 -0
  63. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/cloud_stores.py +0 -0
  64. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/__init__.py +0 -0
  65. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/aws.py +0 -0
  66. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/azure.py +0 -0
  67. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cloud.py +0 -0
  68. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cloud_registry.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/cudo.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/fluidstack.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/gcp.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/ibm.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/kubernetes.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/lambda_cloud.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/oci.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/paperspace.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/runpod.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/scp.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/__init__.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/aws_catalog.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/azure_catalog.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/common.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/config.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/constants.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/cudo_catalog.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/__init__.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_aws.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_azure.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_cudo.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_gcp.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/data_fetchers/fetch_vsphere.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/fluidstack_catalog.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/gcp_catalog.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/ibm_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/kubernetes_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/lambda_catalog.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/oci_catalog.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/paperspace_catalog.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/runpod_catalog.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/scp_catalog.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/service_catalog/vsphere_catalog.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/__init__.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/aws_utils.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/azure_utils.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/gcp_utils.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/oci_utils.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/utils/scp_utils.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/clouds/vsphere.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/__init__.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/data_transfer.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/data_utils.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/storage.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/data/storage_utils.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/global_user_state.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/__init__.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/constants.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/controller.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/static/favicon.ico +0 -0
  120. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/jobs/dashboard/templates/index.html +0 -0
  121. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/optimizer.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/__init__.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/__init__.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/instance.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/aws/utils.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/__init__.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/azure-config-template.json +0 -0
  128. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/config.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/azure/instance.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/common.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/constants.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/__init__.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/config.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_machine_type.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_utils.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/cudo_wrapper.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/cudo/instance.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/docker_utils.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/__init__.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/config.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/fluidstack/instance.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/__init__.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/config.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/constants.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/instance.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/instance_utils.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/gcp/mig_utils.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/__init__.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/config.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/instance.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/manifests/smarter-device-manager-configmap.yaml +0 -0
  153. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/manifests/smarter-device-manager-daemonset.yaml +0 -0
  154. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/network.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/network_utils.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/kubernetes/utils.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/__init__.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/config.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/instance.py +0 -0
  160. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  161. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/logging.py +0 -0
  162. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/metadata_utils.py +0 -0
  163. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/__init__.py +0 -0
  164. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/config.py +0 -0
  165. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/constants.py +0 -0
  166. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/instance.py +0 -0
  167. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/paperspace/utils.py +0 -0
  168. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/provisioner.py +0 -0
  169. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/__init__.py +0 -0
  170. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/config.py +0 -0
  171. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/runpod/utils.py +0 -0
  172. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/__init__.py +0 -0
  173. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/__init__.py +0 -0
  174. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  175. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  176. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/custom_script.py +0 -0
  177. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/id_generator.py +0 -0
  178. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  179. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/service_manager.py +0 -0
  180. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  181. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  182. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  183. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/common/vim_utils.py +0 -0
  184. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/config.py +0 -0
  185. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/instance.py +0 -0
  186. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/provision/vsphere/vsphere_utils.py +0 -0
  187. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/resources.py +0 -0
  188. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/__init__.py +0 -0
  189. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/autoscalers.py +0 -0
  190. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/constants.py +0 -0
  191. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/controller.py +0 -0
  192. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/load_balancer.py +0 -0
  193. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/load_balancing_policies.py +0 -0
  194. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/replica_managers.py +0 -0
  195. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/serve_state.py +0 -0
  196. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/serve_utils.py +0 -0
  197. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/service.py +0 -0
  198. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/serve/service_spec.py +0 -0
  199. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/setup_files/MANIFEST.in +0 -0
  200. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/setup_files/setup.py +0 -0
  201. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/sky_logging.py +0 -0
  202. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/LICENSE +0 -0
  203. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/__init__.py +0 -0
  204. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/attempt_skylet.py +0 -0
  205. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/autostop_lib.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/configs.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/events.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/log_lib.pyi +0 -0
  209. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/__init__.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/command_runner.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/__init__.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/node_provider.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/utils.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/__init__.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/node_provider.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/query_helper.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/oci/utils.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/__init__.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/config.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/providers/scp/node_provider.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/__init__.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  224. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/cli.py.patch +0 -0
  225. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  226. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  227. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  228. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/updater.py.patch +0 -0
  229. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/ray_patches/worker.py.patch +0 -0
  230. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/skylet.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skylet/subprocess_daemon.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/skypilot_config.py +0 -0
  233. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/status_lib.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/task.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/aws-ray.yml.j2 +0 -0
  236. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/azure-ray.yml.j2 +0 -0
  237. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/cudo-ray.yml.j2 +0 -0
  238. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  239. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/gcp-ray.yml.j2 +0 -0
  240. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/ibm-ray.yml.j2 +0 -0
  241. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/jobs-controller.yaml.j2 +0 -0
  242. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  243. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  244. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  245. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  246. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/lambda-ray.yml.j2 +0 -0
  247. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/local-ray.yml.j2 +0 -0
  248. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/oci-ray.yml.j2 +0 -0
  249. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/paperspace-ray.yml.j2 +0 -0
  250. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/runpod-ray.yml.j2 +0 -0
  251. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/scp-ray.yml.j2 +0 -0
  252. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  253. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/templates/vsphere-ray.yml.j2 +0 -0
  254. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/__init__.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/constants.py +0 -0
  256. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/usage/usage_lib.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/__init__.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/accelerator_registry.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cli_utils/__init__.py +0 -0
  260. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cli_utils/status_utils.py +0 -0
  261. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/cluster_yaml_utils.py +0 -0
  262. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/command_runner.pyi +0 -0
  263. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/common_utils.py +0 -0
  264. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/controller_utils.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/dag_utils.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/db_utils.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/env_options.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/__init__.py +0 -0
  269. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/create_cluster.sh +0 -0
  270. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  271. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/deploy_remote_cluster.sh +0 -0
  272. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  274. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  276. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  277. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  278. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/kubernetes_enums.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/log_utils.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/resources_utils.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/rich_utils.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/schemas.py +0 -0
  284. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/subprocess_utils.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/timeline.py +0 -0
  286. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/ux_utils.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/sky/utils/validator.py +0 -0
  288. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  289. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  290. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/requires.txt +0 -0
  291. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/skypilot_nightly.egg-info/top_level.txt +0 -0
  292. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_api.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_cli.py +0 -0
  294. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_config.py +0 -0
  295. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_global_user_state.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_jobs.py +0 -0
  297. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_jobs_and_serve.py +0 -0
  298. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_list_accelerators.py +0 -0
  299. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_optimizer_random_dag.py +0 -0
  300. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_serve_autoscaler.py +0 -0
  301. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_storage.py +0 -0
  302. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/tests/test_wheels.py +0 -0
  303. {skypilot_nightly-1.0.0.dev20241107 → skypilot_nightly-1.0.0.dev20241109}/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.dev20241107
3
+ Version: 1.0.0.dev20241109
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = 'fe2ce9a262c059722ddce46f5594fc2ca2370c0d'
8
+ _SKYPILOT_COMMIT_SHA = '42c79e1d0a5e018e275705ada53957573f9a0181'
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.dev20241107'
38
+ __version__ = '1.0.0.dev20241109'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -3262,6 +3262,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3262
3262
  ) -> None:
3263
3263
  """Executes generated code on the head node."""
3264
3264
  style = colorama.Style
3265
+ fore = colorama.Fore
3265
3266
 
3266
3267
  script_path = os.path.join(SKY_REMOTE_APP_DIR, f'sky_job_{job_id}')
3267
3268
  remote_log_dir = self.log_dir
@@ -3373,9 +3374,9 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3373
3374
  controller = controller_utils.Controllers.from_name(name)
3374
3375
  if controller == controller_utils.Controllers.JOBS_CONTROLLER:
3375
3376
  logger.info(
3376
- f'\n📋 Useful Commands'
3377
- f'\nManaged Job ID: '
3377
+ f'\n{fore.CYAN}Managed Job ID: '
3378
3378
  f'{style.BRIGHT}{job_id}{style.RESET_ALL}'
3379
+ f'\n📋 Useful Commands'
3379
3380
  f'\n{ux_utils.INDENT_SYMBOL}To cancel the job:\t\t\t'
3380
3381
  f'{ux_utils.BOLD}sky jobs cancel {job_id}'
3381
3382
  f'{ux_utils.RESET_BOLD}'
@@ -3392,8 +3393,9 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3392
3393
  f'dashboard:\t{ux_utils.BOLD}sky jobs dashboard'
3393
3394
  f'{ux_utils.RESET_BOLD}')
3394
3395
  elif controller is None:
3395
- logger.info(f'\n📋 Useful Commands'
3396
- f'\nJob ID: {job_id}'
3396
+ logger.info(f'\n{fore.CYAN}Job ID: '
3397
+ f'{style.BRIGHT}{job_id}{style.RESET_ALL}'
3398
+ f'\n📋 Useful Commands'
3397
3399
  f'\n{ux_utils.INDENT_SYMBOL}To cancel the job:\t\t'
3398
3400
  f'{ux_utils.BOLD}sky cancel {name} {job_id}'
3399
3401
  f'{ux_utils.RESET_BOLD}'
@@ -3709,7 +3711,8 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3709
3711
  handle: CloudVmRayResourceHandle,
3710
3712
  job_id: Optional[int],
3711
3713
  managed_job_id: Optional[int] = None,
3712
- follow: bool = True) -> int:
3714
+ follow: bool = True,
3715
+ tail: int = 0) -> int:
3713
3716
  """Tail the logs of a job.
3714
3717
 
3715
3718
  Args:
@@ -3717,10 +3720,13 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3717
3720
  job_id: The job ID to tail the logs of.
3718
3721
  managed_job_id: The managed job ID for display purpose only.
3719
3722
  follow: Whether to follow the logs.
3723
+ tail: The number of lines to display from the end of the
3724
+ log file. If 0, print all lines.
3720
3725
  """
3721
3726
  code = job_lib.JobLibCodeGen.tail_logs(job_id,
3722
3727
  managed_job_id=managed_job_id,
3723
- follow=follow)
3728
+ follow=follow,
3729
+ tail=tail)
3724
3730
  if job_id is None and managed_job_id is None:
3725
3731
  logger.info(
3726
3732
  'Job ID not provided. Streaming the logs of the latest job.')
@@ -129,7 +129,11 @@ def _build_sky_wheel() -> pathlib.Path:
129
129
 
130
130
  wheel_dir = WHEEL_DIR / hash_of_latest_wheel
131
131
  wheel_dir.mkdir(parents=True, exist_ok=True)
132
- shutil.move(str(wheel_path), wheel_dir)
132
+ # shutil.move will fail when the file already exists and is being
133
+ # moved across filesystems.
134
+ if not os.path.exists(
135
+ os.path.join(wheel_dir, os.path.basename(wheel_path))):
136
+ shutil.move(str(wheel_path), wheel_dir)
133
137
  return wheel_dir / wheel_path.name
134
138
 
135
139
 
@@ -46,6 +46,7 @@ from rich import progress as rich_progress
46
46
  import yaml
47
47
 
48
48
  import sky
49
+ from sky import admin_policy
49
50
  from sky import backends
50
51
  from sky import check as sky_check
51
52
  from sky import clouds as sky_clouds
@@ -67,6 +68,7 @@ from sky.skylet import constants
67
68
  from sky.skylet import job_lib
68
69
  from sky.skylet import log_lib
69
70
  from sky.usage import usage_lib
71
+ from sky.utils import admin_policy_utils
70
72
  from sky.utils import common_utils
71
73
  from sky.utils import controller_utils
72
74
  from sky.utils import dag_utils
@@ -582,6 +584,15 @@ def _launch_with_confirm(
582
584
  with ux_utils.print_exception_no_traceback():
583
585
  raise RuntimeError(f'{colorama.Fore.YELLOW}{e}'
584
586
  f'{colorama.Style.RESET_ALL}') from e
587
+ dag, _ = admin_policy_utils.apply(
588
+ dag,
589
+ request_options=admin_policy.RequestOptions(
590
+ cluster_name=cluster,
591
+ idle_minutes_to_autostop=idle_minutes_to_autostop,
592
+ down=down,
593
+ dryrun=dryrun,
594
+ ),
595
+ )
585
596
  dag = sky.optimize(dag)
586
597
  task = dag.tasks[0]
587
598
 
@@ -2011,6 +2022,12 @@ def queue(clusters: List[str], skip_finished: bool, all_users: bool):
2011
2022
  help=('Follow the logs of a job. '
2012
2023
  'If --no-follow is specified, print the log so far and exit. '
2013
2024
  '[default: --follow]'))
2025
+ @click.option(
2026
+ '--tail',
2027
+ default=0,
2028
+ type=int,
2029
+ help=('The number of lines to display from the end of the log file. '
2030
+ 'Default is 0, which means print all lines.'))
2014
2031
  @click.argument('cluster',
2015
2032
  required=True,
2016
2033
  type=str,
@@ -2024,6 +2041,7 @@ def logs(
2024
2041
  sync_down: bool,
2025
2042
  status: bool, # pylint: disable=redefined-outer-name
2026
2043
  follow: bool,
2044
+ tail: int,
2027
2045
  ):
2028
2046
  # NOTE(dev): Keep the docstring consistent between the Python API and CLI.
2029
2047
  """Tail the log of a job.
@@ -2090,7 +2108,7 @@ def logs(
2090
2108
  click.secho(f'Job {id_str}not found', fg='red')
2091
2109
  sys.exit(1)
2092
2110
 
2093
- core.tail_logs(cluster, job_id, follow)
2111
+ core.tail_logs(cluster, job_id, follow, tail)
2094
2112
 
2095
2113
 
2096
2114
  @cli.command()
@@ -3036,9 +3054,9 @@ def show_gpus(
3036
3054
  and spot instances. There may be multiple regions with the same lowest
3037
3055
  price.
3038
3056
 
3039
- If ``--cloud kubernetes`` is specified, it will show the maximum quantities
3040
- of the GPU available on a single node and the real-time availability of
3041
- the GPU across all nodes in the Kubernetes cluster.
3057
+ If ``--cloud kubernetes`` or ``--cloud k8s`` is specified, it will show the
3058
+ maximum quantities of the GPU available on a single node and the real-time
3059
+ availability of the GPU across all nodes in the Kubernetes cluster.
3042
3060
 
3043
3061
  Definitions of certain fields:
3044
3062
 
@@ -3667,6 +3685,8 @@ def jobs_launch(
3667
3685
 
3668
3686
  click.secho(f'Managed job {dag.name!r} will be launched on (estimated):',
3669
3687
  fg='cyan')
3688
+ dag, _ = admin_policy_utils.apply(
3689
+ dag, use_mutated_config_in_current_request=False)
3670
3690
  dag = sky.optimize(dag)
3671
3691
 
3672
3692
  if not yes:
@@ -4145,6 +4165,8 @@ def serve_up(
4145
4165
  fg='cyan')
4146
4166
  with sky.Dag() as dag:
4147
4167
  dag.add(task)
4168
+ dag, _ = admin_policy_utils.apply(
4169
+ dag, use_mutated_config_in_current_request=False)
4148
4170
  sky.optimize(dag)
4149
4171
 
4150
4172
  if not yes:
@@ -4261,6 +4283,8 @@ def serve_update(
4261
4283
  fg='cyan')
4262
4284
  with sky.Dag() as dag:
4263
4285
  dag.add(task)
4286
+ dag, _ = admin_policy_utils.apply(
4287
+ dag, use_mutated_config_in_current_request=False)
4264
4288
  sky.optimize(dag)
4265
4289
 
4266
4290
  if not yes:
@@ -20,7 +20,6 @@ DEFAULT_LAMBDA_KEYS_PATH = os.path.expanduser('~/.lambda_cloud/lambda_keys')
20
20
 
21
21
  # List of all possible regions.
22
22
  REGIONS = [
23
- 'australia-southeast-1',
24
23
  'europe-central-1',
25
24
  'asia-south-1',
26
25
  'me-west-1',
@@ -28,9 +27,12 @@ REGIONS = [
28
27
  'asia-northeast-1',
29
28
  'asia-northeast-2',
30
29
  'us-east-1',
30
+ 'us-east-2',
31
31
  'us-west-2',
32
32
  'us-west-1',
33
33
  'us-south-1',
34
+ 'us-south-2',
35
+ 'us-south-3',
34
36
  'us-west-3',
35
37
  'us-midwest-1',
36
38
  ]
@@ -742,7 +742,8 @@ def cancel(
742
742
  @usage_lib.entrypoint
743
743
  def tail_logs(cluster_name: str,
744
744
  job_id: Optional[int],
745
- follow: bool = True) -> None:
745
+ follow: bool = True,
746
+ tail: int = 0) -> None:
746
747
  # NOTE(dev): Keep the docstring consistent between the Python API and CLI.
747
748
  """Tail the logs of a job.
748
749
 
@@ -775,7 +776,7 @@ def tail_logs(cluster_name: str,
775
776
  f'{colorama.Style.RESET_ALL}')
776
777
 
777
778
  usage_lib.record_cluster_name_for_current_operation(cluster_name)
778
- backend.tail_logs(handle, job_id, follow=follow)
779
+ backend.tail_logs(handle, job_id, follow=follow, tail=tail)
779
780
 
780
781
 
781
782
  @usage_lib.entrypoint
@@ -23,6 +23,7 @@ class Dag:
23
23
 
24
24
  self.graph = nx.DiGraph()
25
25
  self.name: Optional[str] = None
26
+ self.policy_applied: bool = False
26
27
 
27
28
  def add(self, task: 'task.Task') -> None:
28
29
  self.graph.add_node(task)
@@ -276,23 +276,11 @@ def get_mounting_command(
276
276
  script = get_mounting_script(mount_path, mount_cmd, install_cmd,
277
277
  version_check_cmd)
278
278
 
279
- # TODO(romilb): Get direct bash script to work like so:
280
- # command = f'bash <<-\EOL' \
281
- # f'{script}' \
282
- # 'EOL'
283
-
284
- # TODO(romilb): This heredoc should have EOF after script, but it
285
- # fails with sky's ssh pipeline. Instead, we don't use EOF and use )
286
- # as the end of heredoc. This raises a warning (here-document delimited
287
- # by end-of-file) that can be safely ignored.
288
-
289
279
  # While these commands are run sequentially for each storage object,
290
280
  # we add random int to be on the safer side and avoid collisions.
291
281
  script_path = f'~/.sky/mount_{random.randint(0, 1000000)}.sh'
292
- first_line = r'(cat <<-\EOF > {}'.format(script_path)
293
- command = (f'{first_line}'
294
- f'{script}'
295
- f') && chmod +x {script_path}'
296
- f' && bash {script_path}'
297
- f' && rm {script_path}')
282
+ command = (f'echo {shlex.quote(script)} > {script_path} && '
283
+ f'chmod +x {script_path} && '
284
+ f'bash {script_path} && '
285
+ f'rm {script_path}')
298
286
  return command
@@ -3,6 +3,8 @@ import enum
3
3
  import typing
4
4
  from typing import List, Optional, Sequence
5
5
 
6
+ from sky.utils import env_options
7
+
6
8
  if typing.TYPE_CHECKING:
7
9
  from sky import status_lib
8
10
  from sky.backends import backend
@@ -104,7 +106,8 @@ class CommandError(Exception):
104
106
  if not command:
105
107
  message = error_msg
106
108
  else:
107
- if len(command) > 100:
109
+ if (len(command) > 100 and
110
+ not env_options.Options.SHOW_DEBUG_INFO.get()):
108
111
  # Chunck the command to avoid overflow.
109
112
  command = command[:100] + '...'
110
113
  message = (f'Command {command} failed with return code '
@@ -160,14 +160,16 @@ def _execute(
160
160
  """
161
161
 
162
162
  dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
163
- dag, _ = admin_policy_utils.apply(
164
- dag,
165
- request_options=admin_policy.RequestOptions(
166
- cluster_name=cluster_name,
167
- idle_minutes_to_autostop=idle_minutes_to_autostop,
168
- down=down,
169
- dryrun=dryrun,
170
- ))
163
+ if not dag.policy_applied:
164
+ dag, _ = admin_policy_utils.apply(
165
+ dag,
166
+ request_options=admin_policy.RequestOptions(
167
+ cluster_name=cluster_name,
168
+ idle_minutes_to_autostop=idle_minutes_to_autostop,
169
+ down=down,
170
+ dryrun=dryrun,
171
+ ),
172
+ )
171
173
  assert len(dag) == 1, f'We support 1 task for now. {dag}'
172
174
  task = dag.tasks[0]
173
175
 
@@ -59,8 +59,10 @@ def launch(
59
59
  """
60
60
  entrypoint = task
61
61
  dag_uuid = str(uuid.uuid4().hex[:4])
62
-
63
62
  dag = dag_utils.convert_entrypoint_to_dag(entrypoint)
63
+ # Always apply the policy again here, even though it might have been applied
64
+ # in the CLI. This is to ensure that we apply the policy to the final DAG
65
+ # and get the mutated config.
64
66
  dag, mutated_user_config = admin_policy_utils.apply(
65
67
  dag, use_mutated_config_in_current_request=False)
66
68
  if not dag.is_chain():
@@ -26,7 +26,8 @@ def _is_running_on_jobs_controller() -> bool:
26
26
  """
27
27
  if pathlib.Path('~/.sky/sky_ray.yml').expanduser().exists():
28
28
  config = yaml.safe_load(
29
- pathlib.Path('~/.sky/sky_ray.yml').expanduser().read_text())
29
+ pathlib.Path('~/.sky/sky_ray.yml').expanduser().read_text(
30
+ encoding='utf-8'))
30
31
  cluster_name = config.get('cluster_name', '')
31
32
  candidate_controller_names = (
32
33
  controller_utils.Controllers.JOBS_CONTROLLER.value.
@@ -36,6 +36,11 @@ DEFAULT_RECOVERY_STRATEGY = None
36
36
  # 10 * JOB_STARTED_STATUS_CHECK_GAP_SECONDS = 10 * 5 = 50 seconds
37
37
  MAX_JOB_CHECKING_RETRY = 10
38
38
 
39
+ # Minutes to job cluster autodown. This should be significantly larger than
40
+ # managed_job_utils.JOB_STATUS_CHECK_GAP_SECONDS, to avoid tearing down the
41
+ # cluster before its status can be updated by the job controller.
42
+ _AUTODOWN_MINUTES = 5
43
+
39
44
 
40
45
  def terminate_cluster(cluster_name: str, max_retry: int = 3) -> None:
41
46
  """Terminate the cluster."""
@@ -302,11 +307,17 @@ class StrategyExecutor:
302
307
  usage_lib.messages.usage.set_internal()
303
308
  # Detach setup, so that the setup failure can be detected
304
309
  # by the controller process (job_status -> FAILED_SETUP).
305
- sky.launch(self.dag,
306
- cluster_name=self.cluster_name,
307
- detach_setup=True,
308
- detach_run=True,
309
- _is_launched_by_jobs_controller=True)
310
+ sky.launch(
311
+ self.dag,
312
+ cluster_name=self.cluster_name,
313
+ # We expect to tear down the cluster as soon as the job is
314
+ # finished. However, in case the controller dies, set
315
+ # autodown to try and avoid a resource leak.
316
+ idle_minutes_to_autostop=_AUTODOWN_MINUTES,
317
+ down=True,
318
+ detach_setup=True,
319
+ detach_run=True,
320
+ _is_launched_by_jobs_controller=True)
310
321
  logger.info('Managed job cluster launched.')
311
322
  except (exceptions.InvalidClusterNameError,
312
323
  exceptions.NoCloudAccessError,
@@ -12,6 +12,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
12
12
  import colorama
13
13
 
14
14
  from sky import sky_logging
15
+ from sky.utils import common_utils
15
16
  from sky.utils import db_utils
16
17
 
17
18
  if typing.TYPE_CHECKING:
@@ -22,23 +23,6 @@ CallbackType = Callable[[str], None]
22
23
  logger = sky_logging.init_logger(__name__)
23
24
 
24
25
 
25
- def _get_db_path() -> str:
26
- """Workaround to collapse multi-step Path ops for type checker.
27
- Ensures _DB_PATH is str, avoiding Union[Path, str] inference.
28
- """
29
- path = pathlib.Path('~/.sky/spot_jobs.db')
30
- path = path.expanduser().absolute()
31
- path.parents[0].mkdir(parents=True, exist_ok=True)
32
- return str(path)
33
-
34
-
35
- _DB_PATH = _get_db_path()
36
-
37
- # Module-level connection/cursor; thread-safe as the module is only imported
38
- # once.
39
- _CONN = sqlite3.connect(_DB_PATH)
40
- _CURSOR = _CONN.cursor()
41
-
42
26
  # === Database schema ===
43
27
  # `spot` table contains all the finest-grained tasks, including all the
44
28
  # tasks of a managed job (called spot for legacy reason, as it is generalized
@@ -50,68 +34,99 @@ _CURSOR = _CONN.cursor()
50
34
  # identifier/primary key for all the tasks. We will use `spot_job_id`
51
35
  # to identify the spot job.
52
36
  # TODO(zhwu): schema migration may be needed.
53
- _CURSOR.execute("""\
54
- CREATE TABLE IF NOT EXISTS spot (
55
- job_id INTEGER PRIMARY KEY AUTOINCREMENT,
56
- job_name TEXT,
57
- resources TEXT,
58
- submitted_at FLOAT,
59
- status TEXT,
60
- run_timestamp TEXT CANDIDATE KEY,
61
- start_at FLOAT DEFAULT NULL,
62
- end_at FLOAT DEFAULT NULL,
63
- last_recovered_at FLOAT DEFAULT -1,
64
- recovery_count INTEGER DEFAULT 0,
65
- job_duration FLOAT DEFAULT 0,
66
- failure_reason TEXT,
67
- spot_job_id INTEGER,
68
- task_id INTEGER DEFAULT 0,
69
- task_name TEXT,
70
- specs TEXT)""")
71
- _CONN.commit()
72
-
73
- db_utils.add_column_to_table(_CURSOR, _CONN, 'spot', 'failure_reason', 'TEXT')
74
- # Create a new column `spot_job_id`, which is the same for tasks of the
75
- # same managed job.
76
- # The original `job_id` no longer has an actual meaning, but only a legacy
77
- # identifier for all tasks in database.
78
- db_utils.add_column_to_table(_CURSOR,
79
- _CONN,
80
- 'spot',
81
- 'spot_job_id',
82
- 'INTEGER',
83
- copy_from='job_id')
84
- db_utils.add_column_to_table(_CURSOR,
85
- _CONN,
86
- 'spot',
87
- 'task_id',
88
- 'INTEGER DEFAULT 0',
89
- value_to_replace_existing_entries=0)
90
- db_utils.add_column_to_table(_CURSOR,
91
- _CONN,
92
- 'spot',
93
- 'task_name',
94
- 'TEXT',
95
- copy_from='job_name')
96
-
97
- # Specs is some useful information about the task, e.g., the
98
- # max_restarts_on_errors value. It is stored in JSON format.
99
- db_utils.add_column_to_table(_CURSOR,
100
- _CONN,
101
- 'spot',
102
- 'specs',
103
- 'TEXT',
104
- value_to_replace_existing_entries=json.dumps({
105
- 'max_restarts_on_errors': 0,
106
- }))
107
-
108
- # `job_info` contains the mapping from job_id to the job_name.
109
- # In the future, it may contain more information about each job.
110
- _CURSOR.execute("""\
111
- CREATE TABLE IF NOT EXISTS job_info (
112
- spot_job_id INTEGER PRIMARY KEY AUTOINCREMENT,
113
- name TEXT)""")
114
- _CONN.commit()
37
+ def create_table(cursor, conn):
38
+ # Enable WAL mode to avoid locking issues.
39
+ # See: issue #3863, #1441 and PR #1509
40
+ # https://github.com/microsoft/WSL/issues/2395
41
+ # TODO(romilb): We do not enable WAL for WSL because of known issue in WSL.
42
+ # This may cause the database locked problem from WSL issue #1441.
43
+ if not common_utils.is_wsl():
44
+ try:
45
+ cursor.execute('PRAGMA journal_mode=WAL')
46
+ except sqlite3.OperationalError as e:
47
+ if 'database is locked' not in str(e):
48
+ raise
49
+ # If the database is locked, it is OK to continue, as the WAL mode
50
+ # is not critical and is likely to be enabled by other processes.
51
+
52
+ cursor.execute("""\
53
+ CREATE TABLE IF NOT EXISTS spot (
54
+ job_id INTEGER PRIMARY KEY AUTOINCREMENT,
55
+ job_name TEXT,
56
+ resources TEXT,
57
+ submitted_at FLOAT,
58
+ status TEXT,
59
+ run_timestamp TEXT CANDIDATE KEY,
60
+ start_at FLOAT DEFAULT NULL,
61
+ end_at FLOAT DEFAULT NULL,
62
+ last_recovered_at FLOAT DEFAULT -1,
63
+ recovery_count INTEGER DEFAULT 0,
64
+ job_duration FLOAT DEFAULT 0,
65
+ failure_reason TEXT,
66
+ spot_job_id INTEGER,
67
+ task_id INTEGER DEFAULT 0,
68
+ task_name TEXT,
69
+ specs TEXT)""")
70
+ conn.commit()
71
+
72
+ db_utils.add_column_to_table(cursor, conn, 'spot', 'failure_reason', 'TEXT')
73
+ # Create a new column `spot_job_id`, which is the same for tasks of the
74
+ # same managed job.
75
+ # The original `job_id` no longer has an actual meaning, but only a legacy
76
+ # identifier for all tasks in database.
77
+ db_utils.add_column_to_table(cursor,
78
+ conn,
79
+ 'spot',
80
+ 'spot_job_id',
81
+ 'INTEGER',
82
+ copy_from='job_id')
83
+ db_utils.add_column_to_table(cursor,
84
+ conn,
85
+ 'spot',
86
+ 'task_id',
87
+ 'INTEGER DEFAULT 0',
88
+ value_to_replace_existing_entries=0)
89
+ db_utils.add_column_to_table(cursor,
90
+ conn,
91
+ 'spot',
92
+ 'task_name',
93
+ 'TEXT',
94
+ copy_from='job_name')
95
+
96
+ # Specs is some useful information about the task, e.g., the
97
+ # max_restarts_on_errors value. It is stored in JSON format.
98
+ db_utils.add_column_to_table(cursor,
99
+ conn,
100
+ 'spot',
101
+ 'specs',
102
+ 'TEXT',
103
+ value_to_replace_existing_entries=json.dumps({
104
+ 'max_restarts_on_errors': 0,
105
+ }))
106
+
107
+ # `job_info` contains the mapping from job_id to the job_name.
108
+ # In the future, it may contain more information about each job.
109
+ cursor.execute("""\
110
+ CREATE TABLE IF NOT EXISTS job_info (
111
+ spot_job_id INTEGER PRIMARY KEY AUTOINCREMENT,
112
+ name TEXT)""")
113
+ conn.commit()
114
+
115
+
116
+ # Module-level connection/cursor; thread-safe as the module is only imported
117
+ # once.
118
+ def _get_db_path() -> str:
119
+ """Workaround to collapse multi-step Path ops for type checker.
120
+ Ensures _DB_PATH is str, avoiding Union[Path, str] inference.
121
+ """
122
+ path = pathlib.Path('~/.sky/spot_jobs.db')
123
+ path = path.expanduser().absolute()
124
+ path.parents[0].mkdir(parents=True, exist_ok=True)
125
+ return str(path)
126
+
127
+
128
+ _DB_PATH = _get_db_path()
129
+ db_utils.SQLiteConn(_DB_PATH, create_table)
115
130
 
116
131
  # job_duration is the time a job actually runs (including the
117
132
  # setup duration) before last_recover, excluding the provision
@@ -14,7 +14,7 @@ import shutil
14
14
  import textwrap
15
15
  import time
16
16
  import typing
17
- from typing import Any, Dict, List, Optional, Tuple, Union
17
+ from typing import Any, Dict, List, Optional, Set, Tuple, Union
18
18
 
19
19
  import colorama
20
20
  import filelock
@@ -487,6 +487,7 @@ def stream_logs(job_id: Optional[int],
487
487
  job_id = managed_job_state.get_latest_job_id()
488
488
  if job_id is None:
489
489
  return 'No managed job found.'
490
+
490
491
  if controller:
491
492
  if job_id is None:
492
493
  assert job_name is not None
@@ -494,16 +495,22 @@ def stream_logs(job_id: Optional[int],
494
495
  # We manually filter the jobs by name, instead of using
495
496
  # get_nonterminal_job_ids_by_name, as with `controller=True`, we
496
497
  # should be able to show the logs for jobs in terminal states.
497
- managed_jobs = list(
498
- filter(lambda job: job['job_name'] == job_name, managed_jobs))
499
- if len(managed_jobs) == 0:
498
+ managed_job_ids: Set[int] = {
499
+ job['job_id']
500
+ for job in managed_jobs
501
+ if job['job_name'] == job_name
502
+ }
503
+ if len(managed_job_ids) == 0:
500
504
  return f'No managed job found with name {job_name!r}.'
501
- if len(managed_jobs) > 1:
502
- job_ids_str = ', '.join(job['job_id'] for job in managed_jobs)
503
- raise ValueError(
504
- f'Multiple managed jobs found with name {job_name!r} (Job '
505
- f'IDs: {job_ids_str}). Please specify the job_id instead.')
506
- job_id = managed_jobs[0]['job_id']
505
+ if len(managed_job_ids) > 1:
506
+ job_ids_str = ', '.join(
507
+ str(job_id) for job_id in managed_job_ids)
508
+ with ux_utils.print_exception_no_traceback():
509
+ raise ValueError(
510
+ f'Multiple managed jobs found with name {job_name!r} '
511
+ f'(Job IDs: {job_ids_str}). Please specify the job_id '
512
+ 'instead.')
513
+ job_id = managed_job_ids.pop()
507
514
  assert job_id is not None, (job_id, job_name)
508
515
  # TODO: keep the following code sync with
509
516
  # job_lib.JobLibCodeGen.tail_logs, we do not directly call that function
@@ -849,6 +856,7 @@ class ManagedJobCodeGen:
849
856
 
850
857
  from sky.skylet import job_lib, log_lib
851
858
  from sky.skylet import constants
859
+ from sky.utils import ux_utils
852
860
  try:
853
861
  from sky.jobs.utils import stream_logs_by_id
854
862
  except ImportError: