skypilot-nightly 1.0.0.dev20250509__py3-none-any.whl → 1.0.0.dev20251107__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.

Potentially problematic release.


This version of skypilot-nightly might be problematic. Click here for more details.

Files changed (512) hide show
  1. sky/__init__.py +22 -6
  2. sky/adaptors/aws.py +25 -7
  3. sky/adaptors/common.py +24 -1
  4. sky/adaptors/coreweave.py +278 -0
  5. sky/adaptors/do.py +8 -2
  6. sky/adaptors/hyperbolic.py +8 -0
  7. sky/adaptors/kubernetes.py +149 -18
  8. sky/adaptors/nebius.py +170 -17
  9. sky/adaptors/primeintellect.py +1 -0
  10. sky/adaptors/runpod.py +68 -0
  11. sky/adaptors/seeweb.py +167 -0
  12. sky/adaptors/shadeform.py +89 -0
  13. sky/admin_policy.py +187 -4
  14. sky/authentication.py +179 -225
  15. sky/backends/__init__.py +4 -2
  16. sky/backends/backend.py +22 -9
  17. sky/backends/backend_utils.py +1299 -380
  18. sky/backends/cloud_vm_ray_backend.py +1715 -518
  19. sky/backends/docker_utils.py +1 -1
  20. sky/backends/local_docker_backend.py +11 -6
  21. sky/backends/wheel_utils.py +37 -9
  22. sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
  23. sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
  24. sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
  25. sky/{clouds/service_catalog → catalog}/common.py +89 -48
  26. sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
  27. sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
  28. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +30 -40
  29. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
  30. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +42 -15
  31. sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
  32. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
  33. sky/catalog/data_fetchers/fetch_nebius.py +335 -0
  34. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  35. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  36. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  37. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
  38. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
  39. sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
  40. sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
  41. sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
  42. sky/catalog/hyperbolic_catalog.py +136 -0
  43. sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
  44. sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
  45. sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
  46. sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
  47. sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
  48. sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
  49. sky/catalog/primeintellect_catalog.py +95 -0
  50. sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
  51. sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
  52. sky/catalog/seeweb_catalog.py +184 -0
  53. sky/catalog/shadeform_catalog.py +165 -0
  54. sky/catalog/ssh_catalog.py +167 -0
  55. sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
  56. sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
  57. sky/check.py +491 -203
  58. sky/cli.py +5 -6005
  59. sky/client/{cli.py → cli/command.py} +2477 -1885
  60. sky/client/cli/deprecation_utils.py +99 -0
  61. sky/client/cli/flags.py +359 -0
  62. sky/client/cli/table_utils.py +320 -0
  63. sky/client/common.py +70 -32
  64. sky/client/oauth.py +82 -0
  65. sky/client/sdk.py +1203 -297
  66. sky/client/sdk_async.py +833 -0
  67. sky/client/service_account_auth.py +47 -0
  68. sky/cloud_stores.py +73 -0
  69. sky/clouds/__init__.py +13 -0
  70. sky/clouds/aws.py +358 -93
  71. sky/clouds/azure.py +105 -83
  72. sky/clouds/cloud.py +127 -36
  73. sky/clouds/cudo.py +68 -50
  74. sky/clouds/do.py +66 -48
  75. sky/clouds/fluidstack.py +63 -44
  76. sky/clouds/gcp.py +339 -110
  77. sky/clouds/hyperbolic.py +293 -0
  78. sky/clouds/ibm.py +70 -49
  79. sky/clouds/kubernetes.py +563 -162
  80. sky/clouds/lambda_cloud.py +74 -54
  81. sky/clouds/nebius.py +206 -80
  82. sky/clouds/oci.py +88 -66
  83. sky/clouds/paperspace.py +61 -44
  84. sky/clouds/primeintellect.py +317 -0
  85. sky/clouds/runpod.py +164 -74
  86. sky/clouds/scp.py +89 -83
  87. sky/clouds/seeweb.py +466 -0
  88. sky/clouds/shadeform.py +400 -0
  89. sky/clouds/ssh.py +263 -0
  90. sky/clouds/utils/aws_utils.py +10 -4
  91. sky/clouds/utils/gcp_utils.py +87 -11
  92. sky/clouds/utils/oci_utils.py +38 -14
  93. sky/clouds/utils/scp_utils.py +177 -124
  94. sky/clouds/vast.py +99 -77
  95. sky/clouds/vsphere.py +51 -40
  96. sky/core.py +349 -139
  97. sky/dag.py +15 -0
  98. sky/dashboard/out/404.html +1 -1
  99. sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
  100. sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js +1 -0
  101. sky/dashboard/out/_next/static/chunks/1871-74503c8e80fd253b.js +6 -0
  102. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  103. sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
  104. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  105. sky/dashboard/out/_next/static/chunks/2755.fff53c4a3fcae910.js +26 -0
  106. sky/dashboard/out/_next/static/chunks/3294.72362fa129305b19.js +1 -0
  107. sky/dashboard/out/_next/static/chunks/3785.ad6adaa2a0fa9768.js +1 -0
  108. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
  109. sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
  110. sky/dashboard/out/_next/static/chunks/4725.a830b5c9e7867c92.js +1 -0
  111. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  112. sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
  113. sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
  114. sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
  115. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  116. sky/dashboard/out/_next/static/chunks/6601-06114c982db410b6.js +1 -0
  117. sky/dashboard/out/_next/static/chunks/6856-ef8ba11f96d8c4a3.js +1 -0
  118. sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
  119. sky/dashboard/out/_next/static/chunks/6990-32b6e2d3822301fa.js +1 -0
  120. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  121. sky/dashboard/out/_next/static/chunks/7411-b15471acd2cba716.js +41 -0
  122. sky/dashboard/out/_next/static/chunks/7615-3301e838e5f25772.js +1 -0
  123. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  124. sky/dashboard/out/_next/static/chunks/8969-1e4613c651bf4051.js +1 -0
  125. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  126. sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
  127. sky/dashboard/out/_next/static/chunks/9360.7310982cf5a0dc79.js +31 -0
  128. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  129. sky/dashboard/out/_next/static/chunks/fd9d1056-86323a29a8f7e46a.js +1 -0
  130. sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
  131. sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
  132. sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
  133. sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
  134. sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
  135. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-c736ead69c2d86ec.js +16 -0
  136. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a37d2063af475a1c.js +1 -0
  137. sky/dashboard/out/_next/static/chunks/pages/clusters-d44859594e6f8064.js +1 -0
  138. sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
  139. sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
  140. sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
  141. sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
  142. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-5796e8d6aea291a0.js +16 -0
  143. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-6edeb7d06032adfc.js +21 -0
  144. sky/dashboard/out/_next/static/chunks/pages/jobs-479dde13399cf270.js +1 -0
  145. sky/dashboard/out/_next/static/chunks/pages/users-5ab3b907622cf0fe.js +1 -0
  146. sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
  147. sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
  148. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-c5a3eeee1c218af1.js +1 -0
  149. sky/dashboard/out/_next/static/chunks/pages/workspaces-22b23febb3e89ce1.js +1 -0
  150. sky/dashboard/out/_next/static/chunks/webpack-2679be77fc08a2f8.js +1 -0
  151. sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
  152. sky/dashboard/out/_next/static/zB0ed6ge_W1MDszVHhijS/_buildManifest.js +1 -0
  153. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  154. sky/dashboard/out/clusters/[cluster].html +1 -1
  155. sky/dashboard/out/clusters.html +1 -1
  156. sky/dashboard/out/config.html +1 -0
  157. sky/dashboard/out/index.html +1 -1
  158. sky/dashboard/out/infra/[context].html +1 -0
  159. sky/dashboard/out/infra.html +1 -0
  160. sky/dashboard/out/jobs/[job].html +1 -1
  161. sky/dashboard/out/jobs/pools/[pool].html +1 -0
  162. sky/dashboard/out/jobs.html +1 -1
  163. sky/dashboard/out/users.html +1 -0
  164. sky/dashboard/out/volumes.html +1 -0
  165. sky/dashboard/out/workspace/new.html +1 -0
  166. sky/dashboard/out/workspaces/[name].html +1 -0
  167. sky/dashboard/out/workspaces.html +1 -0
  168. sky/data/data_utils.py +137 -1
  169. sky/data/mounting_utils.py +269 -84
  170. sky/data/storage.py +1451 -1807
  171. sky/data/storage_utils.py +43 -57
  172. sky/exceptions.py +132 -2
  173. sky/execution.py +206 -63
  174. sky/global_user_state.py +2374 -586
  175. sky/jobs/__init__.py +5 -0
  176. sky/jobs/client/sdk.py +242 -65
  177. sky/jobs/client/sdk_async.py +143 -0
  178. sky/jobs/constants.py +9 -8
  179. sky/jobs/controller.py +839 -277
  180. sky/jobs/file_content_utils.py +80 -0
  181. sky/jobs/log_gc.py +201 -0
  182. sky/jobs/recovery_strategy.py +398 -152
  183. sky/jobs/scheduler.py +315 -189
  184. sky/jobs/server/core.py +829 -255
  185. sky/jobs/server/server.py +156 -115
  186. sky/jobs/server/utils.py +136 -0
  187. sky/jobs/state.py +2092 -701
  188. sky/jobs/utils.py +1242 -160
  189. sky/logs/__init__.py +21 -0
  190. sky/logs/agent.py +108 -0
  191. sky/logs/aws.py +243 -0
  192. sky/logs/gcp.py +91 -0
  193. sky/metrics/__init__.py +0 -0
  194. sky/metrics/utils.py +443 -0
  195. sky/models.py +78 -1
  196. sky/optimizer.py +164 -70
  197. sky/provision/__init__.py +90 -4
  198. sky/provision/aws/config.py +147 -26
  199. sky/provision/aws/instance.py +135 -50
  200. sky/provision/azure/instance.py +10 -5
  201. sky/provision/common.py +13 -1
  202. sky/provision/cudo/cudo_machine_type.py +1 -1
  203. sky/provision/cudo/cudo_utils.py +14 -8
  204. sky/provision/cudo/cudo_wrapper.py +72 -71
  205. sky/provision/cudo/instance.py +10 -6
  206. sky/provision/do/instance.py +10 -6
  207. sky/provision/do/utils.py +4 -3
  208. sky/provision/docker_utils.py +114 -23
  209. sky/provision/fluidstack/instance.py +13 -8
  210. sky/provision/gcp/__init__.py +1 -0
  211. sky/provision/gcp/config.py +301 -19
  212. sky/provision/gcp/constants.py +218 -0
  213. sky/provision/gcp/instance.py +36 -8
  214. sky/provision/gcp/instance_utils.py +18 -4
  215. sky/provision/gcp/volume_utils.py +247 -0
  216. sky/provision/hyperbolic/__init__.py +12 -0
  217. sky/provision/hyperbolic/config.py +10 -0
  218. sky/provision/hyperbolic/instance.py +437 -0
  219. sky/provision/hyperbolic/utils.py +373 -0
  220. sky/provision/instance_setup.py +93 -14
  221. sky/provision/kubernetes/__init__.py +5 -0
  222. sky/provision/kubernetes/config.py +9 -52
  223. sky/provision/kubernetes/constants.py +17 -0
  224. sky/provision/kubernetes/instance.py +789 -247
  225. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  226. sky/provision/kubernetes/network.py +27 -17
  227. sky/provision/kubernetes/network_utils.py +40 -43
  228. sky/provision/kubernetes/utils.py +1192 -531
  229. sky/provision/kubernetes/volume.py +282 -0
  230. sky/provision/lambda_cloud/instance.py +22 -16
  231. sky/provision/nebius/constants.py +50 -0
  232. sky/provision/nebius/instance.py +19 -6
  233. sky/provision/nebius/utils.py +196 -91
  234. sky/provision/oci/instance.py +10 -5
  235. sky/provision/paperspace/instance.py +10 -7
  236. sky/provision/paperspace/utils.py +1 -1
  237. sky/provision/primeintellect/__init__.py +10 -0
  238. sky/provision/primeintellect/config.py +11 -0
  239. sky/provision/primeintellect/instance.py +454 -0
  240. sky/provision/primeintellect/utils.py +398 -0
  241. sky/provision/provisioner.py +110 -36
  242. sky/provision/runpod/__init__.py +5 -0
  243. sky/provision/runpod/instance.py +27 -6
  244. sky/provision/runpod/utils.py +51 -18
  245. sky/provision/runpod/volume.py +180 -0
  246. sky/provision/scp/__init__.py +15 -0
  247. sky/provision/scp/config.py +93 -0
  248. sky/provision/scp/instance.py +531 -0
  249. sky/provision/seeweb/__init__.py +11 -0
  250. sky/provision/seeweb/config.py +13 -0
  251. sky/provision/seeweb/instance.py +807 -0
  252. sky/provision/shadeform/__init__.py +11 -0
  253. sky/provision/shadeform/config.py +12 -0
  254. sky/provision/shadeform/instance.py +351 -0
  255. sky/provision/shadeform/shadeform_utils.py +83 -0
  256. sky/provision/ssh/__init__.py +18 -0
  257. sky/provision/vast/instance.py +13 -8
  258. sky/provision/vast/utils.py +10 -7
  259. sky/provision/vsphere/common/vim_utils.py +1 -2
  260. sky/provision/vsphere/instance.py +15 -10
  261. sky/provision/vsphere/vsphere_utils.py +9 -19
  262. sky/py.typed +0 -0
  263. sky/resources.py +844 -118
  264. sky/schemas/__init__.py +0 -0
  265. sky/schemas/api/__init__.py +0 -0
  266. sky/schemas/api/responses.py +225 -0
  267. sky/schemas/db/README +4 -0
  268. sky/schemas/db/env.py +90 -0
  269. sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
  270. sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
  271. sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
  272. sky/schemas/db/global_user_state/004_is_managed.py +34 -0
  273. sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
  274. sky/schemas/db/global_user_state/006_provision_log.py +41 -0
  275. sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
  276. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  277. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  278. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  279. sky/schemas/db/script.py.mako +28 -0
  280. sky/schemas/db/serve_state/001_initial_schema.py +67 -0
  281. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  282. sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
  283. sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
  284. sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
  285. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  286. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  287. sky/schemas/generated/__init__.py +0 -0
  288. sky/schemas/generated/autostopv1_pb2.py +36 -0
  289. sky/schemas/generated/autostopv1_pb2.pyi +43 -0
  290. sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
  291. sky/schemas/generated/jobsv1_pb2.py +86 -0
  292. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  293. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  294. sky/schemas/generated/managed_jobsv1_pb2.py +74 -0
  295. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  296. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  297. sky/schemas/generated/servev1_pb2.py +58 -0
  298. sky/schemas/generated/servev1_pb2.pyi +115 -0
  299. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  300. sky/serve/autoscalers.py +357 -5
  301. sky/serve/client/impl.py +310 -0
  302. sky/serve/client/sdk.py +47 -139
  303. sky/serve/client/sdk_async.py +130 -0
  304. sky/serve/constants.py +10 -8
  305. sky/serve/controller.py +64 -19
  306. sky/serve/load_balancer.py +106 -60
  307. sky/serve/load_balancing_policies.py +115 -1
  308. sky/serve/replica_managers.py +273 -162
  309. sky/serve/serve_rpc_utils.py +179 -0
  310. sky/serve/serve_state.py +554 -251
  311. sky/serve/serve_utils.py +733 -220
  312. sky/serve/server/core.py +66 -711
  313. sky/serve/server/impl.py +1093 -0
  314. sky/serve/server/server.py +21 -18
  315. sky/serve/service.py +133 -48
  316. sky/serve/service_spec.py +135 -16
  317. sky/serve/spot_placer.py +3 -0
  318. sky/server/auth/__init__.py +0 -0
  319. sky/server/auth/authn.py +50 -0
  320. sky/server/auth/loopback.py +38 -0
  321. sky/server/auth/oauth2_proxy.py +200 -0
  322. sky/server/common.py +475 -181
  323. sky/server/config.py +81 -23
  324. sky/server/constants.py +44 -6
  325. sky/server/daemons.py +229 -0
  326. sky/server/html/token_page.html +185 -0
  327. sky/server/metrics.py +160 -0
  328. sky/server/requests/executor.py +528 -138
  329. sky/server/requests/payloads.py +351 -17
  330. sky/server/requests/preconditions.py +21 -17
  331. sky/server/requests/process.py +112 -29
  332. sky/server/requests/request_names.py +120 -0
  333. sky/server/requests/requests.py +817 -224
  334. sky/server/requests/serializers/decoders.py +82 -31
  335. sky/server/requests/serializers/encoders.py +140 -22
  336. sky/server/requests/threads.py +106 -0
  337. sky/server/rest.py +417 -0
  338. sky/server/server.py +1290 -284
  339. sky/server/state.py +20 -0
  340. sky/server/stream_utils.py +345 -57
  341. sky/server/uvicorn.py +217 -3
  342. sky/server/versions.py +270 -0
  343. sky/setup_files/MANIFEST.in +5 -0
  344. sky/setup_files/alembic.ini +156 -0
  345. sky/setup_files/dependencies.py +136 -31
  346. sky/setup_files/setup.py +44 -42
  347. sky/sky_logging.py +102 -5
  348. sky/skylet/attempt_skylet.py +1 -0
  349. sky/skylet/autostop_lib.py +129 -8
  350. sky/skylet/configs.py +27 -20
  351. sky/skylet/constants.py +171 -19
  352. sky/skylet/events.py +105 -21
  353. sky/skylet/job_lib.py +335 -104
  354. sky/skylet/log_lib.py +297 -18
  355. sky/skylet/log_lib.pyi +44 -1
  356. sky/skylet/ray_patches/__init__.py +17 -3
  357. sky/skylet/ray_patches/autoscaler.py.diff +18 -0
  358. sky/skylet/ray_patches/cli.py.diff +19 -0
  359. sky/skylet/ray_patches/command_runner.py.diff +17 -0
  360. sky/skylet/ray_patches/log_monitor.py.diff +20 -0
  361. sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
  362. sky/skylet/ray_patches/updater.py.diff +18 -0
  363. sky/skylet/ray_patches/worker.py.diff +41 -0
  364. sky/skylet/services.py +564 -0
  365. sky/skylet/skylet.py +63 -4
  366. sky/skylet/subprocess_daemon.py +103 -29
  367. sky/skypilot_config.py +506 -99
  368. sky/ssh_node_pools/__init__.py +1 -0
  369. sky/ssh_node_pools/core.py +135 -0
  370. sky/ssh_node_pools/server.py +233 -0
  371. sky/task.py +621 -137
  372. sky/templates/aws-ray.yml.j2 +10 -3
  373. sky/templates/azure-ray.yml.j2 +1 -1
  374. sky/templates/do-ray.yml.j2 +1 -1
  375. sky/templates/gcp-ray.yml.j2 +57 -0
  376. sky/templates/hyperbolic-ray.yml.j2 +67 -0
  377. sky/templates/jobs-controller.yaml.j2 +27 -24
  378. sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
  379. sky/templates/kubernetes-ray.yml.j2 +607 -51
  380. sky/templates/lambda-ray.yml.j2 +1 -1
  381. sky/templates/nebius-ray.yml.j2 +33 -12
  382. sky/templates/paperspace-ray.yml.j2 +1 -1
  383. sky/templates/primeintellect-ray.yml.j2 +71 -0
  384. sky/templates/runpod-ray.yml.j2 +9 -1
  385. sky/templates/scp-ray.yml.j2 +3 -50
  386. sky/templates/seeweb-ray.yml.j2 +108 -0
  387. sky/templates/shadeform-ray.yml.j2 +72 -0
  388. sky/templates/sky-serve-controller.yaml.j2 +22 -2
  389. sky/templates/websocket_proxy.py +178 -18
  390. sky/usage/usage_lib.py +18 -11
  391. sky/users/__init__.py +0 -0
  392. sky/users/model.conf +15 -0
  393. sky/users/permission.py +387 -0
  394. sky/users/rbac.py +121 -0
  395. sky/users/server.py +720 -0
  396. sky/users/token_service.py +218 -0
  397. sky/utils/accelerator_registry.py +34 -5
  398. sky/utils/admin_policy_utils.py +84 -38
  399. sky/utils/annotations.py +16 -5
  400. sky/utils/asyncio_utils.py +78 -0
  401. sky/utils/auth_utils.py +153 -0
  402. sky/utils/benchmark_utils.py +60 -0
  403. sky/utils/cli_utils/status_utils.py +159 -86
  404. sky/utils/cluster_utils.py +31 -9
  405. sky/utils/command_runner.py +354 -68
  406. sky/utils/command_runner.pyi +93 -3
  407. sky/utils/common.py +35 -8
  408. sky/utils/common_utils.py +310 -87
  409. sky/utils/config_utils.py +87 -5
  410. sky/utils/context.py +402 -0
  411. sky/utils/context_utils.py +222 -0
  412. sky/utils/controller_utils.py +264 -89
  413. sky/utils/dag_utils.py +31 -12
  414. sky/utils/db/__init__.py +0 -0
  415. sky/utils/db/db_utils.py +470 -0
  416. sky/utils/db/migration_utils.py +133 -0
  417. sky/utils/directory_utils.py +12 -0
  418. sky/utils/env_options.py +13 -0
  419. sky/utils/git.py +567 -0
  420. sky/utils/git_clone.sh +460 -0
  421. sky/utils/infra_utils.py +195 -0
  422. sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
  423. sky/utils/kubernetes/config_map_utils.py +133 -0
  424. sky/utils/kubernetes/create_cluster.sh +13 -27
  425. sky/utils/kubernetes/delete_cluster.sh +10 -7
  426. sky/utils/kubernetes/deploy_remote_cluster.py +1299 -0
  427. sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
  428. sky/utils/kubernetes/generate_kind_config.py +6 -66
  429. sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
  430. sky/utils/kubernetes/gpu_labeler.py +5 -5
  431. sky/utils/kubernetes/kubernetes_deploy_utils.py +354 -47
  432. sky/utils/kubernetes/ssh-tunnel.sh +379 -0
  433. sky/utils/kubernetes/ssh_utils.py +221 -0
  434. sky/utils/kubernetes_enums.py +8 -15
  435. sky/utils/lock_events.py +94 -0
  436. sky/utils/locks.py +368 -0
  437. sky/utils/log_utils.py +300 -6
  438. sky/utils/perf_utils.py +22 -0
  439. sky/utils/resource_checker.py +298 -0
  440. sky/utils/resources_utils.py +249 -32
  441. sky/utils/rich_utils.py +213 -37
  442. sky/utils/schemas.py +905 -147
  443. sky/utils/serialize_utils.py +16 -0
  444. sky/utils/status_lib.py +10 -0
  445. sky/utils/subprocess_utils.py +38 -15
  446. sky/utils/tempstore.py +70 -0
  447. sky/utils/timeline.py +24 -52
  448. sky/utils/ux_utils.py +84 -15
  449. sky/utils/validator.py +11 -1
  450. sky/utils/volume.py +86 -0
  451. sky/utils/yaml_utils.py +111 -0
  452. sky/volumes/__init__.py +13 -0
  453. sky/volumes/client/__init__.py +0 -0
  454. sky/volumes/client/sdk.py +149 -0
  455. sky/volumes/server/__init__.py +0 -0
  456. sky/volumes/server/core.py +258 -0
  457. sky/volumes/server/server.py +122 -0
  458. sky/volumes/volume.py +212 -0
  459. sky/workspaces/__init__.py +0 -0
  460. sky/workspaces/core.py +655 -0
  461. sky/workspaces/server.py +101 -0
  462. sky/workspaces/utils.py +56 -0
  463. skypilot_nightly-1.0.0.dev20251107.dist-info/METADATA +675 -0
  464. skypilot_nightly-1.0.0.dev20251107.dist-info/RECORD +594 -0
  465. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/WHEEL +1 -1
  466. sky/benchmark/benchmark_state.py +0 -256
  467. sky/benchmark/benchmark_utils.py +0 -641
  468. sky/clouds/service_catalog/constants.py +0 -7
  469. sky/dashboard/out/_next/static/LksQgChY5izXjokL3LcEu/_buildManifest.js +0 -1
  470. sky/dashboard/out/_next/static/chunks/236-f49500b82ad5392d.js +0 -6
  471. sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
  472. sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
  473. sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
  474. sky/dashboard/out/_next/static/chunks/845-0f8017370869e269.js +0 -1
  475. sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
  476. sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
  477. sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
  478. sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
  479. sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
  480. sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
  481. sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
  482. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-e15db85d0ea1fbe1.js +0 -1
  483. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
  484. sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
  485. sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
  486. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-03f279c6741fb48b.js +0 -1
  487. sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
  488. sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
  489. sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
  490. sky/jobs/dashboard/dashboard.py +0 -223
  491. sky/jobs/dashboard/static/favicon.ico +0 -0
  492. sky/jobs/dashboard/templates/index.html +0 -831
  493. sky/jobs/server/dashboard_utils.py +0 -69
  494. sky/skylet/providers/scp/__init__.py +0 -2
  495. sky/skylet/providers/scp/config.py +0 -149
  496. sky/skylet/providers/scp/node_provider.py +0 -578
  497. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  498. sky/utils/db_utils.py +0 -100
  499. sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
  500. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  501. skypilot_nightly-1.0.0.dev20250509.dist-info/METADATA +0 -361
  502. skypilot_nightly-1.0.0.dev20250509.dist-info/RECORD +0 -396
  503. /sky/{clouds/service_catalog → catalog}/config.py +0 -0
  504. /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
  505. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
  506. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
  507. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
  508. /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
  509. /sky/dashboard/out/_next/static/{LksQgChY5izXjokL3LcEu → zB0ed6ge_W1MDszVHhijS}/_ssgManifest.js +0 -0
  510. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/entry_points.txt +0 -0
  511. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/licenses/LICENSE +0 -0
  512. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/top_level.txt +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')