skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20251210__py3-none-any.whl

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 (429) hide show
  1. sky/__init__.py +12 -2
  2. sky/adaptors/aws.py +27 -22
  3. sky/adaptors/common.py +25 -2
  4. sky/adaptors/coreweave.py +278 -0
  5. sky/adaptors/do.py +8 -2
  6. sky/adaptors/gcp.py +11 -0
  7. sky/adaptors/ibm.py +5 -2
  8. sky/adaptors/kubernetes.py +64 -0
  9. sky/adaptors/nebius.py +3 -1
  10. sky/adaptors/primeintellect.py +1 -0
  11. sky/adaptors/seeweb.py +183 -0
  12. sky/adaptors/shadeform.py +89 -0
  13. sky/adaptors/slurm.py +478 -0
  14. sky/admin_policy.py +20 -0
  15. sky/authentication.py +157 -263
  16. sky/backends/__init__.py +3 -2
  17. sky/backends/backend.py +11 -3
  18. sky/backends/backend_utils.py +630 -185
  19. sky/backends/cloud_vm_ray_backend.py +1111 -928
  20. sky/backends/local_docker_backend.py +9 -5
  21. sky/backends/task_codegen.py +971 -0
  22. sky/backends/wheel_utils.py +18 -0
  23. sky/catalog/__init__.py +8 -3
  24. sky/catalog/aws_catalog.py +4 -0
  25. sky/catalog/common.py +19 -1
  26. sky/catalog/data_fetchers/fetch_aws.py +102 -80
  27. sky/catalog/data_fetchers/fetch_gcp.py +30 -3
  28. sky/catalog/data_fetchers/fetch_nebius.py +9 -6
  29. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  30. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  31. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  32. sky/catalog/kubernetes_catalog.py +36 -32
  33. sky/catalog/primeintellect_catalog.py +95 -0
  34. sky/catalog/runpod_catalog.py +5 -1
  35. sky/catalog/seeweb_catalog.py +184 -0
  36. sky/catalog/shadeform_catalog.py +165 -0
  37. sky/catalog/slurm_catalog.py +243 -0
  38. sky/check.py +87 -46
  39. sky/client/cli/command.py +1004 -434
  40. sky/client/cli/flags.py +4 -2
  41. sky/{volumes/utils.py → client/cli/table_utils.py} +111 -13
  42. sky/client/cli/utils.py +79 -0
  43. sky/client/common.py +12 -2
  44. sky/client/sdk.py +188 -65
  45. sky/client/sdk_async.py +34 -33
  46. sky/cloud_stores.py +82 -3
  47. sky/clouds/__init__.py +8 -0
  48. sky/clouds/aws.py +337 -129
  49. sky/clouds/azure.py +24 -18
  50. sky/clouds/cloud.py +47 -13
  51. sky/clouds/cudo.py +16 -13
  52. sky/clouds/do.py +9 -7
  53. sky/clouds/fluidstack.py +12 -5
  54. sky/clouds/gcp.py +14 -7
  55. sky/clouds/hyperbolic.py +12 -5
  56. sky/clouds/ibm.py +12 -5
  57. sky/clouds/kubernetes.py +80 -45
  58. sky/clouds/lambda_cloud.py +12 -5
  59. sky/clouds/nebius.py +23 -9
  60. sky/clouds/oci.py +19 -12
  61. sky/clouds/paperspace.py +4 -1
  62. sky/clouds/primeintellect.py +317 -0
  63. sky/clouds/runpod.py +85 -24
  64. sky/clouds/scp.py +12 -8
  65. sky/clouds/seeweb.py +477 -0
  66. sky/clouds/shadeform.py +400 -0
  67. sky/clouds/slurm.py +578 -0
  68. sky/clouds/ssh.py +6 -3
  69. sky/clouds/utils/scp_utils.py +61 -50
  70. sky/clouds/vast.py +43 -27
  71. sky/clouds/vsphere.py +14 -16
  72. sky/core.py +296 -195
  73. sky/dashboard/out/404.html +1 -1
  74. sky/dashboard/out/_next/static/KYAhEFa3FTfq4JyKVgo-s/_buildManifest.js +1 -0
  75. sky/dashboard/out/_next/static/chunks/1141-9c810f01ff4f398a.js +11 -0
  76. sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
  77. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  78. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  79. sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
  80. sky/dashboard/out/_next/static/chunks/3294.ddda8c6c6f9f24dc.js +1 -0
  81. sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
  82. sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-b589397dc09c5b4e.js} +1 -1
  83. sky/dashboard/out/_next/static/chunks/3850-fd5696f3bbbaddae.js +1 -0
  84. sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
  85. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  86. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  87. sky/dashboard/out/_next/static/chunks/6856-da20c5fd999f319c.js +1 -0
  88. sky/dashboard/out/_next/static/chunks/6990-09cbf02d3cd518c3.js +1 -0
  89. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  90. sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
  91. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  92. sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
  93. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  94. sky/dashboard/out/_next/static/chunks/9353-8369df1cf105221c.js +1 -0
  95. sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
  96. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  97. sky/dashboard/out/_next/static/chunks/pages/_app-68b647e26f9d2793.js +34 -0
  98. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-33f525539665fdfd.js +16 -0
  99. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a7565f586ef86467.js +1 -0
  100. sky/dashboard/out/_next/static/chunks/pages/clusters-9e5d47818b9bdadd.js +1 -0
  101. sky/dashboard/out/_next/static/chunks/pages/{config-dfb9bf07b13045f4.js → config-718cdc365de82689.js} +1 -1
  102. sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-12c559ec4d81fdbd.js} +1 -1
  103. sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-d187cd0413d72475.js} +1 -1
  104. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-895847b6cf200b04.js +16 -0
  105. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-8d0f4655400b4eb9.js +21 -0
  106. sky/dashboard/out/_next/static/chunks/pages/jobs-e5a98f17f8513a96.js +1 -0
  107. sky/dashboard/out/_next/static/chunks/pages/plugins/[...slug]-4f46050ca065d8f8.js +1 -0
  108. sky/dashboard/out/_next/static/chunks/pages/users-2f7646eb77785a2c.js +1 -0
  109. sky/dashboard/out/_next/static/chunks/pages/volumes-ef19d49c6d0e8500.js +1 -0
  110. sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-96e0f298308da7e2.js} +1 -1
  111. sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-cb4da3abe08ebf19.js} +1 -1
  112. sky/dashboard/out/_next/static/chunks/webpack-fba3de387ff6bb08.js +1 -0
  113. sky/dashboard/out/_next/static/css/c5a4cfd2600fc715.css +3 -0
  114. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  115. sky/dashboard/out/clusters/[cluster].html +1 -1
  116. sky/dashboard/out/clusters.html +1 -1
  117. sky/dashboard/out/config.html +1 -1
  118. sky/dashboard/out/index.html +1 -1
  119. sky/dashboard/out/infra/[context].html +1 -1
  120. sky/dashboard/out/infra.html +1 -1
  121. sky/dashboard/out/jobs/[job].html +1 -1
  122. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  123. sky/dashboard/out/jobs.html +1 -1
  124. sky/dashboard/out/plugins/[...slug].html +1 -0
  125. sky/dashboard/out/users.html +1 -1
  126. sky/dashboard/out/volumes.html +1 -1
  127. sky/dashboard/out/workspace/new.html +1 -1
  128. sky/dashboard/out/workspaces/[name].html +1 -1
  129. sky/dashboard/out/workspaces.html +1 -1
  130. sky/data/data_utils.py +92 -1
  131. sky/data/mounting_utils.py +177 -30
  132. sky/data/storage.py +200 -19
  133. sky/data/storage_utils.py +10 -45
  134. sky/exceptions.py +18 -7
  135. sky/execution.py +74 -31
  136. sky/global_user_state.py +605 -191
  137. sky/jobs/__init__.py +2 -0
  138. sky/jobs/client/sdk.py +101 -4
  139. sky/jobs/client/sdk_async.py +31 -5
  140. sky/jobs/constants.py +15 -8
  141. sky/jobs/controller.py +726 -284
  142. sky/jobs/file_content_utils.py +128 -0
  143. sky/jobs/log_gc.py +193 -0
  144. sky/jobs/recovery_strategy.py +250 -100
  145. sky/jobs/scheduler.py +271 -173
  146. sky/jobs/server/core.py +367 -114
  147. sky/jobs/server/server.py +81 -35
  148. sky/jobs/server/utils.py +89 -35
  149. sky/jobs/state.py +1498 -620
  150. sky/jobs/utils.py +771 -306
  151. sky/logs/agent.py +40 -5
  152. sky/logs/aws.py +9 -19
  153. sky/metrics/utils.py +282 -39
  154. sky/models.py +2 -0
  155. sky/optimizer.py +7 -6
  156. sky/provision/__init__.py +38 -1
  157. sky/provision/aws/config.py +34 -13
  158. sky/provision/aws/instance.py +5 -2
  159. sky/provision/azure/instance.py +5 -3
  160. sky/provision/common.py +22 -0
  161. sky/provision/cudo/instance.py +4 -3
  162. sky/provision/do/instance.py +4 -3
  163. sky/provision/docker_utils.py +112 -28
  164. sky/provision/fluidstack/instance.py +6 -5
  165. sky/provision/gcp/config.py +6 -1
  166. sky/provision/gcp/instance.py +4 -2
  167. sky/provision/hyperbolic/instance.py +4 -2
  168. sky/provision/instance_setup.py +66 -20
  169. sky/provision/kubernetes/__init__.py +2 -0
  170. sky/provision/kubernetes/config.py +7 -44
  171. sky/provision/kubernetes/constants.py +0 -1
  172. sky/provision/kubernetes/instance.py +609 -213
  173. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  174. sky/provision/kubernetes/network.py +12 -8
  175. sky/provision/kubernetes/network_utils.py +8 -25
  176. sky/provision/kubernetes/utils.py +422 -422
  177. sky/provision/kubernetes/volume.py +150 -18
  178. sky/provision/lambda_cloud/instance.py +16 -13
  179. sky/provision/nebius/instance.py +6 -2
  180. sky/provision/nebius/utils.py +103 -86
  181. sky/provision/oci/instance.py +4 -2
  182. sky/provision/paperspace/instance.py +4 -3
  183. sky/provision/primeintellect/__init__.py +10 -0
  184. sky/provision/primeintellect/config.py +11 -0
  185. sky/provision/primeintellect/instance.py +454 -0
  186. sky/provision/primeintellect/utils.py +398 -0
  187. sky/provision/provisioner.py +45 -15
  188. sky/provision/runpod/__init__.py +2 -0
  189. sky/provision/runpod/instance.py +4 -3
  190. sky/provision/runpod/volume.py +69 -13
  191. sky/provision/scp/instance.py +307 -130
  192. sky/provision/seeweb/__init__.py +11 -0
  193. sky/provision/seeweb/config.py +13 -0
  194. sky/provision/seeweb/instance.py +812 -0
  195. sky/provision/shadeform/__init__.py +11 -0
  196. sky/provision/shadeform/config.py +12 -0
  197. sky/provision/shadeform/instance.py +351 -0
  198. sky/provision/shadeform/shadeform_utils.py +83 -0
  199. sky/provision/slurm/__init__.py +12 -0
  200. sky/provision/slurm/config.py +13 -0
  201. sky/provision/slurm/instance.py +572 -0
  202. sky/provision/slurm/utils.py +583 -0
  203. sky/provision/vast/instance.py +9 -4
  204. sky/provision/vast/utils.py +10 -6
  205. sky/provision/volume.py +164 -0
  206. sky/provision/vsphere/common/ssl_helper.py +1 -1
  207. sky/provision/vsphere/common/vapiconnect.py +2 -1
  208. sky/provision/vsphere/common/vim_utils.py +3 -2
  209. sky/provision/vsphere/instance.py +8 -6
  210. sky/provision/vsphere/vsphere_utils.py +8 -1
  211. sky/resources.py +11 -3
  212. sky/schemas/api/responses.py +107 -6
  213. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  214. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  215. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  216. sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
  217. sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
  218. sky/schemas/db/serve_state/002_yaml_content.py +34 -0
  219. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  220. sky/schemas/db/spot_jobs/002_cluster_pool.py +3 -3
  221. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  222. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  223. sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
  224. sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
  225. sky/schemas/generated/jobsv1_pb2.py +86 -0
  226. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  227. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  228. sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
  229. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  230. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  231. sky/schemas/generated/servev1_pb2.py +58 -0
  232. sky/schemas/generated/servev1_pb2.pyi +115 -0
  233. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  234. sky/serve/autoscalers.py +2 -0
  235. sky/serve/client/impl.py +55 -21
  236. sky/serve/constants.py +4 -3
  237. sky/serve/controller.py +17 -11
  238. sky/serve/load_balancing_policies.py +1 -1
  239. sky/serve/replica_managers.py +219 -142
  240. sky/serve/serve_rpc_utils.py +179 -0
  241. sky/serve/serve_state.py +63 -54
  242. sky/serve/serve_utils.py +145 -109
  243. sky/serve/server/core.py +46 -25
  244. sky/serve/server/impl.py +311 -162
  245. sky/serve/server/server.py +21 -19
  246. sky/serve/service.py +84 -68
  247. sky/serve/service_spec.py +45 -7
  248. sky/server/auth/loopback.py +38 -0
  249. sky/server/auth/oauth2_proxy.py +12 -7
  250. sky/server/common.py +47 -24
  251. sky/server/config.py +62 -28
  252. sky/server/constants.py +9 -1
  253. sky/server/daemons.py +109 -38
  254. sky/server/metrics.py +76 -96
  255. sky/server/middleware_utils.py +166 -0
  256. sky/server/plugins.py +222 -0
  257. sky/server/requests/executor.py +384 -145
  258. sky/server/requests/payloads.py +83 -19
  259. sky/server/requests/preconditions.py +15 -13
  260. sky/server/requests/request_names.py +123 -0
  261. sky/server/requests/requests.py +511 -157
  262. sky/server/requests/serializers/decoders.py +48 -17
  263. sky/server/requests/serializers/encoders.py +102 -20
  264. sky/server/requests/serializers/return_value_serializers.py +60 -0
  265. sky/server/requests/threads.py +117 -0
  266. sky/server/rest.py +116 -24
  267. sky/server/server.py +497 -179
  268. sky/server/server_utils.py +30 -0
  269. sky/server/stream_utils.py +219 -45
  270. sky/server/uvicorn.py +30 -19
  271. sky/setup_files/MANIFEST.in +6 -1
  272. sky/setup_files/alembic.ini +8 -0
  273. sky/setup_files/dependencies.py +64 -19
  274. sky/setup_files/setup.py +44 -44
  275. sky/sky_logging.py +13 -5
  276. sky/skylet/attempt_skylet.py +116 -24
  277. sky/skylet/configs.py +3 -1
  278. sky/skylet/constants.py +139 -29
  279. sky/skylet/events.py +74 -14
  280. sky/skylet/executor/__init__.py +1 -0
  281. sky/skylet/executor/slurm.py +189 -0
  282. sky/skylet/job_lib.py +143 -105
  283. sky/skylet/log_lib.py +252 -8
  284. sky/skylet/log_lib.pyi +47 -7
  285. sky/skylet/providers/ibm/node_provider.py +12 -8
  286. sky/skylet/providers/ibm/vpc_provider.py +13 -12
  287. sky/skylet/runtime_utils.py +21 -0
  288. sky/skylet/services.py +524 -0
  289. sky/skylet/skylet.py +27 -2
  290. sky/skylet/subprocess_daemon.py +104 -28
  291. sky/skypilot_config.py +99 -79
  292. sky/ssh_node_pools/constants.py +12 -0
  293. sky/ssh_node_pools/core.py +40 -3
  294. sky/ssh_node_pools/deploy/__init__.py +4 -0
  295. sky/ssh_node_pools/deploy/deploy.py +952 -0
  296. sky/ssh_node_pools/deploy/tunnel_utils.py +199 -0
  297. sky/ssh_node_pools/deploy/utils.py +173 -0
  298. sky/ssh_node_pools/server.py +20 -21
  299. sky/{utils/kubernetes/ssh_utils.py → ssh_node_pools/utils.py} +9 -6
  300. sky/task.py +221 -104
  301. sky/templates/aws-ray.yml.j2 +1 -0
  302. sky/templates/azure-ray.yml.j2 +1 -0
  303. sky/templates/cudo-ray.yml.j2 +1 -0
  304. sky/templates/do-ray.yml.j2 +1 -0
  305. sky/templates/fluidstack-ray.yml.j2 +1 -0
  306. sky/templates/gcp-ray.yml.j2 +1 -0
  307. sky/templates/hyperbolic-ray.yml.j2 +1 -0
  308. sky/templates/ibm-ray.yml.j2 +2 -1
  309. sky/templates/jobs-controller.yaml.j2 +3 -0
  310. sky/templates/kubernetes-ray.yml.j2 +204 -55
  311. sky/templates/lambda-ray.yml.j2 +1 -0
  312. sky/templates/nebius-ray.yml.j2 +3 -0
  313. sky/templates/oci-ray.yml.j2 +1 -0
  314. sky/templates/paperspace-ray.yml.j2 +1 -0
  315. sky/templates/primeintellect-ray.yml.j2 +72 -0
  316. sky/templates/runpod-ray.yml.j2 +1 -0
  317. sky/templates/scp-ray.yml.j2 +1 -0
  318. sky/templates/seeweb-ray.yml.j2 +171 -0
  319. sky/templates/shadeform-ray.yml.j2 +73 -0
  320. sky/templates/slurm-ray.yml.j2 +85 -0
  321. sky/templates/vast-ray.yml.j2 +2 -0
  322. sky/templates/vsphere-ray.yml.j2 +1 -0
  323. sky/templates/websocket_proxy.py +188 -43
  324. sky/usage/usage_lib.py +16 -4
  325. sky/users/model.conf +1 -1
  326. sky/users/permission.py +84 -44
  327. sky/users/rbac.py +31 -3
  328. sky/utils/accelerator_registry.py +6 -3
  329. sky/utils/admin_policy_utils.py +18 -5
  330. sky/utils/annotations.py +128 -6
  331. sky/utils/asyncio_utils.py +78 -0
  332. sky/utils/atomic.py +1 -1
  333. sky/utils/auth_utils.py +153 -0
  334. sky/utils/cli_utils/status_utils.py +12 -7
  335. sky/utils/cluster_utils.py +28 -6
  336. sky/utils/command_runner.py +283 -30
  337. sky/utils/command_runner.pyi +63 -7
  338. sky/utils/common.py +3 -1
  339. sky/utils/common_utils.py +55 -7
  340. sky/utils/config_utils.py +1 -14
  341. sky/utils/context.py +127 -40
  342. sky/utils/context_utils.py +73 -18
  343. sky/utils/controller_utils.py +229 -70
  344. sky/utils/db/db_utils.py +95 -18
  345. sky/utils/db/kv_cache.py +149 -0
  346. sky/utils/db/migration_utils.py +24 -7
  347. sky/utils/env_options.py +4 -0
  348. sky/utils/git.py +559 -1
  349. sky/utils/kubernetes/create_cluster.sh +15 -30
  350. sky/utils/kubernetes/delete_cluster.sh +10 -7
  351. sky/utils/kubernetes/generate_kind_config.py +6 -66
  352. sky/utils/kubernetes/gpu_labeler.py +13 -3
  353. sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
  354. sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
  355. sky/utils/kubernetes/kubernetes_deploy_utils.py +187 -260
  356. sky/utils/kubernetes/rsync_helper.sh +11 -3
  357. sky/utils/kubernetes/ssh-tunnel.sh +7 -376
  358. sky/utils/kubernetes_enums.py +7 -15
  359. sky/utils/lock_events.py +4 -4
  360. sky/utils/locks.py +128 -31
  361. sky/utils/log_utils.py +0 -319
  362. sky/utils/resource_checker.py +13 -10
  363. sky/utils/resources_utils.py +53 -29
  364. sky/utils/rich_utils.py +8 -4
  365. sky/utils/schemas.py +138 -52
  366. sky/utils/subprocess_utils.py +17 -4
  367. sky/utils/thread_utils.py +91 -0
  368. sky/utils/timeline.py +2 -1
  369. sky/utils/ux_utils.py +35 -1
  370. sky/utils/volume.py +88 -4
  371. sky/utils/yaml_utils.py +9 -0
  372. sky/volumes/client/sdk.py +48 -10
  373. sky/volumes/server/core.py +59 -22
  374. sky/volumes/server/server.py +46 -17
  375. sky/volumes/volume.py +54 -42
  376. sky/workspaces/core.py +57 -21
  377. sky/workspaces/server.py +13 -12
  378. sky_templates/README.md +3 -0
  379. sky_templates/__init__.py +3 -0
  380. sky_templates/ray/__init__.py +0 -0
  381. sky_templates/ray/start_cluster +183 -0
  382. sky_templates/ray/stop_cluster +75 -0
  383. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/METADATA +343 -65
  384. skypilot_nightly-1.0.0.dev20251210.dist-info/RECORD +629 -0
  385. skypilot_nightly-1.0.0.dev20251210.dist-info/top_level.txt +2 -0
  386. sky/client/cli/git.py +0 -549
  387. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  388. sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
  389. sky/dashboard/out/_next/static/chunks/1836-37fede578e2da5f8.js +0 -40
  390. sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
  391. sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
  392. sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
  393. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +0 -1
  394. sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +0 -21
  395. sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +0 -10
  396. sky/dashboard/out/_next/static/chunks/4725.10f7a9a5d3ea8208.js +0 -1
  397. sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
  398. sky/dashboard/out/_next/static/chunks/6135-4b4d5e824b7f9d3c.js +0 -1
  399. sky/dashboard/out/_next/static/chunks/649.b9d7f7d10c1b8c53.js +0 -45
  400. sky/dashboard/out/_next/static/chunks/6856-dca7962af4814e1b.js +0 -1
  401. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  402. sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +0 -6
  403. sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +0 -18
  404. sky/dashboard/out/_next/static/chunks/7669.1f5d9a402bf5cc42.js +0 -36
  405. sky/dashboard/out/_next/static/chunks/8969-0be3036bf86f8256.js +0 -1
  406. sky/dashboard/out/_next/static/chunks/9025.c12318fb6a1a9093.js +0 -6
  407. sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
  408. sky/dashboard/out/_next/static/chunks/pages/_app-ce361c6959bc2001.js +0 -34
  409. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  410. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js +0 -16
  411. sky/dashboard/out/_next/static/chunks/pages/clusters-469814d711d63b1b.js +0 -1
  412. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js +0 -11
  413. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js +0 -16
  414. sky/dashboard/out/_next/static/chunks/pages/jobs-1f70d9faa564804f.js +0 -1
  415. sky/dashboard/out/_next/static/chunks/pages/users-018bf31cda52e11b.js +0 -1
  416. sky/dashboard/out/_next/static/chunks/pages/volumes-739726d6b823f532.js +0 -1
  417. sky/dashboard/out/_next/static/chunks/webpack-4fe903277b57b523.js +0 -1
  418. sky/dashboard/out/_next/static/css/4614e06482d7309e.css +0 -3
  419. sky/dashboard/out/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js +0 -1
  420. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  421. sky/utils/kubernetes/cleanup-tunnel.sh +0 -62
  422. sky/utils/kubernetes/deploy_remote_cluster.py +0 -1299
  423. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  424. skypilot_nightly-1.0.0.dev20250905.dist-info/RECORD +0 -547
  425. skypilot_nightly-1.0.0.dev20250905.dist-info/top_level.txt +0 -1
  426. /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → KYAhEFa3FTfq4JyKVgo-s}/_ssgManifest.js +0 -0
  427. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/WHEEL +0 -0
  428. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/entry_points.txt +0 -0
  429. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,6 @@
3
3
  This module contains a set of rest api functions accessing SCP Open-API.
4
4
  """
5
5
  import base64
6
- import datetime
7
6
  from functools import wraps
8
7
  import hashlib
9
8
  import hmac
@@ -171,15 +170,18 @@ class SCPClient:
171
170
  self.secret_key = self._credentials['secret_key']
172
171
  self.project_id = self._credentials['project_id']
173
172
  self.client_type = 'OpenApi'
174
- self.timestamp = ''
175
- self.signature = ''
176
-
177
- self.headers = {
178
- 'X-Cmp-AccessKey': f'{self.access_key}',
179
- 'X-Cmp-ClientType': f'{self.client_type}',
180
- 'X-Cmp-ProjectId': f'{self.project_id}',
181
- 'X-Cmp-Timestamp': f'{self.timestamp}',
182
- 'X-Cmp-Signature': f'{self.signature}'
173
+
174
+ def _signed_headers(self, method: str, url: str) -> dict:
175
+ timestamp = str(int(time.time() * 1000))
176
+ signature = self.get_signature(method=method,
177
+ url=url,
178
+ timestamp=timestamp)
179
+ return {
180
+ 'X-Cmp-AccessKey': self.access_key,
181
+ 'X-Cmp-ClientType': self.client_type,
182
+ 'X-Cmp-ProjectId': self.project_id,
183
+ 'X-Cmp-Timestamp': timestamp,
184
+ 'X-Cmp-Signature': signature,
183
185
  }
184
186
 
185
187
  def create_instance(self, instance_config):
@@ -190,10 +192,8 @@ class SCPClient:
190
192
  @_retry
191
193
  def _get(self, url, contents_key='contents'):
192
194
  method = 'GET'
193
- self.set_timestamp()
194
- self.set_signature(url=url, method=method)
195
-
196
- response = requests.get(url, headers=self.headers)
195
+ headers = self._signed_headers(method, url)
196
+ response = requests.get(url, headers=headers)
197
197
  raise_scp_error(response)
198
198
  if contents_key is not None:
199
199
  return response.json().get(contents_key, [])
@@ -203,26 +203,19 @@ class SCPClient:
203
203
  @_retry
204
204
  def _post(self, url, request_body):
205
205
  method = 'POST'
206
- self.set_timestamp()
207
- self.set_signature(url=url, method=method)
208
-
209
- response = requests.post(url, json=request_body, headers=self.headers)
210
-
206
+ headers = self._signed_headers(method, url)
207
+ response = requests.post(url, json=request_body, headers=headers)
211
208
  raise_scp_error(response)
212
209
  return response.json()
213
210
 
214
211
  @_retry
215
212
  def _delete(self, url, request_body=None):
216
213
  method = 'DELETE'
217
- self.set_timestamp()
218
- self.set_signature(url=url, method=method)
214
+ headers = self._signed_headers(method, url)
219
215
  if request_body:
220
- response = requests.delete(url,
221
- json=request_body,
222
- headers=self.headers)
223
-
216
+ response = requests.delete(url, json=request_body, headers=headers)
224
217
  else:
225
- response = requests.delete(url, headers=self.headers)
218
+ response = requests.delete(url, headers=headers)
226
219
  raise_scp_error(response)
227
220
  return response.json()
228
221
 
@@ -252,12 +245,22 @@ class SCPClient:
252
245
  return True
253
246
 
254
247
  def add_security_group_rule(self, sg_id, direction,
255
- ports: Optional[List[str]]):
248
+ ports: Optional[List[str]],
249
+ cnt: Optional[int]) -> None:
256
250
  if ports is None:
257
251
  if direction == 'IN':
258
- ports = ['22']
252
+ if cnt == 1:
253
+ ports = ['22']
254
+ else:
255
+ ports = ['22', '6380', '8076', '10001', '11001-11200']
259
256
  else:
260
- ports = ['21', '22', '80', '443']
257
+ if cnt == 1:
258
+ ports = ['21', '22', '80', '443']
259
+ else:
260
+ ports = [
261
+ '21', '22', '80', '443', '6380', '8076', '10001',
262
+ '11001-11200'
263
+ ]
261
264
  services = []
262
265
  for port in ports:
263
266
  services.append({'serviceType': 'TCP', 'serviceValue': port})
@@ -273,7 +276,9 @@ class SCPClient:
273
276
  target_address: ['0.0.0.0/0'],
274
277
  'ruleDescription': 'sky security group rule'
275
278
  }
276
- return self._post(url, request_body)
279
+ self._post(url, request_body)
280
+ else:
281
+ return None
277
282
 
278
283
  def _firewall_rule_not_exist(self, firewall_id, internal_ip, direction,
279
284
  ports):
@@ -293,12 +298,22 @@ class SCPClient:
293
298
  return False
294
299
  return True
295
300
 
296
- def add_firewall_rule(self, firewall_id, internal_ip, direction, ports):
301
+ def add_firewall_rule(self, firewall_id, internal_ip, direction,
302
+ ports: Optional[List[str]], cnt: Optional[int]):
297
303
  if ports is None:
298
304
  if direction == 'IN':
299
- ports = ['22']
305
+ if cnt == 1:
306
+ ports = ['22']
307
+ else:
308
+ ports = ['22', '6380', '8076', '10001', '11001-11200']
300
309
  else:
301
- ports = ['21', '22', '80', '443']
310
+ if cnt == 1:
311
+ ports = ['21', '22', '80', '443']
312
+ else:
313
+ ports = [
314
+ '21', '22', '80', '443', '6380', '8076', '10001',
315
+ '11001-11200'
316
+ ]
302
317
  services = []
303
318
  for port in ports:
304
319
  services.append({'serviceType': 'TCP', 'serviceValue': port})
@@ -322,6 +337,8 @@ class SCPClient:
322
337
  'ruleDescription': 'sky firewall rule'
323
338
  }
324
339
  return self._post(url, request_body)
340
+ else:
341
+ return None
325
342
 
326
343
  def terminate_instance(self, instance_id):
327
344
  url = f'{API_ENDPOINT}/virtual-server/v2/virtual-servers/{instance_id}'
@@ -334,12 +351,19 @@ class SCPClient:
334
351
 
335
352
  def get_catalog(self) -> Dict[str, Any]:
336
353
  """List offered instances and their availability."""
337
- response = requests.get(f'{API_ENDPOINT}/instance-types',
338
- headers=self.headers)
354
+ url = f'{API_ENDPOINT}/instance-types'
355
+ headers = self._signed_headers('GET', url)
356
+ response = requests.get(url, headers=headers)
339
357
  raise_scp_error(response)
340
358
  return response.json().get('data', [])
341
359
 
342
- def get_signature(self, method: str, url: str) -> str:
360
+ def get_signature(self,
361
+ method: str,
362
+ url: str,
363
+ timestamp: Optional[str] = None) -> str:
364
+ if timestamp is None:
365
+ timestamp = str(int(time.time() * 1000))
366
+
343
367
  url_info = parse.urlsplit(url)
344
368
  url = (f'{url_info.scheme}://{url_info.netloc}'
345
369
  f'{parse.quote(url_info.path)}')
@@ -349,7 +373,7 @@ class SCPClient:
349
373
  parse.parse_qs(url_info.query).items()))
350
374
  url = f'{url}?{parse.urlencode(enc_params)}'
351
375
 
352
- message = method + url + self.timestamp \
376
+ message = method + url + timestamp \
353
377
  + self.access_key + self.project_id + self.client_type
354
378
  message = bytes(message, 'utf-8')
355
379
  secret = bytes(self.secret_key, 'utf-8')
@@ -360,19 +384,6 @@ class SCPClient:
360
384
 
361
385
  return str(signature)
362
386
 
363
- def set_timestamp(self) -> None:
364
- self.timestamp = str(
365
- int(
366
- round(
367
- datetime.datetime.timestamp(datetime.datetime.now() -
368
- datetime.timedelta(minutes=1)) *
369
- 1000)))
370
- self.headers['X-Cmp-Timestamp'] = self.timestamp
371
-
372
- def set_signature(self, method: str, url: str) -> None:
373
- self.signature = self.get_signature(url=url, method=method)
374
- self.headers['X-Cmp-Signature'] = self.signature
375
-
376
387
  def get_nic(self, instance_id) -> List[dict]:
377
388
  url = f'{API_ENDPOINT}/virtual-server/v2/virtual-servers/{instance_id}/nics' # pylint: disable=line-too-long
378
389
  return self._get(url)
sky/clouds/vast.py CHANGED
@@ -1,10 +1,13 @@
1
1
  """ Vast Cloud. """
2
2
 
3
+ import os
3
4
  import typing
4
5
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
6
 
6
7
  from sky import catalog
7
8
  from sky import clouds
9
+ from sky import skypilot_config
10
+ from sky.adaptors import common
8
11
  from sky.utils import registry
9
12
  from sky.utils import resources_utils
10
13
 
@@ -12,6 +15,8 @@ if typing.TYPE_CHECKING:
12
15
  from sky import resources as resources_lib
13
16
  from sky.utils import volume as volume_lib
14
17
 
18
+ _CREDENTIAL_PATH = '~/.config/vastai/vast_api_key'
19
+
15
20
 
16
21
  @registry.CLOUD_REGISTRY.register
17
22
  class Vast(clouds.Cloud):
@@ -51,7 +56,9 @@ class Vast(clouds.Cloud):
51
56
 
52
57
  @classmethod
53
58
  def _unsupported_features_for_resources(
54
- cls, resources: 'resources_lib.Resources'
59
+ cls,
60
+ resources: 'resources_lib.Resources',
61
+ region: Optional[str] = None,
55
62
  ) -> Dict[clouds.CloudImplementationFeatures, str]:
56
63
  """The features not supported based on the resources provided.
57
64
 
@@ -70,10 +77,15 @@ class Vast(clouds.Cloud):
70
77
  return cls._MAX_CLUSTER_NAME_LEN_LIMIT
71
78
 
72
79
  @classmethod
73
- def regions_with_offering(cls, instance_type: str,
74
- accelerators: Optional[Dict[str, int]],
75
- use_spot: bool, region: Optional[str],
76
- zone: Optional[str]) -> List[clouds.Region]:
80
+ def regions_with_offering(
81
+ cls,
82
+ instance_type: str,
83
+ accelerators: Optional[Dict[str, int]],
84
+ use_spot: bool,
85
+ region: Optional[str],
86
+ zone: Optional[str],
87
+ resources: Optional['resources_lib.Resources'] = None,
88
+ ) -> List[clouds.Region]:
77
89
  assert zone is None, 'Vast does not support zones.'
78
90
  del accelerators, zone # unused
79
91
  regions = catalog.get_region_zones_for_instance_type(
@@ -185,11 +197,20 @@ class Vast(clouds.Cloud):
185
197
  else:
186
198
  image_id = resources.image_id[resources.region]
187
199
 
200
+ secure_only = skypilot_config.get_effective_region_config(
201
+ cloud='vast',
202
+ region=region.name,
203
+ keys=('secure_only',),
204
+ default_value=False,
205
+ override_configs=resources.cluster_config_overrides,
206
+ )
207
+
188
208
  return {
189
209
  'instance_type': resources.instance_type,
190
210
  'custom_resources': custom_resources,
191
211
  'region': region.name,
192
212
  'image_id': image_id,
213
+ 'secure_only': secure_only,
193
214
  }
194
215
 
195
216
  def _get_feasible_launchable_resources(
@@ -253,32 +274,27 @@ class Vast(clouds.Cloud):
253
274
  def _check_compute_credentials(
254
275
  cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
255
276
  """Checks if the user has valid credentials for
256
- Vast's compute service. """
257
- try:
258
- import vastai_sdk as _vast # pylint: disable=import-outside-toplevel
259
- vast = _vast.VastAI()
260
-
261
- # We only support file pased credential passing
262
- if vast.creds_source != 'FILE':
263
- return False, (
264
- 'error \n' # First line is indented by 4 spaces
265
- ' Credentials can be set up by running: \n'
266
- ' $ pip install vastai\n'
267
- ' $ mkdir -p ~/.config/vastai\n'
268
- ' $ echo [key] > ~/.config/vastai/vast_api_key\n'
269
- ' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
270
- )
277
+ Vast's compute service."""
278
+
279
+ dependency_error_msg = ('Failed to import vast. '
280
+ 'To install, run: pip install skypilot[vast]')
281
+ if not common.can_import_modules(['vastai_sdk']):
282
+ return False, dependency_error_msg
271
283
 
272
- return True, None
284
+ if not os.path.exists(os.path.expanduser(_CREDENTIAL_PATH)):
285
+ return False, (
286
+ 'error \n' # First line is indented by 4 spaces
287
+ ' Credentials can be set up by running: \n'
288
+ ' $ pip install vastai\n'
289
+ ' $ mkdir -p ~/.config/vastai\n'
290
+ f' $ echo [key] > {_CREDENTIAL_PATH}\n'
291
+ ' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
292
+ )
273
293
 
274
- except ImportError:
275
- return False, ('Failed to import vast. '
276
- 'To install, run: pip install skypilot[vast]')
294
+ return True, None
277
295
 
278
296
  def get_credential_file_mounts(self) -> Dict[str, str]:
279
- return {
280
- '~/.config/vastai/vast_api_key': '~/.config/vastai/vast_api_key'
281
- }
297
+ return {f'{_CREDENTIAL_PATH}': f'{_CREDENTIAL_PATH}'}
282
298
 
283
299
  @classmethod
284
300
  def get_user_identities(cls) -> Optional[List[List[str]]]:
sky/clouds/vsphere.py CHANGED
@@ -1,5 +1,4 @@
1
1
  """Vsphere cloud implementation."""
2
- import subprocess
3
2
  import typing
4
3
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
4
 
@@ -9,7 +8,6 @@ from sky.adaptors import common as adaptors_common
9
8
  from sky.provision.vsphere import vsphere_utils
10
9
  from sky.provision.vsphere.vsphere_utils import get_vsphere_credentials
11
10
  from sky.provision.vsphere.vsphere_utils import initialize_vsphere_data
12
- from sky.utils import common_utils
13
11
  from sky.utils import registry
14
12
  from sky.utils import resources_utils
15
13
 
@@ -75,7 +73,9 @@ class Vsphere(clouds.Cloud):
75
73
 
76
74
  @classmethod
77
75
  def _unsupported_features_for_resources(
78
- cls, resources: 'resources_lib.Resources'
76
+ cls,
77
+ resources: 'resources_lib.Resources',
78
+ region: Optional[str] = None,
79
79
  ) -> Dict[clouds.CloudImplementationFeatures, str]:
80
80
  features = cls._CLOUD_UNSUPPORTED_FEATURES
81
81
  return features
@@ -92,6 +92,7 @@ class Vsphere(clouds.Cloud):
92
92
  use_spot: bool,
93
93
  region: Optional[str],
94
94
  zone: Optional[str],
95
+ resources: Optional['resources_lib.Resources'] = None,
95
96
  ) -> List[clouds.Region]:
96
97
  del accelerators, zone # unused
97
98
  regions = catalog.get_region_zones_for_instance_type(
@@ -278,19 +279,16 @@ class Vsphere(clouds.Cloud):
278
279
  cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
279
280
  """Checks if the user has access credentials to
280
281
  vSphere's compute service."""
281
-
282
- try:
283
- # pylint: disable=import-outside-toplevel,unused-import
284
- # Check pyVmomi installation.
285
- import pyVmomi
286
- except (ImportError, subprocess.CalledProcessError) as e:
287
- return False, (
288
- 'vSphere dependencies are not installed. '
289
- 'Run the following commands:'
290
- f'\n{cls._INDENT_PREFIX} $ pip install skypilot[vSphere]'
291
- f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
292
- 'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
293
- f'{common_utils.format_exception(e, use_bracket=True)}')
282
+ dependency_error_msg = (
283
+ 'vSphere dependencies are not installed. '
284
+ 'Run the following commands:'
285
+ f'\n{cls._INDENT_PREFIX} $ pip install skypilot[vSphere]'
286
+ f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
287
+ 'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
288
+ )
289
+ # Check pyVmomi installation.
290
+ if not adaptors_common.can_import_modules(['pyVmomi']):
291
+ return False, dependency_error_msg
294
292
 
295
293
  required_keys = ['name', 'username', 'password', 'clusters']
296
294
  skip_key = 'skip_verification'