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
@@ -11,18 +11,41 @@ This script is useful for users who do not have local Kubernetes credentials.
11
11
  import asyncio
12
12
  from http.cookiejar import MozillaCookieJar
13
13
  import os
14
+ import struct
14
15
  import sys
15
- from typing import Dict
16
+ import time
17
+ from typing import Dict, Optional
16
18
  from urllib.request import Request
17
19
 
20
+ import requests
18
21
  import websockets
22
+ from websockets.asyncio.client import ClientConnection
19
23
  from websockets.asyncio.client import connect
20
24
 
25
+ from sky.server import constants
26
+ from sky.server.server import KubernetesSSHMessageType
27
+ from sky.skylet import constants as skylet_constants
28
+
29
+ BUFFER_SIZE = 2**16 # 64KB
30
+ HEARTBEAT_INTERVAL_SECONDS = 10
31
+
32
+ # Environment variable for a file path to the API cookie file.
33
+ # Keep in sync with server/constants.py
34
+ API_COOKIE_FILE_ENV_VAR = 'SKYPILOT_API_COOKIE_FILE'
35
+ # Default file if unset.
36
+ # Keep in sync with server/constants.py
37
+ API_COOKIE_FILE_DEFAULT_LOCATION = '~/.sky/cookies.txt'
38
+
39
+ MAX_UNANSWERED_PINGS = 100
40
+
21
41
 
22
42
  def _get_cookie_header(url: str) -> Dict[str, str]:
23
43
  """Extract Cookie header value from a cookie jar for a specific URL"""
24
- cookie_path = os.environ.get('SKYPILOT_API_COOKIE_FILE')
44
+ cookie_path = os.environ.get(API_COOKIE_FILE_ENV_VAR)
25
45
  if cookie_path is None:
46
+ cookie_path = API_COOKIE_FILE_DEFAULT_LOCATION
47
+ cookie_path = os.path.expanduser(cookie_path)
48
+ if not os.path.exists(cookie_path):
26
49
  return {}
27
50
 
28
51
  request = Request(url)
@@ -36,7 +59,7 @@ def _get_cookie_header(url: str) -> Dict[str, str]:
36
59
  return {'Cookie': cookie_header}
37
60
 
38
61
 
39
- async def main(url: str) -> None:
62
+ async def main(url: str, timestamps_supported: bool) -> None:
40
63
  cookie_header = _get_cookie_header(url)
41
64
  async with connect(url,
42
65
  ping_interval=None,
@@ -51,39 +74,160 @@ async def main(url: str) -> None:
51
74
  old_settings = None
52
75
 
53
76
  try:
54
- await asyncio.gather(stdin_to_websocket(websocket),
55
- websocket_to_stdout(websocket))
77
+ loop = asyncio.get_running_loop()
78
+ # Use asyncio.Stream primitives to wrap stdin and stdout, this is to
79
+ # avoid creating a new thread for each read/write operation
80
+ # excessively.
81
+ stdin_reader = asyncio.StreamReader()
82
+ protocol = asyncio.StreamReaderProtocol(stdin_reader)
83
+ await loop.connect_read_pipe(lambda: protocol, sys.stdin)
84
+ transport, protocol = await loop.connect_write_pipe(
85
+ asyncio.streams.FlowControlMixin, sys.stdout) # type: ignore
86
+ stdout_writer = asyncio.StreamWriter(transport, protocol, None,
87
+ loop)
88
+ # Dictionary to store last ping time for latency measurement
89
+ last_ping_time_dict: Optional[Dict[int, float]] = None
90
+ if timestamps_supported:
91
+ last_ping_time_dict = {}
92
+
93
+ # Use an Event to signal when websocket is closed
94
+ websocket_closed_event = asyncio.Event()
95
+ websocket_lock = asyncio.Lock()
96
+
97
+ await asyncio.gather(
98
+ stdin_to_websocket(stdin_reader, websocket,
99
+ timestamps_supported, websocket_closed_event,
100
+ websocket_lock),
101
+ websocket_to_stdout(websocket, stdout_writer,
102
+ timestamps_supported, last_ping_time_dict,
103
+ websocket_closed_event, websocket_lock),
104
+ latency_monitor(websocket, last_ping_time_dict,
105
+ websocket_closed_event, websocket_lock),
106
+ return_exceptions=True)
56
107
  finally:
57
108
  if old_settings:
58
109
  termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN,
59
110
  old_settings)
60
111
 
61
112
 
62
- async def stdin_to_websocket(websocket):
113
+ async def latency_monitor(websocket: ClientConnection,
114
+ last_ping_time_dict: Optional[dict],
115
+ websocket_closed_event: asyncio.Event,
116
+ websocket_lock: asyncio.Lock):
117
+ """Periodically send PING messages (type 1) to measure latency."""
118
+ if last_ping_time_dict is None:
119
+ return
120
+ next_id = 0
121
+ while not websocket_closed_event.is_set():
122
+ try:
123
+ await asyncio.sleep(HEARTBEAT_INTERVAL_SECONDS)
124
+ if len(last_ping_time_dict) >= MAX_UNANSWERED_PINGS:
125
+ # We are not getting responses, clear the dictionary so
126
+ # as not to grow unbounded.
127
+ last_ping_time_dict.clear()
128
+ ping_time = time.time()
129
+ next_id += 1
130
+ last_ping_time_dict[next_id] = ping_time
131
+ message_header_bytes = struct.pack(
132
+ '!BI', KubernetesSSHMessageType.PINGPONG.value, next_id)
133
+ try:
134
+ async with websocket_lock:
135
+ await websocket.send(message_header_bytes)
136
+ except websockets.exceptions.ConnectionClosed as e:
137
+ # Websocket is already closed.
138
+ print(f'Failed to send PING message: {e}', file=sys.stderr)
139
+ break
140
+ except Exception as e:
141
+ print(f'Error in latency_monitor: {e}', file=sys.stderr)
142
+ websocket_closed_event.set()
143
+ raise e
144
+
145
+
146
+ async def stdin_to_websocket(reader: asyncio.StreamReader,
147
+ websocket: ClientConnection,
148
+ timestamps_supported: bool,
149
+ websocket_closed_event: asyncio.Event,
150
+ websocket_lock: asyncio.Lock):
63
151
  try:
64
- while True:
65
- data = await asyncio.get_event_loop().run_in_executor(
66
- None, sys.stdin.buffer.read, 1)
152
+ while not websocket_closed_event.is_set():
153
+ # Read at most BUFFER_SIZE bytes, this not affect
154
+ # responsiveness since it will return as soon as
155
+ # there is at least one byte.
156
+ # The BUFFER_SIZE is chosen to be large enough to improve
157
+ # throughput.
158
+ data = await reader.read(BUFFER_SIZE)
159
+
67
160
  if not data:
68
161
  break
69
- await websocket.send(data)
162
+ if timestamps_supported:
163
+ # Send message with type 0 to indicate data.
164
+ message_type_bytes = struct.pack(
165
+ '!B', KubernetesSSHMessageType.REGULAR_DATA.value)
166
+ data = message_type_bytes + data
167
+ async with websocket_lock:
168
+ await websocket.send(data)
169
+
70
170
  except Exception as e: # pylint: disable=broad-except
71
171
  print(f'Error in stdin_to_websocket: {e}', file=sys.stderr)
72
172
  finally:
73
- await websocket.close()
173
+ async with websocket_lock:
174
+ await websocket.close()
175
+ websocket_closed_event.set()
74
176
 
75
177
 
76
- async def websocket_to_stdout(websocket):
178
+ async def websocket_to_stdout(websocket: ClientConnection,
179
+ writer: asyncio.StreamWriter,
180
+ timestamps_supported: bool,
181
+ last_ping_time_dict: Optional[dict],
182
+ websocket_closed_event: asyncio.Event,
183
+ websocket_lock: asyncio.Lock):
77
184
  try:
78
- while True:
185
+ while not websocket_closed_event.is_set():
79
186
  message = await websocket.recv()
80
- sys.stdout.buffer.write(message)
81
- await asyncio.get_event_loop().run_in_executor(
82
- None, sys.stdout.buffer.flush)
187
+ if (timestamps_supported and len(message) > 0 and
188
+ last_ping_time_dict is not None):
189
+ message_type = struct.unpack('!B', message[:1])[0]
190
+ if message_type == KubernetesSSHMessageType.REGULAR_DATA.value:
191
+ # Regular data - strip type byte and write to stdout
192
+ message = message[1:]
193
+ elif message_type == KubernetesSSHMessageType.PINGPONG.value:
194
+ # PONG response - calculate latency and send measurement
195
+ if not len(message) == struct.calcsize('!BI'):
196
+ raise ValueError(
197
+ f'Invalid PONG message length: {len(message)}')
198
+ pong_id = struct.unpack('!I', message[1:5])[0]
199
+ pong_time = time.time()
200
+
201
+ ping_time = last_ping_time_dict.pop(pong_id, None)
202
+
203
+ if ping_time is None:
204
+ continue
205
+
206
+ latency_seconds = pong_time - ping_time
207
+ latency_ms = int(latency_seconds * 1000)
208
+
209
+ # Send latency measurement (type 2)
210
+ message_type_bytes = struct.pack(
211
+ '!B',
212
+ KubernetesSSHMessageType.LATENCY_MEASUREMENT.value)
213
+ latency_bytes = struct.pack('!Q', latency_ms)
214
+ message = message_type_bytes + latency_bytes
215
+ # Send to server.
216
+ async with websocket_lock:
217
+ await websocket.send(message)
218
+ continue
219
+ # No timestamps support, write directly
220
+ writer.write(message)
221
+ await writer.drain()
83
222
  except websockets.exceptions.ConnectionClosed:
84
223
  print('WebSocket connection closed', file=sys.stderr)
85
224
  except Exception as e: # pylint: disable=broad-except
86
225
  print(f'Error in websocket_to_stdout: {e}', file=sys.stderr)
226
+ raise e
227
+ finally:
228
+ async with websocket_lock:
229
+ await websocket.close()
230
+ websocket_closed_event.set()
87
231
 
88
232
 
89
233
  if __name__ == '__main__':
@@ -93,11 +237,27 @@ if __name__ == '__main__':
93
237
  # TODO(aylei): Remove this after 0.10.0
94
238
  server_url = f'http://{server_url}'
95
239
 
240
+ disable_latency_measurement = os.environ.get(
241
+ skylet_constants.SSH_DISABLE_LATENCY_MEASUREMENT_ENV_VAR, '0') == '1'
242
+ if disable_latency_measurement:
243
+ timestamps_are_supported = False
244
+ else:
245
+ health_url = f'{server_url}/api/health'
246
+ cookie_hdr = _get_cookie_header(health_url)
247
+ health_response = requests.get(health_url, headers=cookie_hdr)
248
+ health_data = health_response.json()
249
+ timestamps_are_supported = int(health_data.get('api_version', 0)) > 21
250
+
96
251
  server_proto, server_fqdn = server_url.split('://')
97
252
  websocket_proto = 'ws'
98
253
  if server_proto == 'https':
99
254
  websocket_proto = 'wss'
100
255
  server_url = f'{websocket_proto}://{server_fqdn}'
256
+
257
+ client_version_str = (f'&client_version={constants.API_VERSION}'
258
+ if timestamps_are_supported else '')
259
+
101
260
  websocket_url = (f'{server_url}/kubernetes-pod-ssh-proxy'
102
- f'?cluster_name={sys.argv[2]}')
103
- asyncio.run(main(websocket_url))
261
+ f'?cluster_name={sys.argv[2]}'
262
+ f'{client_version_str}')
263
+ asyncio.run(main(websocket_url, timestamps_are_supported))
sky/usage/usage_lib.py CHANGED
@@ -10,13 +10,17 @@ import traceback
10
10
  import typing
11
11
  from typing import Any, Callable, Dict, List, Optional, Union
12
12
 
13
+ from typing_extensions import ParamSpec
14
+
13
15
  import sky
14
16
  from sky import sky_logging
17
+ from sky import skypilot_config
15
18
  from sky.adaptors import common as adaptors_common
16
19
  from sky.usage import constants
17
20
  from sky.utils import common_utils
18
21
  from sky.utils import env_options
19
22
  from sky.utils import ux_utils
23
+ from sky.utils import yaml_utils
20
24
 
21
25
  if typing.TYPE_CHECKING:
22
26
  import inspect
@@ -164,6 +168,7 @@ class UsageMessageToReport(MessageToReport):
164
168
  self.runtimes: Dict[str, float] = {} # update_runtime
165
169
  self.exception: Optional[str] = None # entrypoint_context
166
170
  self.stacktrace: Optional[str] = None # entrypoint_context
171
+ self.skypilot_config: Optional[Dict[str, Any]] = None
167
172
 
168
173
  # Whether API server is deployed remotely.
169
174
  self.using_remote_api_server: bool = (
@@ -174,6 +179,7 @@ class UsageMessageToReport(MessageToReport):
174
179
  self.client_entrypoint = common_utils.get_current_client_entrypoint(
175
180
  msg)
176
181
  self.entrypoint = msg
182
+ self.skypilot_config = dict(skypilot_config.to_dict())
177
183
 
178
184
  def set_internal(self):
179
185
  self.internal = True
@@ -205,8 +211,8 @@ class UsageMessageToReport(MessageToReport):
205
211
  logger.debug('Multiple accelerators are not supported: '
206
212
  f'{resources.accelerators}.')
207
213
  self.task_accelerators = list(resources.accelerators.keys())[0]
208
- self.task_num_accelerators = resources.accelerators[
209
- self.task_accelerators]
214
+ self.task_num_accelerators = int(
215
+ resources.accelerators[self.task_accelerators])
210
216
  else:
211
217
  self.task_accelerators = None
212
218
  self.task_num_accelerators = None
@@ -245,7 +251,8 @@ class UsageMessageToReport(MessageToReport):
245
251
  logger.debug('Multiple accelerators are not supported: '
246
252
  f'{resources.accelerators}.')
247
253
  self.accelerators = list(resources.accelerators.keys())[0]
248
- self.num_accelerators = resources.accelerators[self.accelerators]
254
+ self.num_accelerators = int(
255
+ resources.accelerators[self.accelerators])
249
256
  else:
250
257
  self.accelerators = None
251
258
  self.num_accelerators = None
@@ -399,7 +406,7 @@ def _clean_yaml(yaml_info: Dict[str, Optional[str]]):
399
406
  contents = inspect.getsource(contents)
400
407
 
401
408
  if type(contents) in constants.USAGE_MESSAGE_REDACT_TYPES:
402
- lines = common_utils.dump_yaml_str({
409
+ lines = yaml_utils.dump_yaml_str({
403
410
  redact_type: contents
404
411
  }).strip().split('\n')
405
412
  message = (f'{len(lines)} lines {redact_type.upper()}'
@@ -428,7 +435,7 @@ def prepare_json_from_yaml_config(
428
435
  with open(yaml_config_or_path, 'r', encoding='utf-8') as f:
429
436
  lines = f.readlines()
430
437
  comment_lines = [line for line in lines if line.startswith('#')]
431
- yaml_info = common_utils.read_yaml_all(yaml_config_or_path)
438
+ yaml_info = yaml_utils.read_yaml_all(yaml_config_or_path)
432
439
 
433
440
  for i in range(len(yaml_info)):
434
441
  if yaml_info[i] is None:
@@ -516,26 +523,26 @@ def entrypoint_context(name: str, fallback: bool = False):
516
523
 
517
524
 
518
525
  T = typing.TypeVar('T')
526
+ P = ParamSpec('P')
519
527
 
520
528
 
521
529
  @typing.overload
522
530
  def entrypoint(
523
531
  name_or_fn: str,
524
- fallback: bool = False
525
- ) -> Callable[[Callable[..., T]], Callable[..., T]]:
532
+ fallback: bool = False) -> Callable[[Callable[P, T]], Callable[P, T]]:
526
533
  ...
527
534
 
528
535
 
529
536
  @typing.overload
530
- def entrypoint(name_or_fn: Callable[..., T],
531
- fallback: bool = False) -> Callable[..., T]:
537
+ def entrypoint(name_or_fn: Callable[P, T],
538
+ fallback: bool = False) -> Callable[P, T]:
532
539
  ...
533
540
 
534
541
 
535
542
  def entrypoint(
536
- name_or_fn: Union[str, Callable[..., T]],
543
+ name_or_fn: Union[str, Callable[P, T]],
537
544
  fallback: bool = False
538
- ) -> Union[Callable[..., T], Callable[[Callable[..., T]], Callable[..., T]]]:
545
+ ) -> Union[Callable[P, T], Callable[[Callable[P, T]], Callable[P, T]]]:
539
546
  return common_utils.make_decorator(entrypoint_context,
540
547
  name_or_fn,
541
548
  fallback=fallback)
sky/users/__init__.py ADDED
File without changes
sky/users/model.conf ADDED
@@ -0,0 +1,15 @@
1
+ # rbac_model.conf
2
+ [request_definition]
3
+ r = sub, obj, act
4
+
5
+ [policy_definition]
6
+ p = sub, obj, act
7
+
8
+ [role_definition]
9
+ g = _, _
10
+
11
+ [policy_effect]
12
+ e = some(where (p.eft == allow))
13
+
14
+ [matchers]
15
+ m = (g(r.sub, p.sub)|| p.sub == '*') && r.obj == p.obj && r.act == p.act