skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20251203__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 (397) hide show
  1. sky/__init__.py +10 -2
  2. sky/adaptors/aws.py +81 -16
  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/admin_policy.py +20 -0
  14. sky/authentication.py +157 -263
  15. sky/backends/__init__.py +3 -2
  16. sky/backends/backend.py +11 -3
  17. sky/backends/backend_utils.py +588 -184
  18. sky/backends/cloud_vm_ray_backend.py +1088 -904
  19. sky/backends/local_docker_backend.py +9 -5
  20. sky/backends/task_codegen.py +633 -0
  21. sky/backends/wheel_utils.py +18 -0
  22. sky/catalog/__init__.py +8 -0
  23. sky/catalog/aws_catalog.py +4 -0
  24. sky/catalog/common.py +19 -1
  25. sky/catalog/data_fetchers/fetch_aws.py +102 -80
  26. sky/catalog/data_fetchers/fetch_gcp.py +30 -3
  27. sky/catalog/data_fetchers/fetch_nebius.py +9 -6
  28. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  29. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  30. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  31. sky/catalog/kubernetes_catalog.py +24 -28
  32. sky/catalog/primeintellect_catalog.py +95 -0
  33. sky/catalog/runpod_catalog.py +5 -1
  34. sky/catalog/seeweb_catalog.py +184 -0
  35. sky/catalog/shadeform_catalog.py +165 -0
  36. sky/check.py +73 -43
  37. sky/client/cli/command.py +675 -412
  38. sky/client/cli/flags.py +4 -2
  39. sky/{volumes/utils.py → client/cli/table_utils.py} +111 -13
  40. sky/client/cli/utils.py +79 -0
  41. sky/client/common.py +12 -2
  42. sky/client/sdk.py +132 -63
  43. sky/client/sdk_async.py +34 -33
  44. sky/cloud_stores.py +82 -3
  45. sky/clouds/__init__.py +6 -0
  46. sky/clouds/aws.py +337 -129
  47. sky/clouds/azure.py +24 -18
  48. sky/clouds/cloud.py +40 -13
  49. sky/clouds/cudo.py +16 -13
  50. sky/clouds/do.py +9 -7
  51. sky/clouds/fluidstack.py +12 -5
  52. sky/clouds/gcp.py +14 -7
  53. sky/clouds/hyperbolic.py +12 -5
  54. sky/clouds/ibm.py +12 -5
  55. sky/clouds/kubernetes.py +80 -45
  56. sky/clouds/lambda_cloud.py +12 -5
  57. sky/clouds/nebius.py +23 -9
  58. sky/clouds/oci.py +19 -12
  59. sky/clouds/paperspace.py +4 -1
  60. sky/clouds/primeintellect.py +317 -0
  61. sky/clouds/runpod.py +85 -24
  62. sky/clouds/scp.py +12 -8
  63. sky/clouds/seeweb.py +477 -0
  64. sky/clouds/shadeform.py +400 -0
  65. sky/clouds/ssh.py +4 -2
  66. sky/clouds/utils/scp_utils.py +61 -50
  67. sky/clouds/vast.py +33 -27
  68. sky/clouds/vsphere.py +14 -16
  69. sky/core.py +174 -165
  70. sky/dashboard/out/404.html +1 -1
  71. sky/dashboard/out/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js +1 -0
  72. sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
  73. sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
  74. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  75. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  76. sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
  77. sky/dashboard/out/_next/static/chunks/3294.20a8540fe697d5ee.js +1 -0
  78. sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
  79. sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-7b45f9fbb6308557.js} +1 -1
  80. sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
  81. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  82. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  83. sky/dashboard/out/_next/static/chunks/6856-8f27d1c10c98def8.js +1 -0
  84. sky/dashboard/out/_next/static/chunks/6990-9146207c4567fdfd.js +1 -0
  85. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  86. sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
  87. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  88. sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
  89. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  90. sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
  91. sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
  92. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  93. sky/dashboard/out/_next/static/chunks/pages/{_app-ce361c6959bc2001.js → _app-bde01e4a2beec258.js} +1 -1
  94. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-792db96d918c98c9.js +16 -0
  95. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-abfcac9c137aa543.js +1 -0
  96. sky/dashboard/out/_next/static/chunks/pages/clusters-ee39056f9851a3ff.js +1 -0
  97. sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-c0b5935149902e6f.js} +1 -1
  98. sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-aed0ea19df7cf961.js} +1 -1
  99. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-d66997e2bfc837cf.js +16 -0
  100. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-9faf940b253e3e06.js +21 -0
  101. sky/dashboard/out/_next/static/chunks/pages/jobs-2072b48b617989c9.js +1 -0
  102. sky/dashboard/out/_next/static/chunks/pages/users-f42674164aa73423.js +1 -0
  103. sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
  104. sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-84a40f8c7c627fe4.js} +1 -1
  105. sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-531b2f8c4bf89f82.js} +1 -1
  106. sky/dashboard/out/_next/static/chunks/webpack-64e05f17bf2cf8ce.js +1 -0
  107. sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
  108. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  109. sky/dashboard/out/clusters/[cluster].html +1 -1
  110. sky/dashboard/out/clusters.html +1 -1
  111. sky/dashboard/out/config.html +1 -1
  112. sky/dashboard/out/index.html +1 -1
  113. sky/dashboard/out/infra/[context].html +1 -1
  114. sky/dashboard/out/infra.html +1 -1
  115. sky/dashboard/out/jobs/[job].html +1 -1
  116. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  117. sky/dashboard/out/jobs.html +1 -1
  118. sky/dashboard/out/users.html +1 -1
  119. sky/dashboard/out/volumes.html +1 -1
  120. sky/dashboard/out/workspace/new.html +1 -1
  121. sky/dashboard/out/workspaces/[name].html +1 -1
  122. sky/dashboard/out/workspaces.html +1 -1
  123. sky/data/data_utils.py +92 -1
  124. sky/data/mounting_utils.py +162 -29
  125. sky/data/storage.py +200 -19
  126. sky/data/storage_utils.py +10 -45
  127. sky/exceptions.py +18 -7
  128. sky/execution.py +74 -31
  129. sky/global_user_state.py +605 -191
  130. sky/jobs/__init__.py +2 -0
  131. sky/jobs/client/sdk.py +101 -4
  132. sky/jobs/client/sdk_async.py +31 -5
  133. sky/jobs/constants.py +15 -8
  134. sky/jobs/controller.py +726 -284
  135. sky/jobs/file_content_utils.py +128 -0
  136. sky/jobs/log_gc.py +193 -0
  137. sky/jobs/recovery_strategy.py +250 -100
  138. sky/jobs/scheduler.py +271 -173
  139. sky/jobs/server/core.py +367 -114
  140. sky/jobs/server/server.py +81 -35
  141. sky/jobs/server/utils.py +89 -35
  142. sky/jobs/state.py +1498 -620
  143. sky/jobs/utils.py +771 -306
  144. sky/logs/agent.py +40 -5
  145. sky/logs/aws.py +9 -19
  146. sky/metrics/utils.py +282 -39
  147. sky/optimizer.py +1 -1
  148. sky/provision/__init__.py +37 -1
  149. sky/provision/aws/config.py +34 -13
  150. sky/provision/aws/instance.py +5 -2
  151. sky/provision/azure/instance.py +5 -3
  152. sky/provision/common.py +2 -0
  153. sky/provision/cudo/instance.py +4 -3
  154. sky/provision/do/instance.py +4 -3
  155. sky/provision/docker_utils.py +97 -26
  156. sky/provision/fluidstack/instance.py +6 -5
  157. sky/provision/gcp/config.py +6 -1
  158. sky/provision/gcp/instance.py +4 -2
  159. sky/provision/hyperbolic/instance.py +4 -2
  160. sky/provision/instance_setup.py +66 -20
  161. sky/provision/kubernetes/__init__.py +2 -0
  162. sky/provision/kubernetes/config.py +7 -44
  163. sky/provision/kubernetes/constants.py +0 -1
  164. sky/provision/kubernetes/instance.py +609 -213
  165. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  166. sky/provision/kubernetes/network.py +12 -8
  167. sky/provision/kubernetes/network_utils.py +8 -25
  168. sky/provision/kubernetes/utils.py +382 -418
  169. sky/provision/kubernetes/volume.py +150 -18
  170. sky/provision/lambda_cloud/instance.py +16 -13
  171. sky/provision/nebius/instance.py +6 -2
  172. sky/provision/nebius/utils.py +103 -86
  173. sky/provision/oci/instance.py +4 -2
  174. sky/provision/paperspace/instance.py +4 -3
  175. sky/provision/primeintellect/__init__.py +10 -0
  176. sky/provision/primeintellect/config.py +11 -0
  177. sky/provision/primeintellect/instance.py +454 -0
  178. sky/provision/primeintellect/utils.py +398 -0
  179. sky/provision/provisioner.py +30 -9
  180. sky/provision/runpod/__init__.py +2 -0
  181. sky/provision/runpod/instance.py +4 -3
  182. sky/provision/runpod/volume.py +69 -13
  183. sky/provision/scp/instance.py +307 -130
  184. sky/provision/seeweb/__init__.py +11 -0
  185. sky/provision/seeweb/config.py +13 -0
  186. sky/provision/seeweb/instance.py +812 -0
  187. sky/provision/shadeform/__init__.py +11 -0
  188. sky/provision/shadeform/config.py +12 -0
  189. sky/provision/shadeform/instance.py +351 -0
  190. sky/provision/shadeform/shadeform_utils.py +83 -0
  191. sky/provision/vast/instance.py +5 -3
  192. sky/provision/volume.py +164 -0
  193. sky/provision/vsphere/common/ssl_helper.py +1 -1
  194. sky/provision/vsphere/common/vapiconnect.py +2 -1
  195. sky/provision/vsphere/common/vim_utils.py +3 -2
  196. sky/provision/vsphere/instance.py +8 -6
  197. sky/provision/vsphere/vsphere_utils.py +8 -1
  198. sky/resources.py +11 -3
  199. sky/schemas/api/responses.py +107 -6
  200. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  201. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  202. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  203. sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
  204. sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
  205. sky/schemas/db/serve_state/002_yaml_content.py +34 -0
  206. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  207. sky/schemas/db/spot_jobs/002_cluster_pool.py +3 -3
  208. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  209. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  210. sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
  211. sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
  212. sky/schemas/generated/jobsv1_pb2.py +86 -0
  213. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  214. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  215. sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
  216. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  217. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  218. sky/schemas/generated/servev1_pb2.py +58 -0
  219. sky/schemas/generated/servev1_pb2.pyi +115 -0
  220. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  221. sky/serve/autoscalers.py +2 -0
  222. sky/serve/client/impl.py +55 -21
  223. sky/serve/constants.py +4 -3
  224. sky/serve/controller.py +17 -11
  225. sky/serve/load_balancing_policies.py +1 -1
  226. sky/serve/replica_managers.py +219 -142
  227. sky/serve/serve_rpc_utils.py +179 -0
  228. sky/serve/serve_state.py +63 -54
  229. sky/serve/serve_utils.py +145 -109
  230. sky/serve/server/core.py +46 -25
  231. sky/serve/server/impl.py +311 -162
  232. sky/serve/server/server.py +21 -19
  233. sky/serve/service.py +84 -68
  234. sky/serve/service_spec.py +45 -7
  235. sky/server/auth/loopback.py +38 -0
  236. sky/server/auth/oauth2_proxy.py +12 -7
  237. sky/server/common.py +47 -24
  238. sky/server/config.py +62 -28
  239. sky/server/constants.py +9 -1
  240. sky/server/daemons.py +109 -38
  241. sky/server/metrics.py +76 -96
  242. sky/server/middleware_utils.py +166 -0
  243. sky/server/requests/executor.py +381 -145
  244. sky/server/requests/payloads.py +71 -18
  245. sky/server/requests/preconditions.py +15 -13
  246. sky/server/requests/request_names.py +121 -0
  247. sky/server/requests/requests.py +507 -157
  248. sky/server/requests/serializers/decoders.py +48 -17
  249. sky/server/requests/serializers/encoders.py +85 -20
  250. sky/server/requests/threads.py +117 -0
  251. sky/server/rest.py +116 -24
  252. sky/server/server.py +420 -172
  253. sky/server/stream_utils.py +219 -45
  254. sky/server/uvicorn.py +30 -19
  255. sky/setup_files/MANIFEST.in +6 -1
  256. sky/setup_files/alembic.ini +8 -0
  257. sky/setup_files/dependencies.py +62 -19
  258. sky/setup_files/setup.py +44 -44
  259. sky/sky_logging.py +13 -5
  260. sky/skylet/attempt_skylet.py +106 -24
  261. sky/skylet/configs.py +3 -1
  262. sky/skylet/constants.py +111 -26
  263. sky/skylet/events.py +64 -10
  264. sky/skylet/job_lib.py +141 -104
  265. sky/skylet/log_lib.py +233 -5
  266. sky/skylet/log_lib.pyi +40 -2
  267. sky/skylet/providers/ibm/node_provider.py +12 -8
  268. sky/skylet/providers/ibm/vpc_provider.py +13 -12
  269. sky/skylet/runtime_utils.py +21 -0
  270. sky/skylet/services.py +524 -0
  271. sky/skylet/skylet.py +22 -1
  272. sky/skylet/subprocess_daemon.py +104 -29
  273. sky/skypilot_config.py +99 -79
  274. sky/ssh_node_pools/server.py +9 -8
  275. sky/task.py +221 -104
  276. sky/templates/aws-ray.yml.j2 +1 -0
  277. sky/templates/azure-ray.yml.j2 +1 -0
  278. sky/templates/cudo-ray.yml.j2 +1 -0
  279. sky/templates/do-ray.yml.j2 +1 -0
  280. sky/templates/fluidstack-ray.yml.j2 +1 -0
  281. sky/templates/gcp-ray.yml.j2 +1 -0
  282. sky/templates/hyperbolic-ray.yml.j2 +1 -0
  283. sky/templates/ibm-ray.yml.j2 +2 -1
  284. sky/templates/jobs-controller.yaml.j2 +3 -0
  285. sky/templates/kubernetes-ray.yml.j2 +196 -55
  286. sky/templates/lambda-ray.yml.j2 +1 -0
  287. sky/templates/nebius-ray.yml.j2 +3 -0
  288. sky/templates/oci-ray.yml.j2 +1 -0
  289. sky/templates/paperspace-ray.yml.j2 +1 -0
  290. sky/templates/primeintellect-ray.yml.j2 +72 -0
  291. sky/templates/runpod-ray.yml.j2 +1 -0
  292. sky/templates/scp-ray.yml.j2 +1 -0
  293. sky/templates/seeweb-ray.yml.j2 +171 -0
  294. sky/templates/shadeform-ray.yml.j2 +73 -0
  295. sky/templates/vast-ray.yml.j2 +1 -0
  296. sky/templates/vsphere-ray.yml.j2 +1 -0
  297. sky/templates/websocket_proxy.py +188 -43
  298. sky/usage/usage_lib.py +16 -4
  299. sky/users/permission.py +60 -43
  300. sky/utils/accelerator_registry.py +6 -3
  301. sky/utils/admin_policy_utils.py +18 -5
  302. sky/utils/annotations.py +22 -0
  303. sky/utils/asyncio_utils.py +78 -0
  304. sky/utils/atomic.py +1 -1
  305. sky/utils/auth_utils.py +153 -0
  306. sky/utils/cli_utils/status_utils.py +12 -7
  307. sky/utils/cluster_utils.py +28 -6
  308. sky/utils/command_runner.py +88 -27
  309. sky/utils/command_runner.pyi +36 -3
  310. sky/utils/common.py +3 -1
  311. sky/utils/common_utils.py +37 -4
  312. sky/utils/config_utils.py +1 -14
  313. sky/utils/context.py +127 -40
  314. sky/utils/context_utils.py +73 -18
  315. sky/utils/controller_utils.py +229 -70
  316. sky/utils/db/db_utils.py +95 -18
  317. sky/utils/db/kv_cache.py +149 -0
  318. sky/utils/db/migration_utils.py +24 -7
  319. sky/utils/env_options.py +4 -0
  320. sky/utils/git.py +559 -1
  321. sky/utils/kubernetes/create_cluster.sh +15 -30
  322. sky/utils/kubernetes/delete_cluster.sh +10 -7
  323. sky/utils/kubernetes/{deploy_remote_cluster.py → deploy_ssh_node_pools.py} +258 -380
  324. sky/utils/kubernetes/generate_kind_config.py +6 -66
  325. sky/utils/kubernetes/gpu_labeler.py +13 -3
  326. sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
  327. sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
  328. sky/utils/kubernetes/kubernetes_deploy_utils.py +213 -194
  329. sky/utils/kubernetes/rsync_helper.sh +11 -3
  330. sky/utils/kubernetes_enums.py +7 -15
  331. sky/utils/lock_events.py +4 -4
  332. sky/utils/locks.py +128 -31
  333. sky/utils/log_utils.py +0 -319
  334. sky/utils/resource_checker.py +13 -10
  335. sky/utils/resources_utils.py +53 -29
  336. sky/utils/rich_utils.py +8 -4
  337. sky/utils/schemas.py +107 -52
  338. sky/utils/subprocess_utils.py +17 -4
  339. sky/utils/thread_utils.py +91 -0
  340. sky/utils/timeline.py +2 -1
  341. sky/utils/ux_utils.py +35 -1
  342. sky/utils/volume.py +88 -4
  343. sky/utils/yaml_utils.py +9 -0
  344. sky/volumes/client/sdk.py +48 -10
  345. sky/volumes/server/core.py +59 -22
  346. sky/volumes/server/server.py +46 -17
  347. sky/volumes/volume.py +54 -42
  348. sky/workspaces/core.py +57 -21
  349. sky/workspaces/server.py +13 -12
  350. sky_templates/README.md +3 -0
  351. sky_templates/__init__.py +3 -0
  352. sky_templates/ray/__init__.py +0 -0
  353. sky_templates/ray/start_cluster +183 -0
  354. sky_templates/ray/stop_cluster +75 -0
  355. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/METADATA +331 -65
  356. skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
  357. skypilot_nightly-1.0.0.dev20251203.dist-info/top_level.txt +2 -0
  358. sky/client/cli/git.py +0 -549
  359. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  360. sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
  361. sky/dashboard/out/_next/static/chunks/1836-37fede578e2da5f8.js +0 -40
  362. sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
  363. sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
  364. sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
  365. sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +0 -21
  366. sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +0 -10
  367. sky/dashboard/out/_next/static/chunks/4725.10f7a9a5d3ea8208.js +0 -1
  368. sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
  369. sky/dashboard/out/_next/static/chunks/6135-4b4d5e824b7f9d3c.js +0 -1
  370. sky/dashboard/out/_next/static/chunks/649.b9d7f7d10c1b8c53.js +0 -45
  371. sky/dashboard/out/_next/static/chunks/6856-dca7962af4814e1b.js +0 -1
  372. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  373. sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +0 -6
  374. sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +0 -18
  375. sky/dashboard/out/_next/static/chunks/7669.1f5d9a402bf5cc42.js +0 -36
  376. sky/dashboard/out/_next/static/chunks/8969-0be3036bf86f8256.js +0 -1
  377. sky/dashboard/out/_next/static/chunks/9025.c12318fb6a1a9093.js +0 -6
  378. sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
  379. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  380. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js +0 -16
  381. sky/dashboard/out/_next/static/chunks/pages/clusters-469814d711d63b1b.js +0 -1
  382. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js +0 -11
  383. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js +0 -16
  384. sky/dashboard/out/_next/static/chunks/pages/jobs-1f70d9faa564804f.js +0 -1
  385. sky/dashboard/out/_next/static/chunks/pages/users-018bf31cda52e11b.js +0 -1
  386. sky/dashboard/out/_next/static/chunks/pages/volumes-739726d6b823f532.js +0 -1
  387. sky/dashboard/out/_next/static/chunks/webpack-4fe903277b57b523.js +0 -1
  388. sky/dashboard/out/_next/static/css/4614e06482d7309e.css +0 -3
  389. sky/dashboard/out/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js +0 -1
  390. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  391. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  392. skypilot_nightly-1.0.0.dev20250905.dist-info/RECORD +0 -547
  393. skypilot_nightly-1.0.0.dev20250905.dist-info/top_level.txt +0 -1
  394. /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
  395. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +0 -0
  396. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
  397. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4fe903277b57b523.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-018bf31cda52e11b.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"mS-4qZPSkRuA1u-g2wQhg","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0748ce22df867032.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0748ce22df867032.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-64e05f17bf2cf8ce.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-bde01e4a2beec258.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-f42674164aa73423.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"96_E2yl3QAiIJGOYCkSpB","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4fe903277b57b523.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-739726d6b823f532.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"mS-4qZPSkRuA1u-g2wQhg","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0748ce22df867032.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0748ce22df867032.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-64e05f17bf2cf8ce.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-bde01e4a2beec258.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-b84b948ff357c43e.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"96_E2yl3QAiIJGOYCkSpB","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4fe903277b57b523.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"mS-4qZPSkRuA1u-g2wQhg","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0748ce22df867032.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0748ce22df867032.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-64e05f17bf2cf8ce.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-bde01e4a2beec258.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"96_E2yl3QAiIJGOYCkSpB","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4fe903277b57b523.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1836-37fede578e2da5f8.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-0be3036bf86f8256.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-408ed10b2f9fce17.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-86cabed5d4669ad0.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-943efc7aff0f0c06.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-af76bb06dbb3954f.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"mS-4qZPSkRuA1u-g2wQhg","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0748ce22df867032.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0748ce22df867032.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-64e05f17bf2cf8ce.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-bde01e4a2beec258.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-452f9d5cbdd2dc73.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-9146207c4567fdfd.js" defer=""></script><script src="/dashboard/_next/static/chunks/9353-cff34f7e773b2e2b.js" defer=""></script><script src="/dashboard/_next/static/chunks/2260-7703229c33c5ebd5.js" defer=""></script><script src="/dashboard/_next/static/chunks/3800-7b45f9fbb6308557.js" defer=""></script><script src="/dashboard/_next/static/chunks/7615-019513abc55b3b47.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-e6aa9ab418717c59.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-84a40f8c7c627fe4.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"96_E2yl3QAiIJGOYCkSpB","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4fe903277b57b523.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-7598c33a746cdc91.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/mS-4qZPSkRuA1u-g2wQhg/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"mS-4qZPSkRuA1u-g2wQhg","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0748ce22df867032.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0748ce22df867032.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-64e05f17bf2cf8ce.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-bde01e4a2beec258.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-531b2f8c4bf89f82.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/96_E2yl3QAiIJGOYCkSpB/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"96_E2yl3QAiIJGOYCkSpB","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/data/data_utils.py CHANGED
@@ -19,6 +19,7 @@ from sky import sky_logging
19
19
  from sky.adaptors import aws
20
20
  from sky.adaptors import azure
21
21
  from sky.adaptors import cloudflare
22
+ from sky.adaptors import coreweave
22
23
  from sky.adaptors import gcp
23
24
  from sky.adaptors import ibm
24
25
  from sky.adaptors import nebius
@@ -625,6 +626,7 @@ class Rclone:
625
626
  R2 = 'R2'
626
627
  AZURE = 'AZURE'
627
628
  NEBIUS = 'NEBIUS'
629
+ COREWEAVE = 'COREWEAVE'
628
630
 
629
631
  def get_profile_name(self, bucket_name: str) -> str:
630
632
  """Gets the Rclone profile name for a given bucket.
@@ -642,7 +644,8 @@ class Rclone:
642
644
  Rclone.RcloneStores.IBM: 'sky-ibm',
643
645
  Rclone.RcloneStores.R2: 'sky-r2',
644
646
  Rclone.RcloneStores.AZURE: 'sky-azure',
645
- Rclone.RcloneStores.NEBIUS: 'sky-nebius'
647
+ Rclone.RcloneStores.NEBIUS: 'sky-nebius',
648
+ Rclone.RcloneStores.COREWEAVE: 'sky-coreweave'
646
649
  }
647
650
  return f'{profile_prefix[self]}-{bucket_name}'
648
651
 
@@ -748,6 +751,25 @@ class Rclone:
748
751
  endpoint = {endpoint_url}
749
752
  acl = private
750
753
  """)
754
+ elif self is Rclone.RcloneStores.COREWEAVE:
755
+ coreweave_session = coreweave.session()
756
+ coreweave_credentials = coreweave.get_coreweave_credentials(
757
+ coreweave_session)
758
+ # Get endpoint URL from the client
759
+ endpoint_url = coreweave.get_endpoint()
760
+ access_key_id = coreweave_credentials.access_key
761
+ secret_access_key = coreweave_credentials.secret_key
762
+ config = textwrap.dedent(f"""\
763
+ [{rclone_profile_name}]
764
+ type = s3
765
+ provider = Other
766
+ access_key_id = {access_key_id}
767
+ secret_access_key = {secret_access_key}
768
+ endpoint = {endpoint_url}
769
+ region = auto
770
+ acl = private
771
+ force_path_style = false
772
+ """)
751
773
  else:
752
774
  with ux_utils.print_exception_no_traceback():
753
775
  raise NotImplementedError(
@@ -908,3 +930,72 @@ def split_oci_path(oci_path: str) -> Tuple[str, str]:
908
930
  bucket = path_parts.pop(0)
909
931
  key = '/'.join(path_parts)
910
932
  return bucket, key
933
+
934
+
935
+ def create_coreweave_client() -> Client:
936
+ """Create CoreWeave S3 client."""
937
+ return coreweave.client('s3')
938
+
939
+
940
+ def split_coreweave_path(coreweave_path: str) -> Tuple[str, str]:
941
+ """Splits CoreWeave Path into Bucket name and Relative Path to Bucket
942
+
943
+ Args:
944
+ coreweave_path: str; CoreWeave Path, e.g. cw://imagenet/train/
945
+ """
946
+ path_parts = coreweave_path.replace('cw://', '').split('/')
947
+ bucket = path_parts.pop(0)
948
+ key = '/'.join(path_parts)
949
+ return bucket, key
950
+
951
+
952
+ def verify_coreweave_bucket(name: str, retry: int = 0) -> bool:
953
+ """Verify CoreWeave bucket exists and is accessible.
954
+
955
+ Retries head_bucket operation up to retry times with 5 second intervals
956
+ to handle DNS propagation delays or temporary connectivity issues.
957
+ """
958
+ coreweave_client = create_coreweave_client()
959
+ max_retries = retry + 1 # 5s * (retry+1) = total seconds to retry
960
+ retry_count = 0
961
+
962
+ while retry_count < max_retries:
963
+ try:
964
+ coreweave_client.head_bucket(Bucket=name)
965
+ if retry_count > 0:
966
+ logger.debug(
967
+ f'Successfully verified bucket {name} after '
968
+ f'{retry_count} retries ({retry_count * 5} seconds)')
969
+ return True
970
+
971
+ except coreweave.botocore.exceptions.ClientError as e: # type: ignore[union-attr] # pylint: disable=line-too-long:
972
+ error_code = e.response['Error']['Code']
973
+ if error_code == '403':
974
+ logger.error(f'Access denied to bucket {name}')
975
+ return False
976
+ elif error_code == '404':
977
+ logger.debug(f'Bucket {name} does not exist')
978
+ else:
979
+ logger.debug(
980
+ f'Unexpected error checking CoreWeave bucket {name}: {e}')
981
+ except Exception as e: # pylint: disable=broad-except
982
+ logger.debug(
983
+ f'Unexpected error checking CoreWeave bucket {name}: {e}')
984
+
985
+ # Common retry logic for all transient errors
986
+ retry_count += 1
987
+ if retry_count < max_retries:
988
+ logger.debug(f'Error checking CoreWeave bucket {name} '
989
+ f'(attempt {retry_count}/{max_retries}). '
990
+ f'Retrying in 5 seconds...')
991
+ time.sleep(5)
992
+ else:
993
+ attempt_str = 'attempt'
994
+ if max_retries > 1:
995
+ attempt_str += 's'
996
+ logger.error(f'Failed to verify CoreWeave bucket {name} after '
997
+ f'{max_retries} {attempt_str}.')
998
+ return False
999
+
1000
+ # Should not reach here, but just in case
1001
+ return False
@@ -17,6 +17,16 @@ _TYPE_CACHE_TTL = '5s'
17
17
  _RENAME_DIR_LIMIT = 10000
18
18
  # https://github.com/GoogleCloudPlatform/gcsfuse/releases
19
19
  GCSFUSE_VERSION = '2.2.0'
20
+
21
+ # Some machines do not have fuse/fuse3 installed by default
22
+ # hence rclone will fail on these machines
23
+ FUSE3_INSTALL_CMD = ('(command -v fusermount3 > /dev/null 2>&1 || '
24
+ '((which apt-get > /dev/null 2>&1 && '
25
+ 'sudo apt-get update && sudo apt-get install -y fuse3) || '
26
+ '(which yum > /dev/null 2>&1 && '
27
+ 'sudo yum install -y fuse3) || '
28
+ 'true)) || true')
29
+
20
30
  # Creates a fusermount3 soft link on older (<22) Ubuntu systems to utilize
21
31
  # Rclone's mounting utility.
22
32
  FUSERMOUNT3_SOFT_LINK_CMD = ('[ ! -f /bin/fusermount3 ] && '
@@ -54,10 +64,10 @@ def get_rclone_install_cmd() -> str:
54
64
  f' && curl -O https://downloads.rclone.org/{RCLONE_VERSION}/rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.deb'
55
65
  f' && sudo dpkg -i rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.deb'
56
66
  f' && rm -f rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.deb)))'
57
- f' || (which rclone > /dev/null || (cd ~ > /dev/null'
67
+ f' || (which yum > /dev/null 2>&1 && (which rclone > /dev/null || (cd ~ > /dev/null'
58
68
  f' && curl -O https://downloads.rclone.org/{RCLONE_VERSION}/rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.rpm'
59
69
  f' && sudo yum --nogpgcheck install rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.rpm -y'
60
- f' && rm -f rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.rpm))')
70
+ f' && rm -f rclone-{RCLONE_VERSION}-linux-${{ARCH_SUFFIX}}.rpm)))')
61
71
  return install_cmd
62
72
 
63
73
 
@@ -94,6 +104,7 @@ def get_s3_mount_cmd(bucket_name: str,
94
104
  # Use rclone for ARM64 architectures since goofys doesn't support them
95
105
  arch_check = 'ARCH=$(uname -m) && '
96
106
  rclone_mount = (
107
+ f'{FUSE3_INSTALL_CMD} && '
97
108
  f'{FUSERMOUNT3_SOFT_LINK_CMD} && '
98
109
  f'rclone mount :s3:{bucket_name}{_bucket_sub_path} {mount_path} '
99
110
  # Have to add --s3-env-auth=true to allow rclone to access private
@@ -128,6 +139,7 @@ def get_nebius_mount_cmd(nebius_profile_name: str,
128
139
  # Use rclone for ARM64 architectures since goofys doesn't support them
129
140
  arch_check = 'ARCH=$(uname -m) && '
130
141
  rclone_mount = (
142
+ f'{FUSE3_INSTALL_CMD} && '
131
143
  f'{FUSERMOUNT3_SOFT_LINK_CMD} && '
132
144
  f'AWS_PROFILE={nebius_profile_name} '
133
145
  f'rclone mount :s3:{bucket_name}{_bucket_sub_path} {mount_path} '
@@ -148,6 +160,46 @@ def get_nebius_mount_cmd(nebius_profile_name: str,
148
160
  return mount_cmd
149
161
 
150
162
 
163
+ def get_coreweave_mount_cmd(cw_credentials_path: str,
164
+ coreweave_profile_name: str,
165
+ bucket_name: str,
166
+ endpoint_url: str,
167
+ mount_path: str,
168
+ _bucket_sub_path: Optional[str] = None) -> str:
169
+ """Returns a command to mount CoreWeave bucket"""
170
+ if _bucket_sub_path is None:
171
+ _bucket_sub_path = ''
172
+ else:
173
+ _bucket_sub_path = f':{_bucket_sub_path}'
174
+
175
+ # Use rclone for ARM64 architectures since goofys doesn't support them
176
+ arch_check = 'ARCH=$(uname -m) && '
177
+ rclone_mount = (
178
+ f'{FUSE3_INSTALL_CMD} && '
179
+ f'{FUSERMOUNT3_SOFT_LINK_CMD} && '
180
+ f'AWS_SHARED_CREDENTIALS_FILE={cw_credentials_path} '
181
+ f'AWS_PROFILE={coreweave_profile_name} '
182
+ f'rclone mount :s3:{bucket_name}{_bucket_sub_path} {mount_path} '
183
+ f'--s3-force-path-style=false '
184
+ f'--s3-endpoint {endpoint_url} --daemon --allow-other')
185
+ goofys_mount = (f'AWS_SHARED_CREDENTIALS_FILE={cw_credentials_path} '
186
+ f'AWS_PROFILE={coreweave_profile_name} {_GOOFYS_WRAPPER} '
187
+ '-o allow_other '
188
+ f'--stat-cache-ttl {_STAT_CACHE_TTL} '
189
+ f'--type-cache-ttl {_TYPE_CACHE_TTL} '
190
+ f'--subdomain '
191
+ f'--endpoint {endpoint_url} '
192
+ f'{bucket_name}{_bucket_sub_path} {mount_path}')
193
+
194
+ mount_cmd = (f'{arch_check}'
195
+ f'if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then '
196
+ f' {rclone_mount}; '
197
+ f'else '
198
+ f' {goofys_mount}; '
199
+ f'fi')
200
+ return mount_cmd
201
+
202
+
151
203
  def get_gcs_mount_install_cmd() -> str:
152
204
  """Returns a command to install GCS mount utility gcsfuse."""
153
205
  install_cmd = ('ARCH=$(uname -m) && '
@@ -185,27 +237,72 @@ def get_gcs_mount_cmd(bucket_name: str,
185
237
  def get_az_mount_install_cmd() -> str:
186
238
  """Returns a command to install AZ Container mount utility blobfuse2."""
187
239
  install_cmd = (
188
- 'sudo apt-get update; '
189
- 'sudo apt-get install -y '
190
- '-o Dpkg::Options::="--force-confdef" '
191
- 'fuse3 libfuse3-dev || { '
192
- ' echo "fuse3 not available, falling back to fuse"; '
193
- ' sudo apt-get install -y '
194
- ' -o Dpkg::Options::="--force-confdef" '
195
- ' fuse libfuse-dev; '
196
- '} && '
240
+ # Check architecture first - blobfuse2 only supports x86_64
197
241
  'ARCH=$(uname -m) && '
198
242
  'if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then '
199
243
  ' echo "blobfuse2 is not supported on $ARCH" && '
200
244
  f' exit {exceptions.ARCH_NOT_SUPPORTED_EXIT_CODE}; '
245
+ 'fi && '
246
+ # Try to install fuse3 from default repos
247
+ 'sudo apt-get update && '
248
+ 'FUSE3_INSTALLED=0 && '
249
+ # On Kubernetes, if FUSERMOUNT_SHARED_DIR is set, it means
250
+ # fusermount and fusermount3 is symlinked to fusermount-shim.
251
+ # If we reinstall fuse3, it may overwrite the symlink, so
252
+ # just install libfuse3, which is needed by blobfuse2.
253
+ 'if [ -n "${FUSERMOUNT_SHARED_DIR:-}" ]; then '
254
+ ' PACKAGES="libfuse3-3 libfuse3-dev"; '
201
255
  'else '
202
- ' ARCH_SUFFIX="x86_64"; '
256
+ ' PACKAGES="fuse3 libfuse3-3 libfuse3-dev"; '
203
257
  'fi && '
204
- 'wget -nc https://github.com/Azure/azure-storage-fuse'
205
- f'/releases/download/blobfuse2-{BLOBFUSE2_VERSION}'
206
- f'/blobfuse2-{BLOBFUSE2_VERSION}-Debian-11.0.${{ARCH_SUFFIX}}.deb '
258
+ 'if sudo apt-get install -y '
259
+ '-o Dpkg::Options::="--force-confdef" '
260
+ '$PACKAGES; then '
261
+ ' FUSE3_INSTALLED=1; '
262
+ ' echo "fuse3 installed from default repos"; '
263
+ 'else '
264
+ # If fuse3 not available, try focal for Ubuntu <= 20.04
265
+ ' DISTRO=$(grep "^ID=" /etc/os-release | cut -d= -f2 | '
266
+ 'tr -d \'"\' | tr "[:upper:]" "[:lower:]") && '
267
+ ' VERSION=$(grep "^VERSION_ID=" /etc/os-release | cut -d= -f2 | '
268
+ 'tr -d \'"\') && '
269
+ ' if [ "$DISTRO" = "ubuntu" ] && '
270
+ '[ "$(echo "$VERSION 20.04" | '
271
+ 'awk \'{ print ($1 <= $2) }\')" = "1" ]; then '
272
+ ' echo "Trying to install fuse3 from focal for '
273
+ 'Ubuntu $VERSION"; '
274
+ ' echo "deb http://archive.ubuntu.com/ubuntu '
275
+ 'focal main universe" | '
276
+ 'sudo tee /etc/apt/sources.list.d/focal-fuse3.list && '
277
+ ' sudo apt-get update && '
278
+ ' if sudo apt-get install -y '
279
+ '-o Dpkg::Options::="--force-confdef" '
280
+ '-o Dpkg::Options::="--force-confold" '
281
+ '$PACKAGES; then '
282
+ ' FUSE3_INSTALLED=1; '
283
+ ' echo "fuse3 installed from focal"; '
284
+ ' sudo rm /etc/apt/sources.list.d/focal-fuse3.list; '
285
+ ' sudo apt-get update; '
286
+ ' else '
287
+ ' sudo rm -f /etc/apt/sources.list.d/focal-fuse3.list; '
288
+ ' sudo apt-get update; '
289
+ ' fi; '
290
+ ' fi; '
291
+ 'fi && '
292
+ # Install blobfuse2 only if fuse3 is available
293
+ 'if [ "$FUSE3_INSTALLED" = "1" ]; then '
294
+ ' echo "Installing blobfuse2 with libfuse3 support"; '
295
+ ' wget -nc https://github.com/Azure/azure-storage-fuse'
296
+ f'/releases/download/blobfuse2-{BLOBFUSE2_VERSION}/'
297
+ f'blobfuse2-{BLOBFUSE2_VERSION}-Debian-11.0.x86_64.deb '
207
298
  '-O /tmp/blobfuse2.deb && '
208
- 'sudo dpkg --install /tmp/blobfuse2.deb && '
299
+ ' sudo dpkg --install /tmp/blobfuse2.deb; '
300
+ 'else '
301
+ ' echo "Error: libfuse3 is required for Azure storage '
302
+ 'mounting with fusermount-wrapper."; '
303
+ ' echo "libfuse3 could not be installed on this system."; '
304
+ f' exit {exceptions.ARCH_NOT_SUPPORTED_EXIT_CODE}; '
305
+ 'fi && '
209
306
  f'mkdir -p {_BLOBFUSE_CACHE_ROOT_DIR};')
210
307
 
211
308
  return install_cmd
@@ -277,7 +374,10 @@ def get_az_mount_cmd(container_name: str,
277
374
  f'-- {blobfuse2_cmd} -o nonempty --foreground {{}}')
278
375
  original = f'{blobfuse2_cmd} {blobfuse2_options} {mount_path}'
279
376
  # If fusermount-wrapper is available, use it to wrap the blobfuse2 command
280
- # to avoid requiring root privilege.
377
+ # to avoid requiring privileged containers.
378
+ # fusermount-wrapper requires libfuse3;
379
+ # we install libfuse3 even on older distros like Ubuntu 18.04 by using
380
+ # Ubuntu 20.04 (focal) repositories.
281
381
  # TODO(aylei): feeling hacky, refactor this.
282
382
  get_mount_cmd = ('command -v fusermount-wrapper >/dev/null 2>&1 && '
283
383
  f'echo "{wrapped}" || echo "{original}"')
@@ -304,6 +404,7 @@ def get_r2_mount_cmd(r2_credentials_path: str,
304
404
  # Use rclone for ARM64 architectures since goofys doesn't support them
305
405
  arch_check = 'ARCH=$(uname -m) && '
306
406
  rclone_mount = (
407
+ f'{FUSE3_INSTALL_CMD} && '
307
408
  f'{FUSERMOUNT3_SOFT_LINK_CMD} && '
308
409
  f'AWS_SHARED_CREDENTIALS_FILE={r2_credentials_path} '
309
410
  f'AWS_PROFILE={r2_profile_name} '
@@ -333,7 +434,8 @@ def get_cos_mount_cmd(rclone_config: str,
333
434
  _bucket_sub_path: Optional[str] = None) -> str:
334
435
  """Returns a command to mount an IBM COS bucket using rclone."""
335
436
  # stores bucket profile in rclone config file at the cluster's nodes.
336
- configure_rclone_profile = (f'{FUSERMOUNT3_SOFT_LINK_CMD}; '
437
+ configure_rclone_profile = (f'{FUSE3_INSTALL_CMD} && '
438
+ f'{FUSERMOUNT3_SOFT_LINK_CMD}; '
337
439
  f'mkdir -p {constants.RCLONE_CONFIG_DIR} && '
338
440
  f'echo "{rclone_config}" >> '
339
441
  f'{constants.RCLONE_CONFIG_PATH}')
@@ -353,7 +455,8 @@ def get_mount_cached_cmd(rclone_config: str, rclone_profile_name: str,
353
455
  bucket_name: str, mount_path: str) -> str:
354
456
  """Returns a command to mount a bucket using rclone with vfs cache."""
355
457
  # stores bucket profile in rclone config file at the remote nodes.
356
- configure_rclone_profile = (f'{FUSERMOUNT3_SOFT_LINK_CMD}; '
458
+ configure_rclone_profile = (f'{FUSE3_INSTALL_CMD} && '
459
+ f'{FUSERMOUNT3_SOFT_LINK_CMD}; '
357
460
  f'mkdir -p {constants.RCLONE_CONFIG_DIR} && '
358
461
  f'echo {shlex.quote(rclone_config)} >> '
359
462
  f'{constants.RCLONE_CONFIG_PATH}')
@@ -485,13 +588,20 @@ def get_mounting_script(
485
588
 
486
589
  {command_runner.ALIAS_SUDO_TO_EMPTY_FOR_ROOT_CMD}
487
590
 
488
- MOUNT_PATH={mount_path}
591
+ MOUNT_PATH=$(eval echo {mount_path})
489
592
  MOUNT_BINARY={mount_binary}
490
593
 
491
594
  # Check if path is already mounted
492
- if grep -q $MOUNT_PATH /proc/mounts ; then
595
+ if findmnt -rn -T "$MOUNT_PATH" >/dev/null 2>&1; then
493
596
  echo "Path already mounted - unmounting..."
494
- fusermount -uz "$MOUNT_PATH"
597
+ (command -v fusermount >/dev/null 2>&1 && fusermount -uz "$MOUNT_PATH") \
598
+ || (command -v fusermount3 >/dev/null 2>&1 && fusermount3 -uz "$MOUNT_PATH") \
599
+ || sudo umount -l "$MOUNT_PATH" || true
600
+ # Ensure it's really gone (avoids races)
601
+ for i in $(seq 1 20); do
602
+ if ! findmnt -rn -T "$MOUNT_PATH" >/dev/null 2>&1; then break; fi
603
+ sleep 0.2
604
+ done
495
605
  echo "Successfully unmounted $MOUNT_PATH."
496
606
  fi
497
607
 
@@ -506,17 +616,40 @@ def get_mounting_script(
506
616
  # Check if mount path exists
507
617
  if [ ! -d "$MOUNT_PATH" ]; then
508
618
  echo "Mount path $MOUNT_PATH does not exist. Creating..."
509
- sudo mkdir -p $MOUNT_PATH
510
- sudo chmod 777 $MOUNT_PATH
619
+ sudo mkdir -p "$MOUNT_PATH"
620
+ sudo chmod 777 "$MOUNT_PATH"
511
621
  else
512
- # Check if mount path contains files
513
- if [ "$(ls -A $MOUNT_PATH)" ]; then
514
- echo "Mount path $MOUNT_PATH is not empty. Please mount to another path or remove it first."
515
- exit {exceptions.MOUNT_PATH_NON_EMPTY_CODE}
516
- fi
622
+ # If not a mountpoint and contains files, clean it to satisfy SkyPilot check
623
+ if ! findmnt -rn -T "$MOUNT_PATH" >/dev/null 2>&1; then
624
+ if [ -n "$(ls -A "$MOUNT_PATH" 2>/dev/null)" ]; then
625
+ echo "Cleaning non-empty mount path before mount..."
626
+ sudo bash -lc 'shopt -s dotglob nullglob; rm -rf --one-file-system -- '"$MOUNT_PATH"'/*' 2>/dev/null || true
627
+ fi
628
+ fi
517
629
  fi
518
630
  echo "Mounting $SOURCE_BUCKET to $MOUNT_PATH with $MOUNT_BINARY..."
631
+ set +e
519
632
  {mount_cmd}
633
+ MOUNT_EXIT_CODE=$?
634
+ set -e
635
+ if [ $MOUNT_EXIT_CODE -ne 0 ]; then
636
+ echo "Mount failed with exit code $MOUNT_EXIT_CODE."
637
+ if [ "$MOUNT_BINARY" = "goofys" ]; then
638
+ echo "Looking for goofys log files..."
639
+ # Find goofys log files in /tmp (created by mktemp -t goofys.XXXX.log)
640
+ # Note: if /dev/log exists, goofys logs to syslog instead of a file
641
+ GOOFYS_LOGS=$(ls -t /tmp/goofys.*.log 2>/dev/null | head -1)
642
+ if [ -n "$GOOFYS_LOGS" ]; then
643
+ echo "=== Goofys log file contents ==="
644
+ cat "$GOOFYS_LOGS"
645
+ echo "=== End of goofys log file ==="
646
+ else
647
+ echo "No goofys log file found in /tmp"
648
+ fi
649
+ fi
650
+ # TODO(kevin): Print logs from rclone, etc too for observability.
651
+ exit $MOUNT_EXIT_CODE
652
+ fi
520
653
  echo "Mounting done."
521
654
  """)
522
655