skypilot-nightly 1.0.0.dev20250502__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 (546) hide show
  1. sky/__init__.py +22 -6
  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/hyperbolic.py +8 -0
  8. sky/adaptors/ibm.py +5 -2
  9. sky/adaptors/kubernetes.py +149 -18
  10. sky/adaptors/nebius.py +173 -30
  11. sky/adaptors/primeintellect.py +1 -0
  12. sky/adaptors/runpod.py +68 -0
  13. sky/adaptors/seeweb.py +183 -0
  14. sky/adaptors/shadeform.py +89 -0
  15. sky/admin_policy.py +187 -4
  16. sky/authentication.py +179 -225
  17. sky/backends/__init__.py +4 -2
  18. sky/backends/backend.py +22 -9
  19. sky/backends/backend_utils.py +1323 -397
  20. sky/backends/cloud_vm_ray_backend.py +1749 -1029
  21. sky/backends/docker_utils.py +1 -1
  22. sky/backends/local_docker_backend.py +11 -6
  23. sky/backends/task_codegen.py +633 -0
  24. sky/backends/wheel_utils.py +55 -9
  25. sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
  26. sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
  27. sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
  28. sky/{clouds/service_catalog → catalog}/common.py +90 -49
  29. sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
  30. sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
  31. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +116 -80
  32. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
  33. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +70 -16
  34. sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
  35. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
  36. sky/catalog/data_fetchers/fetch_nebius.py +338 -0
  37. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  38. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  39. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  40. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
  41. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
  42. sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
  43. sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
  44. sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
  45. sky/catalog/hyperbolic_catalog.py +136 -0
  46. sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
  47. sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
  48. sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
  49. sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
  50. sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
  51. sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
  52. sky/catalog/primeintellect_catalog.py +95 -0
  53. sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
  54. sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
  55. sky/catalog/seeweb_catalog.py +184 -0
  56. sky/catalog/shadeform_catalog.py +165 -0
  57. sky/catalog/ssh_catalog.py +167 -0
  58. sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
  59. sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
  60. sky/check.py +533 -185
  61. sky/cli.py +5 -5975
  62. sky/client/{cli.py → cli/command.py} +2591 -1956
  63. sky/client/cli/deprecation_utils.py +99 -0
  64. sky/client/cli/flags.py +359 -0
  65. sky/client/cli/table_utils.py +322 -0
  66. sky/client/cli/utils.py +79 -0
  67. sky/client/common.py +78 -32
  68. sky/client/oauth.py +82 -0
  69. sky/client/sdk.py +1219 -319
  70. sky/client/sdk_async.py +827 -0
  71. sky/client/service_account_auth.py +47 -0
  72. sky/cloud_stores.py +82 -3
  73. sky/clouds/__init__.py +13 -0
  74. sky/clouds/aws.py +564 -164
  75. sky/clouds/azure.py +105 -83
  76. sky/clouds/cloud.py +140 -40
  77. sky/clouds/cudo.py +68 -50
  78. sky/clouds/do.py +66 -48
  79. sky/clouds/fluidstack.py +63 -44
  80. sky/clouds/gcp.py +339 -110
  81. sky/clouds/hyperbolic.py +293 -0
  82. sky/clouds/ibm.py +70 -49
  83. sky/clouds/kubernetes.py +570 -162
  84. sky/clouds/lambda_cloud.py +74 -54
  85. sky/clouds/nebius.py +210 -81
  86. sky/clouds/oci.py +88 -66
  87. sky/clouds/paperspace.py +61 -44
  88. sky/clouds/primeintellect.py +317 -0
  89. sky/clouds/runpod.py +164 -74
  90. sky/clouds/scp.py +89 -86
  91. sky/clouds/seeweb.py +477 -0
  92. sky/clouds/shadeform.py +400 -0
  93. sky/clouds/ssh.py +263 -0
  94. sky/clouds/utils/aws_utils.py +10 -4
  95. sky/clouds/utils/gcp_utils.py +87 -11
  96. sky/clouds/utils/oci_utils.py +38 -14
  97. sky/clouds/utils/scp_utils.py +231 -167
  98. sky/clouds/vast.py +99 -77
  99. sky/clouds/vsphere.py +51 -40
  100. sky/core.py +375 -173
  101. sky/dag.py +15 -0
  102. sky/dashboard/out/404.html +1 -1
  103. sky/dashboard/out/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js +1 -0
  104. sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
  105. sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js +1 -0
  106. sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
  107. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  108. sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
  109. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  110. sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
  111. sky/dashboard/out/_next/static/chunks/3294.20a8540fe697d5ee.js +1 -0
  112. sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
  113. sky/dashboard/out/_next/static/chunks/3800-7b45f9fbb6308557.js +1 -0
  114. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
  115. sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
  116. sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
  117. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  118. sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
  119. sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
  120. sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
  121. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  122. sky/dashboard/out/_next/static/chunks/6856-8f27d1c10c98def8.js +1 -0
  123. sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
  124. sky/dashboard/out/_next/static/chunks/6990-9146207c4567fdfd.js +1 -0
  125. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  126. sky/dashboard/out/_next/static/chunks/7411-b15471acd2cba716.js +41 -0
  127. sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
  128. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  129. sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
  130. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  131. sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
  132. sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
  133. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  134. sky/dashboard/out/_next/static/chunks/fd9d1056-86323a29a8f7e46a.js +1 -0
  135. sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
  136. sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
  137. sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
  138. sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
  139. sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
  140. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-792db96d918c98c9.js +16 -0
  141. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-abfcac9c137aa543.js +1 -0
  142. sky/dashboard/out/_next/static/chunks/pages/clusters-ee39056f9851a3ff.js +1 -0
  143. sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
  144. sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
  145. sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
  146. sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
  147. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-d66997e2bfc837cf.js +16 -0
  148. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-9faf940b253e3e06.js +21 -0
  149. sky/dashboard/out/_next/static/chunks/pages/jobs-2072b48b617989c9.js +1 -0
  150. sky/dashboard/out/_next/static/chunks/pages/users-f42674164aa73423.js +1 -0
  151. sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
  152. sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
  153. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-84a40f8c7c627fe4.js +1 -0
  154. sky/dashboard/out/_next/static/chunks/pages/workspaces-531b2f8c4bf89f82.js +1 -0
  155. sky/dashboard/out/_next/static/chunks/webpack-64e05f17bf2cf8ce.js +1 -0
  156. sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
  157. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  158. sky/dashboard/out/clusters/[cluster].html +1 -1
  159. sky/dashboard/out/clusters.html +1 -1
  160. sky/dashboard/out/config.html +1 -0
  161. sky/dashboard/out/index.html +1 -1
  162. sky/dashboard/out/infra/[context].html +1 -0
  163. sky/dashboard/out/infra.html +1 -0
  164. sky/dashboard/out/jobs/[job].html +1 -1
  165. sky/dashboard/out/jobs/pools/[pool].html +1 -0
  166. sky/dashboard/out/jobs.html +1 -1
  167. sky/dashboard/out/users.html +1 -0
  168. sky/dashboard/out/volumes.html +1 -0
  169. sky/dashboard/out/workspace/new.html +1 -0
  170. sky/dashboard/out/workspaces/[name].html +1 -0
  171. sky/dashboard/out/workspaces.html +1 -0
  172. sky/data/data_utils.py +137 -1
  173. sky/data/mounting_utils.py +269 -84
  174. sky/data/storage.py +1460 -1807
  175. sky/data/storage_utils.py +43 -57
  176. sky/exceptions.py +126 -2
  177. sky/execution.py +216 -63
  178. sky/global_user_state.py +2390 -586
  179. sky/jobs/__init__.py +7 -0
  180. sky/jobs/client/sdk.py +300 -58
  181. sky/jobs/client/sdk_async.py +161 -0
  182. sky/jobs/constants.py +15 -8
  183. sky/jobs/controller.py +848 -275
  184. sky/jobs/file_content_utils.py +128 -0
  185. sky/jobs/log_gc.py +193 -0
  186. sky/jobs/recovery_strategy.py +402 -152
  187. sky/jobs/scheduler.py +314 -189
  188. sky/jobs/server/core.py +836 -255
  189. sky/jobs/server/server.py +156 -115
  190. sky/jobs/server/utils.py +136 -0
  191. sky/jobs/state.py +2109 -706
  192. sky/jobs/utils.py +1306 -215
  193. sky/logs/__init__.py +21 -0
  194. sky/logs/agent.py +108 -0
  195. sky/logs/aws.py +243 -0
  196. sky/logs/gcp.py +91 -0
  197. sky/metrics/__init__.py +0 -0
  198. sky/metrics/utils.py +453 -0
  199. sky/models.py +78 -1
  200. sky/optimizer.py +164 -70
  201. sky/provision/__init__.py +90 -4
  202. sky/provision/aws/config.py +147 -26
  203. sky/provision/aws/instance.py +136 -50
  204. sky/provision/azure/instance.py +11 -6
  205. sky/provision/common.py +13 -1
  206. sky/provision/cudo/cudo_machine_type.py +1 -1
  207. sky/provision/cudo/cudo_utils.py +14 -8
  208. sky/provision/cudo/cudo_wrapper.py +72 -71
  209. sky/provision/cudo/instance.py +10 -6
  210. sky/provision/do/instance.py +10 -6
  211. sky/provision/do/utils.py +4 -3
  212. sky/provision/docker_utils.py +140 -33
  213. sky/provision/fluidstack/instance.py +13 -8
  214. sky/provision/gcp/__init__.py +1 -0
  215. sky/provision/gcp/config.py +301 -19
  216. sky/provision/gcp/constants.py +218 -0
  217. sky/provision/gcp/instance.py +36 -8
  218. sky/provision/gcp/instance_utils.py +18 -4
  219. sky/provision/gcp/volume_utils.py +247 -0
  220. sky/provision/hyperbolic/__init__.py +12 -0
  221. sky/provision/hyperbolic/config.py +10 -0
  222. sky/provision/hyperbolic/instance.py +437 -0
  223. sky/provision/hyperbolic/utils.py +373 -0
  224. sky/provision/instance_setup.py +101 -20
  225. sky/provision/kubernetes/__init__.py +5 -0
  226. sky/provision/kubernetes/config.py +9 -52
  227. sky/provision/kubernetes/constants.py +17 -0
  228. sky/provision/kubernetes/instance.py +919 -280
  229. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  230. sky/provision/kubernetes/network.py +27 -17
  231. sky/provision/kubernetes/network_utils.py +44 -43
  232. sky/provision/kubernetes/utils.py +1221 -534
  233. sky/provision/kubernetes/volume.py +343 -0
  234. sky/provision/lambda_cloud/instance.py +22 -16
  235. sky/provision/nebius/constants.py +50 -0
  236. sky/provision/nebius/instance.py +19 -6
  237. sky/provision/nebius/utils.py +237 -137
  238. sky/provision/oci/instance.py +10 -5
  239. sky/provision/paperspace/instance.py +10 -7
  240. sky/provision/paperspace/utils.py +1 -1
  241. sky/provision/primeintellect/__init__.py +10 -0
  242. sky/provision/primeintellect/config.py +11 -0
  243. sky/provision/primeintellect/instance.py +454 -0
  244. sky/provision/primeintellect/utils.py +398 -0
  245. sky/provision/provisioner.py +117 -36
  246. sky/provision/runpod/__init__.py +5 -0
  247. sky/provision/runpod/instance.py +27 -6
  248. sky/provision/runpod/utils.py +51 -18
  249. sky/provision/runpod/volume.py +214 -0
  250. sky/provision/scp/__init__.py +15 -0
  251. sky/provision/scp/config.py +93 -0
  252. sky/provision/scp/instance.py +707 -0
  253. sky/provision/seeweb/__init__.py +11 -0
  254. sky/provision/seeweb/config.py +13 -0
  255. sky/provision/seeweb/instance.py +812 -0
  256. sky/provision/shadeform/__init__.py +11 -0
  257. sky/provision/shadeform/config.py +12 -0
  258. sky/provision/shadeform/instance.py +351 -0
  259. sky/provision/shadeform/shadeform_utils.py +83 -0
  260. sky/provision/ssh/__init__.py +18 -0
  261. sky/provision/vast/instance.py +13 -8
  262. sky/provision/vast/utils.py +10 -7
  263. sky/provision/volume.py +164 -0
  264. sky/provision/vsphere/common/ssl_helper.py +1 -1
  265. sky/provision/vsphere/common/vapiconnect.py +2 -1
  266. sky/provision/vsphere/common/vim_utils.py +4 -4
  267. sky/provision/vsphere/instance.py +15 -10
  268. sky/provision/vsphere/vsphere_utils.py +17 -20
  269. sky/py.typed +0 -0
  270. sky/resources.py +845 -119
  271. sky/schemas/__init__.py +0 -0
  272. sky/schemas/api/__init__.py +0 -0
  273. sky/schemas/api/responses.py +227 -0
  274. sky/schemas/db/README +4 -0
  275. sky/schemas/db/env.py +90 -0
  276. sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
  277. sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
  278. sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
  279. sky/schemas/db/global_user_state/004_is_managed.py +34 -0
  280. sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
  281. sky/schemas/db/global_user_state/006_provision_log.py +41 -0
  282. sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
  283. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  284. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  285. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  286. sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
  287. sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
  288. sky/schemas/db/script.py.mako +28 -0
  289. sky/schemas/db/serve_state/001_initial_schema.py +67 -0
  290. sky/schemas/db/serve_state/002_yaml_content.py +34 -0
  291. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  292. sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
  293. sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
  294. sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
  295. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  296. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  297. sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
  298. sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
  299. sky/schemas/generated/__init__.py +0 -0
  300. sky/schemas/generated/autostopv1_pb2.py +36 -0
  301. sky/schemas/generated/autostopv1_pb2.pyi +43 -0
  302. sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
  303. sky/schemas/generated/jobsv1_pb2.py +86 -0
  304. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  305. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  306. sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
  307. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  308. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  309. sky/schemas/generated/servev1_pb2.py +58 -0
  310. sky/schemas/generated/servev1_pb2.pyi +115 -0
  311. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  312. sky/serve/autoscalers.py +357 -5
  313. sky/serve/client/impl.py +310 -0
  314. sky/serve/client/sdk.py +47 -139
  315. sky/serve/client/sdk_async.py +130 -0
  316. sky/serve/constants.py +12 -9
  317. sky/serve/controller.py +68 -17
  318. sky/serve/load_balancer.py +106 -60
  319. sky/serve/load_balancing_policies.py +116 -2
  320. sky/serve/replica_managers.py +434 -249
  321. sky/serve/serve_rpc_utils.py +179 -0
  322. sky/serve/serve_state.py +569 -257
  323. sky/serve/serve_utils.py +775 -265
  324. sky/serve/server/core.py +66 -711
  325. sky/serve/server/impl.py +1093 -0
  326. sky/serve/server/server.py +21 -18
  327. sky/serve/service.py +192 -89
  328. sky/serve/service_spec.py +144 -20
  329. sky/serve/spot_placer.py +3 -0
  330. sky/server/auth/__init__.py +0 -0
  331. sky/server/auth/authn.py +50 -0
  332. sky/server/auth/loopback.py +38 -0
  333. sky/server/auth/oauth2_proxy.py +202 -0
  334. sky/server/common.py +478 -182
  335. sky/server/config.py +85 -23
  336. sky/server/constants.py +44 -6
  337. sky/server/daemons.py +295 -0
  338. sky/server/html/token_page.html +185 -0
  339. sky/server/metrics.py +160 -0
  340. sky/server/middleware_utils.py +166 -0
  341. sky/server/requests/executor.py +558 -138
  342. sky/server/requests/payloads.py +364 -24
  343. sky/server/requests/preconditions.py +21 -17
  344. sky/server/requests/process.py +112 -29
  345. sky/server/requests/request_names.py +121 -0
  346. sky/server/requests/requests.py +822 -226
  347. sky/server/requests/serializers/decoders.py +82 -31
  348. sky/server/requests/serializers/encoders.py +140 -22
  349. sky/server/requests/threads.py +117 -0
  350. sky/server/rest.py +455 -0
  351. sky/server/server.py +1309 -285
  352. sky/server/state.py +20 -0
  353. sky/server/stream_utils.py +327 -61
  354. sky/server/uvicorn.py +217 -3
  355. sky/server/versions.py +270 -0
  356. sky/setup_files/MANIFEST.in +11 -1
  357. sky/setup_files/alembic.ini +160 -0
  358. sky/setup_files/dependencies.py +139 -31
  359. sky/setup_files/setup.py +44 -42
  360. sky/sky_logging.py +114 -7
  361. sky/skylet/attempt_skylet.py +106 -24
  362. sky/skylet/autostop_lib.py +129 -8
  363. sky/skylet/configs.py +29 -20
  364. sky/skylet/constants.py +216 -25
  365. sky/skylet/events.py +101 -21
  366. sky/skylet/job_lib.py +345 -164
  367. sky/skylet/log_lib.py +297 -18
  368. sky/skylet/log_lib.pyi +44 -1
  369. sky/skylet/providers/ibm/node_provider.py +12 -8
  370. sky/skylet/providers/ibm/vpc_provider.py +13 -12
  371. sky/skylet/ray_patches/__init__.py +17 -3
  372. sky/skylet/ray_patches/autoscaler.py.diff +18 -0
  373. sky/skylet/ray_patches/cli.py.diff +19 -0
  374. sky/skylet/ray_patches/command_runner.py.diff +17 -0
  375. sky/skylet/ray_patches/log_monitor.py.diff +20 -0
  376. sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
  377. sky/skylet/ray_patches/updater.py.diff +18 -0
  378. sky/skylet/ray_patches/worker.py.diff +41 -0
  379. sky/skylet/runtime_utils.py +21 -0
  380. sky/skylet/services.py +568 -0
  381. sky/skylet/skylet.py +72 -4
  382. sky/skylet/subprocess_daemon.py +104 -29
  383. sky/skypilot_config.py +506 -99
  384. sky/ssh_node_pools/__init__.py +1 -0
  385. sky/ssh_node_pools/core.py +135 -0
  386. sky/ssh_node_pools/server.py +233 -0
  387. sky/task.py +685 -163
  388. sky/templates/aws-ray.yml.j2 +11 -3
  389. sky/templates/azure-ray.yml.j2 +2 -1
  390. sky/templates/cudo-ray.yml.j2 +1 -0
  391. sky/templates/do-ray.yml.j2 +2 -1
  392. sky/templates/fluidstack-ray.yml.j2 +1 -0
  393. sky/templates/gcp-ray.yml.j2 +62 -1
  394. sky/templates/hyperbolic-ray.yml.j2 +68 -0
  395. sky/templates/ibm-ray.yml.j2 +2 -1
  396. sky/templates/jobs-controller.yaml.j2 +27 -24
  397. sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
  398. sky/templates/kubernetes-ray.yml.j2 +611 -50
  399. sky/templates/lambda-ray.yml.j2 +2 -1
  400. sky/templates/nebius-ray.yml.j2 +34 -12
  401. sky/templates/oci-ray.yml.j2 +1 -0
  402. sky/templates/paperspace-ray.yml.j2 +2 -1
  403. sky/templates/primeintellect-ray.yml.j2 +72 -0
  404. sky/templates/runpod-ray.yml.j2 +10 -1
  405. sky/templates/scp-ray.yml.j2 +4 -50
  406. sky/templates/seeweb-ray.yml.j2 +171 -0
  407. sky/templates/shadeform-ray.yml.j2 +73 -0
  408. sky/templates/sky-serve-controller.yaml.j2 +22 -2
  409. sky/templates/vast-ray.yml.j2 +1 -0
  410. sky/templates/vsphere-ray.yml.j2 +1 -0
  411. sky/templates/websocket_proxy.py +212 -37
  412. sky/usage/usage_lib.py +31 -15
  413. sky/users/__init__.py +0 -0
  414. sky/users/model.conf +15 -0
  415. sky/users/permission.py +397 -0
  416. sky/users/rbac.py +121 -0
  417. sky/users/server.py +720 -0
  418. sky/users/token_service.py +218 -0
  419. sky/utils/accelerator_registry.py +35 -5
  420. sky/utils/admin_policy_utils.py +84 -38
  421. sky/utils/annotations.py +38 -5
  422. sky/utils/asyncio_utils.py +78 -0
  423. sky/utils/atomic.py +1 -1
  424. sky/utils/auth_utils.py +153 -0
  425. sky/utils/benchmark_utils.py +60 -0
  426. sky/utils/cli_utils/status_utils.py +159 -86
  427. sky/utils/cluster_utils.py +31 -9
  428. sky/utils/command_runner.py +354 -68
  429. sky/utils/command_runner.pyi +93 -3
  430. sky/utils/common.py +35 -8
  431. sky/utils/common_utils.py +314 -91
  432. sky/utils/config_utils.py +74 -5
  433. sky/utils/context.py +403 -0
  434. sky/utils/context_utils.py +242 -0
  435. sky/utils/controller_utils.py +383 -89
  436. sky/utils/dag_utils.py +31 -12
  437. sky/utils/db/__init__.py +0 -0
  438. sky/utils/db/db_utils.py +485 -0
  439. sky/utils/db/kv_cache.py +149 -0
  440. sky/utils/db/migration_utils.py +137 -0
  441. sky/utils/directory_utils.py +12 -0
  442. sky/utils/env_options.py +13 -0
  443. sky/utils/git.py +567 -0
  444. sky/utils/git_clone.sh +460 -0
  445. sky/utils/infra_utils.py +195 -0
  446. sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
  447. sky/utils/kubernetes/config_map_utils.py +133 -0
  448. sky/utils/kubernetes/create_cluster.sh +15 -29
  449. sky/utils/kubernetes/delete_cluster.sh +10 -7
  450. sky/utils/kubernetes/deploy_ssh_node_pools.py +1177 -0
  451. sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
  452. sky/utils/kubernetes/generate_kind_config.py +6 -66
  453. sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
  454. sky/utils/kubernetes/gpu_labeler.py +18 -8
  455. sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
  456. sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
  457. sky/utils/kubernetes/kubernetes_deploy_utils.py +284 -114
  458. sky/utils/kubernetes/rsync_helper.sh +11 -3
  459. sky/utils/kubernetes/ssh-tunnel.sh +379 -0
  460. sky/utils/kubernetes/ssh_utils.py +221 -0
  461. sky/utils/kubernetes_enums.py +8 -15
  462. sky/utils/lock_events.py +94 -0
  463. sky/utils/locks.py +416 -0
  464. sky/utils/log_utils.py +82 -107
  465. sky/utils/perf_utils.py +22 -0
  466. sky/utils/resource_checker.py +298 -0
  467. sky/utils/resources_utils.py +249 -32
  468. sky/utils/rich_utils.py +217 -39
  469. sky/utils/schemas.py +955 -160
  470. sky/utils/serialize_utils.py +16 -0
  471. sky/utils/status_lib.py +10 -0
  472. sky/utils/subprocess_utils.py +29 -15
  473. sky/utils/tempstore.py +70 -0
  474. sky/utils/thread_utils.py +91 -0
  475. sky/utils/timeline.py +26 -53
  476. sky/utils/ux_utils.py +84 -15
  477. sky/utils/validator.py +11 -1
  478. sky/utils/volume.py +165 -0
  479. sky/utils/yaml_utils.py +111 -0
  480. sky/volumes/__init__.py +13 -0
  481. sky/volumes/client/__init__.py +0 -0
  482. sky/volumes/client/sdk.py +150 -0
  483. sky/volumes/server/__init__.py +0 -0
  484. sky/volumes/server/core.py +270 -0
  485. sky/volumes/server/server.py +124 -0
  486. sky/volumes/volume.py +215 -0
  487. sky/workspaces/__init__.py +0 -0
  488. sky/workspaces/core.py +655 -0
  489. sky/workspaces/server.py +101 -0
  490. sky/workspaces/utils.py +56 -0
  491. sky_templates/README.md +3 -0
  492. sky_templates/__init__.py +3 -0
  493. sky_templates/ray/__init__.py +0 -0
  494. sky_templates/ray/start_cluster +183 -0
  495. sky_templates/ray/stop_cluster +75 -0
  496. skypilot_nightly-1.0.0.dev20251203.dist-info/METADATA +676 -0
  497. skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
  498. {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +1 -1
  499. skypilot_nightly-1.0.0.dev20251203.dist-info/top_level.txt +2 -0
  500. sky/benchmark/benchmark_state.py +0 -256
  501. sky/benchmark/benchmark_utils.py +0 -641
  502. sky/clouds/service_catalog/constants.py +0 -7
  503. sky/dashboard/out/_next/static/GWvVBSCS7FmUiVmjaL1a7/_buildManifest.js +0 -1
  504. sky/dashboard/out/_next/static/chunks/236-2db3ee3fba33dd9e.js +0 -6
  505. sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
  506. sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
  507. sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
  508. sky/dashboard/out/_next/static/chunks/845-9e60713e0c441abc.js +0 -1
  509. sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
  510. sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
  511. sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
  512. sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
  513. sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
  514. sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
  515. sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
  516. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-6ac338bc2239cb45.js +0 -1
  517. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
  518. sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
  519. sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
  520. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-1c519e1afc523dc9.js +0 -1
  521. sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
  522. sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
  523. sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
  524. sky/jobs/dashboard/dashboard.py +0 -223
  525. sky/jobs/dashboard/static/favicon.ico +0 -0
  526. sky/jobs/dashboard/templates/index.html +0 -831
  527. sky/jobs/server/dashboard_utils.py +0 -69
  528. sky/skylet/providers/scp/__init__.py +0 -2
  529. sky/skylet/providers/scp/config.py +0 -149
  530. sky/skylet/providers/scp/node_provider.py +0 -578
  531. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  532. sky/utils/db_utils.py +0 -100
  533. sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
  534. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  535. skypilot_nightly-1.0.0.dev20250502.dist-info/METADATA +0 -361
  536. skypilot_nightly-1.0.0.dev20250502.dist-info/RECORD +0 -396
  537. skypilot_nightly-1.0.0.dev20250502.dist-info/top_level.txt +0 -1
  538. /sky/{clouds/service_catalog → catalog}/config.py +0 -0
  539. /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
  540. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
  541. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
  542. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
  543. /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
  544. /sky/dashboard/out/_next/static/{GWvVBSCS7FmUiVmjaL1a7 → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
  545. {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
  546. {skypilot_nightly-1.0.0.dev20250502.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
sky/clouds/oci.py CHANGED
@@ -23,12 +23,13 @@ History:
23
23
  import logging
24
24
  import os
25
25
  import typing
26
- from typing import Dict, Iterator, List, Optional, Tuple, Union
26
+ from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
27
27
 
28
+ from sky import catalog
28
29
  from sky import clouds
29
30
  from sky import exceptions
31
+ from sky.adaptors import common
30
32
  from sky.adaptors import oci as oci_adaptor
31
- from sky.clouds import service_catalog
32
33
  from sky.clouds.utils import oci_utils
33
34
  from sky.provision.oci.query_utils import query_helper
34
35
  from sky.utils import common_utils
@@ -40,6 +41,7 @@ from sky.utils import ux_utils
40
41
  if typing.TYPE_CHECKING:
41
42
  # Renaming to avoid shadowing variables.
42
43
  from sky import resources as resources_lib
44
+ from sky.utils import volume as volume_lib
43
45
 
44
46
  logger = logging.getLogger(__name__)
45
47
 
@@ -67,7 +69,9 @@ class OCI(clouds.Cloud):
67
69
 
68
70
  @classmethod
69
71
  def _unsupported_features_for_resources(
70
- cls, resources: 'resources_lib.Resources'
72
+ cls,
73
+ resources: 'resources_lib.Resources',
74
+ region: Optional[str] = None,
71
75
  ) -> Dict[clouds.CloudImplementationFeatures, str]:
72
76
  unsupported_features = {
73
77
  clouds.CloudImplementationFeatures.CLONE_DISK_FROM_CLUSTER:
@@ -79,6 +83,9 @@ class OCI(clouds.Cloud):
79
83
  clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS:
80
84
  ('High availability controllers are not supported on '
81
85
  f'{cls._REPR}.'),
86
+ clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK:
87
+ ('Customized multiple network interfaces are not supported on '
88
+ f'{cls._REPR}.'),
82
89
  }
83
90
  if resources.use_spot:
84
91
  unsupported_features[clouds.CloudImplementationFeatures.STOP] = (
@@ -91,13 +98,18 @@ class OCI(clouds.Cloud):
91
98
  return cls._MAX_CLUSTER_NAME_LEN_LIMIT
92
99
 
93
100
  @classmethod
94
- def regions_with_offering(cls, instance_type: str,
95
- accelerators: Optional[Dict[str, int]],
96
- use_spot: bool, region: Optional[str],
97
- zone: Optional[str]) -> List[clouds.Region]:
101
+ def regions_with_offering(
102
+ cls,
103
+ instance_type: str,
104
+ accelerators: Optional[Dict[str, int]],
105
+ use_spot: bool,
106
+ region: Optional[str],
107
+ zone: Optional[str],
108
+ resources: Optional['resources_lib.Resources'] = None,
109
+ ) -> List[clouds.Region]:
98
110
  del accelerators # unused
99
111
 
100
- regions = service_catalog.get_region_zones_for_instance_type(
112
+ regions = catalog.get_region_zones_for_instance_type(
101
113
  instance_type, use_spot, 'oci')
102
114
 
103
115
  if region is not None:
@@ -114,8 +126,8 @@ class OCI(clouds.Cloud):
114
126
  cls,
115
127
  instance_type: str,
116
128
  ) -> Tuple[Optional[float], Optional[float]]:
117
- return service_catalog.get_vcpus_mem_from_instance_type(instance_type,
118
- clouds='oci')
129
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
130
+ clouds='oci')
119
131
 
120
132
  @classmethod
121
133
  def zones_provision_loop(
@@ -143,11 +155,11 @@ class OCI(clouds.Cloud):
143
155
  use_spot: bool,
144
156
  region: Optional[str] = None,
145
157
  zone: Optional[str] = None) -> float:
146
- return service_catalog.get_hourly_cost(instance_type,
147
- use_spot=use_spot,
148
- region=region,
149
- zone=zone,
150
- clouds='oci')
158
+ return catalog.get_hourly_cost(instance_type,
159
+ use_spot=use_spot,
160
+ region=region,
161
+ zone=zone,
162
+ clouds='oci')
151
163
 
152
164
  def accelerators_to_hourly_cost(self,
153
165
  accelerators: Dict[str, int],
@@ -183,40 +195,46 @@ class OCI(clouds.Cloud):
183
195
  return (num_gigabytes - 10 * 1024) * 0.0085
184
196
 
185
197
  @classmethod
186
- def get_default_instance_type(
187
- cls,
188
- cpus: Optional[str] = None,
189
- memory: Optional[str] = None,
190
- disk_tier: Optional[resources_utils.DiskTier] = None
191
- ) -> Optional[str]:
192
- return service_catalog.get_default_instance_type(cpus=cpus,
193
- memory=memory,
194
- disk_tier=disk_tier,
195
- clouds='oci')
198
+ def get_default_instance_type(cls,
199
+ cpus: Optional[str] = None,
200
+ memory: Optional[str] = None,
201
+ disk_tier: Optional[
202
+ resources_utils.DiskTier] = None,
203
+ region: Optional[str] = None,
204
+ zone: Optional[str] = None) -> Optional[str]:
205
+ return catalog.get_default_instance_type(cpus=cpus,
206
+ memory=memory,
207
+ disk_tier=disk_tier,
208
+ region=region,
209
+ zone=zone,
210
+ clouds='oci')
196
211
 
197
212
  @classmethod
198
213
  def get_accelerators_from_instance_type(
199
214
  cls,
200
215
  instance_type: str,
201
216
  ) -> Optional[Dict[str, Union[int, float]]]:
202
- return service_catalog.get_accelerators_from_instance_type(
203
- instance_type, clouds='oci')
217
+ return catalog.get_accelerators_from_instance_type(instance_type,
218
+ clouds='oci')
204
219
 
205
220
  @classmethod
206
221
  def get_zone_shell_cmd(cls) -> Optional[str]:
207
222
  return None
208
223
 
209
224
  def make_deploy_resources_variables(
210
- self,
211
- resources: 'resources_lib.Resources',
212
- cluster_name: resources_utils.ClusterName,
213
- region: Optional['clouds.Region'],
214
- zones: Optional[List['clouds.Zone']],
215
- num_nodes: int,
216
- dryrun: bool = False) -> Dict[str, Optional[str]]:
225
+ self,
226
+ resources: 'resources_lib.Resources',
227
+ cluster_name: resources_utils.ClusterName,
228
+ region: Optional['clouds.Region'],
229
+ zones: Optional[List['clouds.Zone']],
230
+ num_nodes: int,
231
+ dryrun: bool = False,
232
+ volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
233
+ ) -> Dict[str, Any]:
217
234
  del cluster_name, dryrun # Unused.
218
235
  assert region is not None, resources
219
236
 
237
+ resources = resources.assert_launchable()
220
238
  acc_dict = self.get_accelerators_from_instance_type(
221
239
  resources.instance_type)
222
240
  custom_resources = resources_utils.make_ray_custom_resources_str(
@@ -245,7 +263,8 @@ class OCI(clouds.Cloud):
245
263
  image_id, os_type = image_id.replace(' ', '').split(':')
246
264
 
247
265
  cpus = resources.cpus
248
- instance_type_arr = resources.instance_type.split(
266
+ original_instance_type = resources.instance_type
267
+ instance_type_arr = original_instance_type.split(
249
268
  oci_utils.oci_config.INSTANCE_TYPE_RES_SPERATOR)
250
269
  instance_type = instance_type_arr[0]
251
270
 
@@ -259,12 +278,12 @@ class OCI(clouds.Cloud):
259
278
  else:
260
279
  if cpus is None:
261
280
  cpus, mems = OCI.get_vcpus_mem_from_instance_type(
262
- resources.instance_type)
281
+ original_instance_type)
263
282
  resources = resources.copy(
264
283
  cpus=cpus,
265
284
  memory=mems,
266
285
  )
267
- if cpus is None and resources.instance_type.startswith(
286
+ if cpus is None and original_instance_type.startswith(
268
287
  oci_utils.oci_config.VM_PREFIX):
269
288
  cpus = f'{oci_utils.oci_config.DEFAULT_NUM_VCPUS}'
270
289
 
@@ -272,8 +291,8 @@ class OCI(clouds.Cloud):
272
291
  if zone is None:
273
292
  # If zone is not specified, try to get the first zone.
274
293
  if zones is None:
275
- regions = service_catalog.get_region_zones_for_instance_type(
276
- instance_type=resources.instance_type,
294
+ regions = catalog.get_region_zones_for_instance_type(
295
+ instance_type=original_instance_type,
277
296
  use_spot=resources.use_spot,
278
297
  clouds='oci')
279
298
  zones = [r for r in iter(regions) if r.name == region.name
@@ -313,11 +332,11 @@ class OCI(clouds.Cloud):
313
332
  # OS type is not determined yet. So try to get it from vms.csv
314
333
  image_str = self._get_image_str(
315
334
  image_id=resources.image_id,
316
- instance_type=resources.instance_type,
335
+ instance_type=original_instance_type,
317
336
  region=region.name)
318
337
 
319
338
  # pylint: disable=import-outside-toplevel
320
- from sky.clouds.service_catalog import oci_catalog
339
+ from sky.catalog import oci_catalog
321
340
  os_type = oci_catalog.get_image_os_from_tag(tag=image_str,
322
341
  region=region.name)
323
342
  logger.debug(f'OS type for the image {image_id} is {os_type}')
@@ -370,7 +389,9 @@ class OCI(clouds.Cloud):
370
389
  default_instance_type = OCI.get_default_instance_type(
371
390
  cpus=resources.cpus,
372
391
  memory=resources.memory,
373
- disk_tier=resources.disk_tier)
392
+ disk_tier=resources.disk_tier,
393
+ region=resources.region,
394
+ zone=resources.zone)
374
395
 
375
396
  if default_instance_type is None:
376
397
  return resources_utils.FeasibleResources([], [], None)
@@ -381,16 +402,16 @@ class OCI(clouds.Cloud):
381
402
  assert len(accelerators) == 1, resources
382
403
 
383
404
  acc, acc_count = list(accelerators.items())[0]
384
- (instance_list, fuzzy_candidate_list
385
- ) = service_catalog.get_instance_type_for_accelerator(
386
- acc,
387
- acc_count,
388
- use_spot=resources.use_spot,
389
- cpus=resources.cpus,
390
- memory=resources.memory,
391
- region=resources.region,
392
- zone=resources.zone,
393
- clouds='oci')
405
+ (instance_list,
406
+ fuzzy_candidate_list) = catalog.get_instance_type_for_accelerator(
407
+ acc,
408
+ acc_count,
409
+ use_spot=resources.use_spot,
410
+ cpus=resources.cpus,
411
+ memory=resources.memory,
412
+ region=resources.region,
413
+ zone=resources.zone,
414
+ clouds='oci')
394
415
  if instance_list is None:
395
416
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
396
417
  None)
@@ -399,13 +420,15 @@ class OCI(clouds.Cloud):
399
420
  fuzzy_candidate_list, None)
400
421
 
401
422
  @classmethod
402
- def _check_compute_credentials(cls) -> Tuple[bool, Optional[str]]:
423
+ def _check_compute_credentials(
424
+ cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
403
425
  """Checks if the user has access credentials to
404
426
  OCI's compute service."""
405
427
  return cls._check_credentials()
406
428
 
407
429
  @classmethod
408
- def _check_storage_credentials(cls) -> Tuple[bool, Optional[str]]:
430
+ def _check_storage_credentials(
431
+ cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
409
432
  """Checks if the user has access credentials to
410
433
  OCI's storage service."""
411
434
  # TODO(seungjin): Implement separate check for
@@ -439,13 +462,12 @@ class OCI(clouds.Cloud):
439
462
  f'{cls._INDENT_PREFIX} region=us-sanjose-1\n'
440
463
  f'{cls._INDENT_PREFIX} key_file=~/.oci/oci_api_key.pem')
441
464
 
442
- try:
443
- # pylint: disable=import-outside-toplevel,unused-import
444
- import oci
445
- except ImportError:
446
- return False, ('`oci` is not installed. Install it with: '
447
- 'pip install oci\n'
448
- f'{cls._INDENT_PREFIX}{short_credential_help_str}')
465
+ dependency_error_msg = (
466
+ '`oci` is not installed. Install it with: '
467
+ 'pip install oci\n'
468
+ f'{cls._INDENT_PREFIX}{short_credential_help_str}')
469
+ if not common.can_import_modules(['oci']):
470
+ return False, dependency_error_msg
449
471
 
450
472
  conf_file = oci_adaptor.get_config_file()
451
473
 
@@ -528,10 +550,10 @@ class OCI(clouds.Cloud):
528
550
  return None
529
551
 
530
552
  def instance_type_exists(self, instance_type: str) -> bool:
531
- return service_catalog.instance_type_exists(instance_type, 'oci')
553
+ return catalog.instance_type_exists(instance_type, 'oci')
532
554
 
533
555
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
534
- return service_catalog.validate_region_zone(region, zone, clouds='oci')
556
+ return catalog.validate_region_zone(region, zone, clouds='oci')
535
557
 
536
558
  @classmethod
537
559
  def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
@@ -552,9 +574,9 @@ class OCI(clouds.Cloud):
552
574
  region=region_name)
553
575
 
554
576
  if image_id_str.startswith('skypilot:'):
555
- image_id_str = service_catalog.get_image_id_from_tag(image_id_str,
556
- region_name,
557
- clouds='oci')
577
+ image_id_str = catalog.get_image_id_from_tag(image_id_str,
578
+ region_name,
579
+ clouds='oci')
558
580
 
559
581
  # Image_id should be impossible be None, except for the case when
560
582
  # user specify an image tag which does not exist in the image.csv
sky/clouds/paperspace.py CHANGED
@@ -3,9 +3,9 @@
3
3
  import typing
4
4
  from typing import Dict, Iterator, List, Optional, Tuple, Union
5
5
 
6
+ from sky import catalog
6
7
  from sky import clouds
7
8
  from sky.adaptors import common as adaptors_common
8
- from sky.clouds import service_catalog
9
9
  from sky.provision.paperspace import utils
10
10
  from sky.utils import registry
11
11
  from sky.utils import resources_utils
@@ -14,6 +14,7 @@ if typing.TYPE_CHECKING:
14
14
  import requests
15
15
 
16
16
  from sky import resources as resources_lib
17
+ from sky.utils import volume as volume_lib
17
18
  else:
18
19
  requests = adaptors_common.LazyImport('requests')
19
20
 
@@ -41,8 +42,14 @@ class Paperspace(clouds.Cloud):
41
42
  clouds.CloudImplementationFeatures.CUSTOM_DISK_TIER:
42
43
  'Custom disk tiers'
43
44
  f' is not supported in {_REPR}.',
45
+ clouds.CloudImplementationFeatures.CUSTOM_NETWORK_TIER:
46
+ ('Custom network tier is currently not supported in '
47
+ f'{_REPR}.'),
44
48
  clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS:
45
49
  (f'High availability controllers are not supported in {_REPR}.'),
50
+ clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK:
51
+ ('Customized multiple network interfaces are not supported in '
52
+ f'{_REPR}.'),
46
53
  }
47
54
  _MAX_CLUSTER_NAME_LEN_LIMIT = 120
48
55
  _regions: List[clouds.Region] = []
@@ -53,7 +60,9 @@ class Paperspace(clouds.Cloud):
53
60
 
54
61
  @classmethod
55
62
  def _unsupported_features_for_resources(
56
- cls, resources: 'resources_lib.Resources'
63
+ cls,
64
+ resources: 'resources_lib.Resources',
65
+ region: Optional[str] = None,
57
66
  ) -> Dict[clouds.CloudImplementationFeatures, str]:
58
67
  """The features not supported based on the resources provided.
59
68
 
@@ -79,13 +88,14 @@ class Paperspace(clouds.Cloud):
79
88
  use_spot: bool,
80
89
  region: Optional[str],
81
90
  zone: Optional[str],
91
+ resources: Optional['resources_lib.Resources'] = None,
82
92
  ) -> List[clouds.Region]:
83
93
  assert zone is None, 'Paperspace does not support zones.'
84
94
  del accelerators, zone # unused
85
95
  if use_spot:
86
96
  return []
87
97
  else:
88
- regions = service_catalog.get_region_zones_for_instance_type(
98
+ regions = catalog.get_region_zones_for_instance_type(
89
99
  instance_type, use_spot, 'paperspace')
90
100
 
91
101
  if region is not None:
@@ -97,8 +107,8 @@ class Paperspace(clouds.Cloud):
97
107
  cls,
98
108
  instance_type: str,
99
109
  ) -> Tuple[Optional[float], Optional[float]]:
100
- return service_catalog.get_vcpus_mem_from_instance_type(
101
- instance_type, clouds='paperspace')
110
+ return catalog.get_vcpus_mem_from_instance_type(instance_type,
111
+ clouds='paperspace')
102
112
 
103
113
  @classmethod
104
114
  def zones_provision_loop(
@@ -127,7 +137,7 @@ class Paperspace(clouds.Cloud):
127
137
  region: Optional[str] = None,
128
138
  zone: Optional[str] = None,
129
139
  ) -> float:
130
- return service_catalog.get_hourly_cost(
140
+ return catalog.get_hourly_cost(
131
141
  instance_type,
132
142
  use_spot=use_spot,
133
143
  region=region,
@@ -153,40 +163,46 @@ class Paperspace(clouds.Cloud):
153
163
  return self._REPR
154
164
 
155
165
  @classmethod
156
- def get_default_instance_type(
157
- cls,
158
- cpus: Optional[str] = None,
159
- memory: Optional[str] = None,
160
- disk_tier: Optional[resources_utils.DiskTier] = None,
161
- ) -> Optional[str]:
166
+ def get_default_instance_type(cls,
167
+ cpus: Optional[str] = None,
168
+ memory: Optional[str] = None,
169
+ disk_tier: Optional[
170
+ resources_utils.DiskTier] = None,
171
+ region: Optional[str] = None,
172
+ zone: Optional[str] = None) -> Optional[str]:
162
173
  """Returns the default instance type for Paperspace."""
163
- return service_catalog.get_default_instance_type(cpus=cpus,
164
- memory=memory,
165
- disk_tier=disk_tier,
166
- clouds='paperspace')
174
+ return catalog.get_default_instance_type(cpus=cpus,
175
+ memory=memory,
176
+ disk_tier=disk_tier,
177
+ region=region,
178
+ zone=zone,
179
+ clouds='paperspace')
167
180
 
168
181
  @classmethod
169
182
  def get_accelerators_from_instance_type(
170
183
  cls, instance_type: str) -> Optional[Dict[str, Union[int, float]]]:
171
- return service_catalog.get_accelerators_from_instance_type(
172
- instance_type, clouds='paperspace')
184
+ return catalog.get_accelerators_from_instance_type(instance_type,
185
+ clouds='paperspace')
173
186
 
174
187
  @classmethod
175
188
  def get_zone_shell_cmd(cls) -> Optional[str]:
176
189
  return None
177
190
 
178
191
  def make_deploy_resources_variables(
179
- self,
180
- resources: 'resources_lib.Resources',
181
- cluster_name: resources_utils.ClusterName,
182
- region: 'clouds.Region',
183
- zones: Optional[List['clouds.Zone']],
184
- num_nodes: int,
185
- dryrun: bool = False) -> Dict[str, Optional[str]]:
192
+ self,
193
+ resources: 'resources_lib.Resources',
194
+ cluster_name: resources_utils.ClusterName,
195
+ region: 'clouds.Region',
196
+ zones: Optional[List['clouds.Zone']],
197
+ num_nodes: int,
198
+ dryrun: bool = False,
199
+ volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
200
+ ) -> Dict[str, Optional[str]]:
186
201
  del zones, dryrun, cluster_name
187
202
 
188
- r = resources
189
- acc_dict = self.get_accelerators_from_instance_type(r.instance_type)
203
+ resources = resources.assert_launchable()
204
+ acc_dict = self.get_accelerators_from_instance_type(
205
+ resources.instance_type)
190
206
  custom_resources = resources_utils.make_ray_custom_resources_str(
191
207
  acc_dict)
192
208
 
@@ -227,7 +243,9 @@ class Paperspace(clouds.Cloud):
227
243
  default_instance_type = Paperspace.get_default_instance_type(
228
244
  cpus=resources.cpus,
229
245
  memory=resources.memory,
230
- disk_tier=resources.disk_tier)
246
+ disk_tier=resources.disk_tier,
247
+ region=resources.region,
248
+ zone=resources.zone)
231
249
  if default_instance_type is None:
232
250
  return resources_utils.FeasibleResources([], [], None)
233
251
  else:
@@ -236,17 +254,17 @@ class Paperspace(clouds.Cloud):
236
254
 
237
255
  assert len(accelerators) == 1, resources
238
256
  acc, acc_count = list(accelerators.items())[0]
239
- (instance_list, fuzzy_candidate_list) = (
240
- service_catalog.get_instance_type_for_accelerator(
241
- acc,
242
- acc_count,
243
- use_spot=resources.use_spot,
244
- cpus=resources.cpus,
245
- memory=resources.memory,
246
- region=resources.region,
247
- zone=resources.zone,
248
- clouds='paperspace',
249
- ))
257
+ (instance_list,
258
+ fuzzy_candidate_list) = (catalog.get_instance_type_for_accelerator(
259
+ acc,
260
+ acc_count,
261
+ use_spot=resources.use_spot,
262
+ cpus=resources.cpus,
263
+ memory=resources.memory,
264
+ region=resources.region,
265
+ zone=resources.zone,
266
+ clouds='paperspace',
267
+ ))
250
268
  if instance_list is None:
251
269
  return resources_utils.FeasibleResources([], fuzzy_candidate_list,
252
270
  None)
@@ -254,7 +272,8 @@ class Paperspace(clouds.Cloud):
254
272
  fuzzy_candidate_list, None)
255
273
 
256
274
  @classmethod
257
- def _check_compute_credentials(cls) -> Tuple[bool, Optional[str]]:
275
+ def _check_compute_credentials(
276
+ cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
258
277
  """Checks if the user has access credentials to
259
278
  Paperspace's compute service."""
260
279
  try:
@@ -291,9 +310,7 @@ class Paperspace(clouds.Cloud):
291
310
  return None
292
311
 
293
312
  def instance_type_exists(self, instance_type: str) -> bool:
294
- return service_catalog.instance_type_exists(instance_type, 'paperspace')
313
+ return catalog.instance_type_exists(instance_type, 'paperspace')
295
314
 
296
315
  def validate_region_zone(self, region: Optional[str], zone: Optional[str]):
297
- return service_catalog.validate_region_zone(region,
298
- zone,
299
- clouds='paperspace')
316
+ return catalog.validate_region_zone(region, zone, clouds='paperspace')