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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. sky/__init__.py +12 -2
  2. sky/adaptors/aws.py +27 -22
  3. sky/adaptors/common.py +25 -2
  4. sky/adaptors/coreweave.py +278 -0
  5. sky/adaptors/do.py +8 -2
  6. sky/adaptors/gcp.py +11 -0
  7. sky/adaptors/ibm.py +5 -2
  8. sky/adaptors/kubernetes.py +64 -0
  9. sky/adaptors/nebius.py +3 -1
  10. sky/adaptors/primeintellect.py +1 -0
  11. sky/adaptors/seeweb.py +183 -0
  12. sky/adaptors/shadeform.py +89 -0
  13. sky/adaptors/slurm.py +478 -0
  14. sky/admin_policy.py +20 -0
  15. sky/authentication.py +157 -263
  16. sky/backends/__init__.py +3 -2
  17. sky/backends/backend.py +11 -3
  18. sky/backends/backend_utils.py +630 -185
  19. sky/backends/cloud_vm_ray_backend.py +1111 -928
  20. sky/backends/local_docker_backend.py +9 -5
  21. sky/backends/task_codegen.py +971 -0
  22. sky/backends/wheel_utils.py +18 -0
  23. sky/catalog/__init__.py +8 -3
  24. sky/catalog/aws_catalog.py +4 -0
  25. sky/catalog/common.py +19 -1
  26. sky/catalog/data_fetchers/fetch_aws.py +102 -80
  27. sky/catalog/data_fetchers/fetch_gcp.py +30 -3
  28. sky/catalog/data_fetchers/fetch_nebius.py +9 -6
  29. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  30. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  31. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  32. sky/catalog/kubernetes_catalog.py +36 -32
  33. sky/catalog/primeintellect_catalog.py +95 -0
  34. sky/catalog/runpod_catalog.py +5 -1
  35. sky/catalog/seeweb_catalog.py +184 -0
  36. sky/catalog/shadeform_catalog.py +165 -0
  37. sky/catalog/slurm_catalog.py +243 -0
  38. sky/check.py +87 -46
  39. sky/client/cli/command.py +1004 -434
  40. sky/client/cli/flags.py +4 -2
  41. sky/{volumes/utils.py → client/cli/table_utils.py} +111 -13
  42. sky/client/cli/utils.py +79 -0
  43. sky/client/common.py +12 -2
  44. sky/client/sdk.py +188 -65
  45. sky/client/sdk_async.py +34 -33
  46. sky/cloud_stores.py +82 -3
  47. sky/clouds/__init__.py +8 -0
  48. sky/clouds/aws.py +337 -129
  49. sky/clouds/azure.py +24 -18
  50. sky/clouds/cloud.py +47 -13
  51. sky/clouds/cudo.py +16 -13
  52. sky/clouds/do.py +9 -7
  53. sky/clouds/fluidstack.py +12 -5
  54. sky/clouds/gcp.py +14 -7
  55. sky/clouds/hyperbolic.py +12 -5
  56. sky/clouds/ibm.py +12 -5
  57. sky/clouds/kubernetes.py +80 -45
  58. sky/clouds/lambda_cloud.py +12 -5
  59. sky/clouds/nebius.py +23 -9
  60. sky/clouds/oci.py +19 -12
  61. sky/clouds/paperspace.py +4 -1
  62. sky/clouds/primeintellect.py +317 -0
  63. sky/clouds/runpod.py +85 -24
  64. sky/clouds/scp.py +12 -8
  65. sky/clouds/seeweb.py +477 -0
  66. sky/clouds/shadeform.py +400 -0
  67. sky/clouds/slurm.py +578 -0
  68. sky/clouds/ssh.py +6 -3
  69. sky/clouds/utils/scp_utils.py +61 -50
  70. sky/clouds/vast.py +43 -27
  71. sky/clouds/vsphere.py +14 -16
  72. sky/core.py +296 -195
  73. sky/dashboard/out/404.html +1 -1
  74. sky/dashboard/out/_next/static/KYAhEFa3FTfq4JyKVgo-s/_buildManifest.js +1 -0
  75. sky/dashboard/out/_next/static/chunks/1141-9c810f01ff4f398a.js +11 -0
  76. sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
  77. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  78. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  79. sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
  80. sky/dashboard/out/_next/static/chunks/3294.ddda8c6c6f9f24dc.js +1 -0
  81. sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
  82. sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-b589397dc09c5b4e.js} +1 -1
  83. sky/dashboard/out/_next/static/chunks/3850-fd5696f3bbbaddae.js +1 -0
  84. sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
  85. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  86. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  87. sky/dashboard/out/_next/static/chunks/6856-da20c5fd999f319c.js +1 -0
  88. sky/dashboard/out/_next/static/chunks/6990-09cbf02d3cd518c3.js +1 -0
  89. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  90. sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
  91. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  92. sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
  93. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  94. sky/dashboard/out/_next/static/chunks/9353-8369df1cf105221c.js +1 -0
  95. sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
  96. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  97. sky/dashboard/out/_next/static/chunks/pages/_app-68b647e26f9d2793.js +34 -0
  98. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-33f525539665fdfd.js +16 -0
  99. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a7565f586ef86467.js +1 -0
  100. sky/dashboard/out/_next/static/chunks/pages/clusters-9e5d47818b9bdadd.js +1 -0
  101. sky/dashboard/out/_next/static/chunks/pages/{config-dfb9bf07b13045f4.js → config-718cdc365de82689.js} +1 -1
  102. sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-12c559ec4d81fdbd.js} +1 -1
  103. sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-d187cd0413d72475.js} +1 -1
  104. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-895847b6cf200b04.js +16 -0
  105. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-8d0f4655400b4eb9.js +21 -0
  106. sky/dashboard/out/_next/static/chunks/pages/jobs-e5a98f17f8513a96.js +1 -0
  107. sky/dashboard/out/_next/static/chunks/pages/plugins/[...slug]-4f46050ca065d8f8.js +1 -0
  108. sky/dashboard/out/_next/static/chunks/pages/users-2f7646eb77785a2c.js +1 -0
  109. sky/dashboard/out/_next/static/chunks/pages/volumes-ef19d49c6d0e8500.js +1 -0
  110. sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-96e0f298308da7e2.js} +1 -1
  111. sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-cb4da3abe08ebf19.js} +1 -1
  112. sky/dashboard/out/_next/static/chunks/webpack-fba3de387ff6bb08.js +1 -0
  113. sky/dashboard/out/_next/static/css/c5a4cfd2600fc715.css +3 -0
  114. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  115. sky/dashboard/out/clusters/[cluster].html +1 -1
  116. sky/dashboard/out/clusters.html +1 -1
  117. sky/dashboard/out/config.html +1 -1
  118. sky/dashboard/out/index.html +1 -1
  119. sky/dashboard/out/infra/[context].html +1 -1
  120. sky/dashboard/out/infra.html +1 -1
  121. sky/dashboard/out/jobs/[job].html +1 -1
  122. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  123. sky/dashboard/out/jobs.html +1 -1
  124. sky/dashboard/out/plugins/[...slug].html +1 -0
  125. sky/dashboard/out/users.html +1 -1
  126. sky/dashboard/out/volumes.html +1 -1
  127. sky/dashboard/out/workspace/new.html +1 -1
  128. sky/dashboard/out/workspaces/[name].html +1 -1
  129. sky/dashboard/out/workspaces.html +1 -1
  130. sky/data/data_utils.py +92 -1
  131. sky/data/mounting_utils.py +177 -30
  132. sky/data/storage.py +200 -19
  133. sky/data/storage_utils.py +10 -45
  134. sky/exceptions.py +18 -7
  135. sky/execution.py +74 -31
  136. sky/global_user_state.py +605 -191
  137. sky/jobs/__init__.py +2 -0
  138. sky/jobs/client/sdk.py +101 -4
  139. sky/jobs/client/sdk_async.py +31 -5
  140. sky/jobs/constants.py +15 -8
  141. sky/jobs/controller.py +726 -284
  142. sky/jobs/file_content_utils.py +128 -0
  143. sky/jobs/log_gc.py +193 -0
  144. sky/jobs/recovery_strategy.py +250 -100
  145. sky/jobs/scheduler.py +271 -173
  146. sky/jobs/server/core.py +367 -114
  147. sky/jobs/server/server.py +81 -35
  148. sky/jobs/server/utils.py +89 -35
  149. sky/jobs/state.py +1498 -620
  150. sky/jobs/utils.py +771 -306
  151. sky/logs/agent.py +40 -5
  152. sky/logs/aws.py +9 -19
  153. sky/metrics/utils.py +282 -39
  154. sky/models.py +2 -0
  155. sky/optimizer.py +7 -6
  156. sky/provision/__init__.py +38 -1
  157. sky/provision/aws/config.py +34 -13
  158. sky/provision/aws/instance.py +5 -2
  159. sky/provision/azure/instance.py +5 -3
  160. sky/provision/common.py +22 -0
  161. sky/provision/cudo/instance.py +4 -3
  162. sky/provision/do/instance.py +4 -3
  163. sky/provision/docker_utils.py +112 -28
  164. sky/provision/fluidstack/instance.py +6 -5
  165. sky/provision/gcp/config.py +6 -1
  166. sky/provision/gcp/instance.py +4 -2
  167. sky/provision/hyperbolic/instance.py +4 -2
  168. sky/provision/instance_setup.py +66 -20
  169. sky/provision/kubernetes/__init__.py +2 -0
  170. sky/provision/kubernetes/config.py +7 -44
  171. sky/provision/kubernetes/constants.py +0 -1
  172. sky/provision/kubernetes/instance.py +609 -213
  173. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  174. sky/provision/kubernetes/network.py +12 -8
  175. sky/provision/kubernetes/network_utils.py +8 -25
  176. sky/provision/kubernetes/utils.py +422 -422
  177. sky/provision/kubernetes/volume.py +150 -18
  178. sky/provision/lambda_cloud/instance.py +16 -13
  179. sky/provision/nebius/instance.py +6 -2
  180. sky/provision/nebius/utils.py +103 -86
  181. sky/provision/oci/instance.py +4 -2
  182. sky/provision/paperspace/instance.py +4 -3
  183. sky/provision/primeintellect/__init__.py +10 -0
  184. sky/provision/primeintellect/config.py +11 -0
  185. sky/provision/primeintellect/instance.py +454 -0
  186. sky/provision/primeintellect/utils.py +398 -0
  187. sky/provision/provisioner.py +45 -15
  188. sky/provision/runpod/__init__.py +2 -0
  189. sky/provision/runpod/instance.py +4 -3
  190. sky/provision/runpod/volume.py +69 -13
  191. sky/provision/scp/instance.py +307 -130
  192. sky/provision/seeweb/__init__.py +11 -0
  193. sky/provision/seeweb/config.py +13 -0
  194. sky/provision/seeweb/instance.py +812 -0
  195. sky/provision/shadeform/__init__.py +11 -0
  196. sky/provision/shadeform/config.py +12 -0
  197. sky/provision/shadeform/instance.py +351 -0
  198. sky/provision/shadeform/shadeform_utils.py +83 -0
  199. sky/provision/slurm/__init__.py +12 -0
  200. sky/provision/slurm/config.py +13 -0
  201. sky/provision/slurm/instance.py +572 -0
  202. sky/provision/slurm/utils.py +583 -0
  203. sky/provision/vast/instance.py +9 -4
  204. sky/provision/vast/utils.py +10 -6
  205. sky/provision/volume.py +164 -0
  206. sky/provision/vsphere/common/ssl_helper.py +1 -1
  207. sky/provision/vsphere/common/vapiconnect.py +2 -1
  208. sky/provision/vsphere/common/vim_utils.py +3 -2
  209. sky/provision/vsphere/instance.py +8 -6
  210. sky/provision/vsphere/vsphere_utils.py +8 -1
  211. sky/resources.py +11 -3
  212. sky/schemas/api/responses.py +107 -6
  213. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  214. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  215. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  216. sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
  217. sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
  218. sky/schemas/db/serve_state/002_yaml_content.py +34 -0
  219. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  220. sky/schemas/db/spot_jobs/002_cluster_pool.py +3 -3
  221. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  222. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  223. sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
  224. sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
  225. sky/schemas/generated/jobsv1_pb2.py +86 -0
  226. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  227. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  228. sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
  229. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  230. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  231. sky/schemas/generated/servev1_pb2.py +58 -0
  232. sky/schemas/generated/servev1_pb2.pyi +115 -0
  233. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  234. sky/serve/autoscalers.py +2 -0
  235. sky/serve/client/impl.py +55 -21
  236. sky/serve/constants.py +4 -3
  237. sky/serve/controller.py +17 -11
  238. sky/serve/load_balancing_policies.py +1 -1
  239. sky/serve/replica_managers.py +219 -142
  240. sky/serve/serve_rpc_utils.py +179 -0
  241. sky/serve/serve_state.py +63 -54
  242. sky/serve/serve_utils.py +145 -109
  243. sky/serve/server/core.py +46 -25
  244. sky/serve/server/impl.py +311 -162
  245. sky/serve/server/server.py +21 -19
  246. sky/serve/service.py +84 -68
  247. sky/serve/service_spec.py +45 -7
  248. sky/server/auth/loopback.py +38 -0
  249. sky/server/auth/oauth2_proxy.py +12 -7
  250. sky/server/common.py +47 -24
  251. sky/server/config.py +62 -28
  252. sky/server/constants.py +9 -1
  253. sky/server/daemons.py +109 -38
  254. sky/server/metrics.py +76 -96
  255. sky/server/middleware_utils.py +166 -0
  256. sky/server/plugins.py +222 -0
  257. sky/server/requests/executor.py +384 -145
  258. sky/server/requests/payloads.py +83 -19
  259. sky/server/requests/preconditions.py +15 -13
  260. sky/server/requests/request_names.py +123 -0
  261. sky/server/requests/requests.py +511 -157
  262. sky/server/requests/serializers/decoders.py +48 -17
  263. sky/server/requests/serializers/encoders.py +102 -20
  264. sky/server/requests/serializers/return_value_serializers.py +60 -0
  265. sky/server/requests/threads.py +117 -0
  266. sky/server/rest.py +116 -24
  267. sky/server/server.py +497 -179
  268. sky/server/server_utils.py +30 -0
  269. sky/server/stream_utils.py +219 -45
  270. sky/server/uvicorn.py +30 -19
  271. sky/setup_files/MANIFEST.in +6 -1
  272. sky/setup_files/alembic.ini +8 -0
  273. sky/setup_files/dependencies.py +64 -19
  274. sky/setup_files/setup.py +44 -44
  275. sky/sky_logging.py +13 -5
  276. sky/skylet/attempt_skylet.py +116 -24
  277. sky/skylet/configs.py +3 -1
  278. sky/skylet/constants.py +139 -29
  279. sky/skylet/events.py +74 -14
  280. sky/skylet/executor/__init__.py +1 -0
  281. sky/skylet/executor/slurm.py +189 -0
  282. sky/skylet/job_lib.py +143 -105
  283. sky/skylet/log_lib.py +252 -8
  284. sky/skylet/log_lib.pyi +47 -7
  285. sky/skylet/providers/ibm/node_provider.py +12 -8
  286. sky/skylet/providers/ibm/vpc_provider.py +13 -12
  287. sky/skylet/runtime_utils.py +21 -0
  288. sky/skylet/services.py +524 -0
  289. sky/skylet/skylet.py +27 -2
  290. sky/skylet/subprocess_daemon.py +104 -28
  291. sky/skypilot_config.py +99 -79
  292. sky/ssh_node_pools/constants.py +12 -0
  293. sky/ssh_node_pools/core.py +40 -3
  294. sky/ssh_node_pools/deploy/__init__.py +4 -0
  295. sky/ssh_node_pools/deploy/deploy.py +952 -0
  296. sky/ssh_node_pools/deploy/tunnel_utils.py +199 -0
  297. sky/ssh_node_pools/deploy/utils.py +173 -0
  298. sky/ssh_node_pools/server.py +20 -21
  299. sky/{utils/kubernetes/ssh_utils.py → ssh_node_pools/utils.py} +9 -6
  300. sky/task.py +221 -104
  301. sky/templates/aws-ray.yml.j2 +1 -0
  302. sky/templates/azure-ray.yml.j2 +1 -0
  303. sky/templates/cudo-ray.yml.j2 +1 -0
  304. sky/templates/do-ray.yml.j2 +1 -0
  305. sky/templates/fluidstack-ray.yml.j2 +1 -0
  306. sky/templates/gcp-ray.yml.j2 +1 -0
  307. sky/templates/hyperbolic-ray.yml.j2 +1 -0
  308. sky/templates/ibm-ray.yml.j2 +2 -1
  309. sky/templates/jobs-controller.yaml.j2 +3 -0
  310. sky/templates/kubernetes-ray.yml.j2 +204 -55
  311. sky/templates/lambda-ray.yml.j2 +1 -0
  312. sky/templates/nebius-ray.yml.j2 +3 -0
  313. sky/templates/oci-ray.yml.j2 +1 -0
  314. sky/templates/paperspace-ray.yml.j2 +1 -0
  315. sky/templates/primeintellect-ray.yml.j2 +72 -0
  316. sky/templates/runpod-ray.yml.j2 +1 -0
  317. sky/templates/scp-ray.yml.j2 +1 -0
  318. sky/templates/seeweb-ray.yml.j2 +171 -0
  319. sky/templates/shadeform-ray.yml.j2 +73 -0
  320. sky/templates/slurm-ray.yml.j2 +85 -0
  321. sky/templates/vast-ray.yml.j2 +2 -0
  322. sky/templates/vsphere-ray.yml.j2 +1 -0
  323. sky/templates/websocket_proxy.py +188 -43
  324. sky/usage/usage_lib.py +16 -4
  325. sky/users/model.conf +1 -1
  326. sky/users/permission.py +84 -44
  327. sky/users/rbac.py +31 -3
  328. sky/utils/accelerator_registry.py +6 -3
  329. sky/utils/admin_policy_utils.py +18 -5
  330. sky/utils/annotations.py +128 -6
  331. sky/utils/asyncio_utils.py +78 -0
  332. sky/utils/atomic.py +1 -1
  333. sky/utils/auth_utils.py +153 -0
  334. sky/utils/cli_utils/status_utils.py +12 -7
  335. sky/utils/cluster_utils.py +28 -6
  336. sky/utils/command_runner.py +283 -30
  337. sky/utils/command_runner.pyi +63 -7
  338. sky/utils/common.py +3 -1
  339. sky/utils/common_utils.py +55 -7
  340. sky/utils/config_utils.py +1 -14
  341. sky/utils/context.py +127 -40
  342. sky/utils/context_utils.py +73 -18
  343. sky/utils/controller_utils.py +229 -70
  344. sky/utils/db/db_utils.py +95 -18
  345. sky/utils/db/kv_cache.py +149 -0
  346. sky/utils/db/migration_utils.py +24 -7
  347. sky/utils/env_options.py +4 -0
  348. sky/utils/git.py +559 -1
  349. sky/utils/kubernetes/create_cluster.sh +15 -30
  350. sky/utils/kubernetes/delete_cluster.sh +10 -7
  351. sky/utils/kubernetes/generate_kind_config.py +6 -66
  352. sky/utils/kubernetes/gpu_labeler.py +13 -3
  353. sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
  354. sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
  355. sky/utils/kubernetes/kubernetes_deploy_utils.py +187 -260
  356. sky/utils/kubernetes/rsync_helper.sh +11 -3
  357. sky/utils/kubernetes/ssh-tunnel.sh +7 -376
  358. sky/utils/kubernetes_enums.py +7 -15
  359. sky/utils/lock_events.py +4 -4
  360. sky/utils/locks.py +128 -31
  361. sky/utils/log_utils.py +0 -319
  362. sky/utils/resource_checker.py +13 -10
  363. sky/utils/resources_utils.py +53 -29
  364. sky/utils/rich_utils.py +8 -4
  365. sky/utils/schemas.py +138 -52
  366. sky/utils/subprocess_utils.py +17 -4
  367. sky/utils/thread_utils.py +91 -0
  368. sky/utils/timeline.py +2 -1
  369. sky/utils/ux_utils.py +35 -1
  370. sky/utils/volume.py +88 -4
  371. sky/utils/yaml_utils.py +9 -0
  372. sky/volumes/client/sdk.py +48 -10
  373. sky/volumes/server/core.py +59 -22
  374. sky/volumes/server/server.py +46 -17
  375. sky/volumes/volume.py +54 -42
  376. sky/workspaces/core.py +57 -21
  377. sky/workspaces/server.py +13 -12
  378. sky_templates/README.md +3 -0
  379. sky_templates/__init__.py +3 -0
  380. sky_templates/ray/__init__.py +0 -0
  381. sky_templates/ray/start_cluster +183 -0
  382. sky_templates/ray/stop_cluster +75 -0
  383. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/METADATA +343 -65
  384. skypilot_nightly-1.0.0.dev20251210.dist-info/RECORD +629 -0
  385. skypilot_nightly-1.0.0.dev20251210.dist-info/top_level.txt +2 -0
  386. sky/client/cli/git.py +0 -549
  387. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  388. sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
  389. sky/dashboard/out/_next/static/chunks/1836-37fede578e2da5f8.js +0 -40
  390. sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
  391. sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
  392. sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
  393. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +0 -1
  394. sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +0 -21
  395. sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +0 -10
  396. sky/dashboard/out/_next/static/chunks/4725.10f7a9a5d3ea8208.js +0 -1
  397. sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
  398. sky/dashboard/out/_next/static/chunks/6135-4b4d5e824b7f9d3c.js +0 -1
  399. sky/dashboard/out/_next/static/chunks/649.b9d7f7d10c1b8c53.js +0 -45
  400. sky/dashboard/out/_next/static/chunks/6856-dca7962af4814e1b.js +0 -1
  401. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  402. sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +0 -6
  403. sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +0 -18
  404. sky/dashboard/out/_next/static/chunks/7669.1f5d9a402bf5cc42.js +0 -36
  405. sky/dashboard/out/_next/static/chunks/8969-0be3036bf86f8256.js +0 -1
  406. sky/dashboard/out/_next/static/chunks/9025.c12318fb6a1a9093.js +0 -6
  407. sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
  408. sky/dashboard/out/_next/static/chunks/pages/_app-ce361c6959bc2001.js +0 -34
  409. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  410. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js +0 -16
  411. sky/dashboard/out/_next/static/chunks/pages/clusters-469814d711d63b1b.js +0 -1
  412. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js +0 -11
  413. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js +0 -16
  414. sky/dashboard/out/_next/static/chunks/pages/jobs-1f70d9faa564804f.js +0 -1
  415. sky/dashboard/out/_next/static/chunks/pages/users-018bf31cda52e11b.js +0 -1
  416. sky/dashboard/out/_next/static/chunks/pages/volumes-739726d6b823f532.js +0 -1
  417. sky/dashboard/out/_next/static/chunks/webpack-4fe903277b57b523.js +0 -1
  418. sky/dashboard/out/_next/static/css/4614e06482d7309e.css +0 -3
  419. sky/dashboard/out/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js +0 -1
  420. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  421. sky/utils/kubernetes/cleanup-tunnel.sh +0 -62
  422. sky/utils/kubernetes/deploy_remote_cluster.py +0 -1299
  423. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  424. skypilot_nightly-1.0.0.dev20250905.dist-info/RECORD +0 -547
  425. skypilot_nightly-1.0.0.dev20250905.dist-info/top_level.txt +0 -1
  426. /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → KYAhEFa3FTfq4JyKVgo-s}/_ssgManifest.js +0 -0
  427. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/WHEEL +0 -0
  428. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/entry_points.txt +0 -0
  429. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251210.dist-info}/licenses/LICENSE +0 -0
@@ -60,6 +60,11 @@ EXTERNAL_LOCAL_ENV_VARS = [
60
60
  'AWS_ACCESS_KEY_ID',
61
61
  'AWS_SECRET_ACCESS_KEY',
62
62
  'AWS_SESSION_TOKEN',
63
+ # Allow overriding the Azure authentication.
64
+ 'AZURE_CLIENT_ID',
65
+ 'AZURE_CLIENT_SECRET',
66
+ 'AZURE_TENANT_ID',
67
+ 'AZURE_SUBSCRIPTION_ID',
63
68
  # Allow overriding the GCP authentication.
64
69
  'GOOGLE_APPLICATION_CREDENTIALS',
65
70
  # Allow overriding the kubeconfig.
@@ -67,7 +72,6 @@ EXTERNAL_LOCAL_ENV_VARS = [
67
72
  ]
68
73
 
69
74
 
70
- @annotations.lru_cache(scope='global')
71
75
  def request_body_env_vars() -> dict:
72
76
  env_vars = {}
73
77
  for env_var in os.environ:
@@ -78,14 +82,22 @@ def request_body_env_vars() -> dict:
78
82
  if common.is_api_server_local() and env_var in EXTERNAL_LOCAL_ENV_VARS:
79
83
  env_vars[env_var] = os.environ[env_var]
80
84
  env_vars[constants.USER_ID_ENV_VAR] = common_utils.get_user_hash()
81
- env_vars[constants.USER_ENV_VAR] = common_utils.get_current_user_name()
85
+ env_vars[constants.USER_ENV_VAR] = common_utils.get_local_user_name()
82
86
  env_vars[
83
87
  usage_constants.USAGE_RUN_ID_ENV_VAR] = usage_lib.messages.usage.run_id
88
+ if not common.is_api_server_local():
89
+ # Used in job controller, for local API server, keep the
90
+ # SKYPILOT_CONFIG env var to use the config for the managed job.
91
+ env_vars.pop(skypilot_config.ENV_VAR_SKYPILOT_CONFIG, None)
84
92
  # Remove the path to config file, as the config content is included in the
85
93
  # request body and will be merged with the config on the server side.
86
- env_vars.pop(skypilot_config.ENV_VAR_SKYPILOT_CONFIG, None)
87
94
  env_vars.pop(skypilot_config.ENV_VAR_GLOBAL_CONFIG, None)
88
95
  env_vars.pop(skypilot_config.ENV_VAR_PROJECT_CONFIG, None)
96
+ # Remove the config related env vars, as the client config override
97
+ # should be passed in the request body.
98
+ # Any new environment variables that are server-specific should
99
+ # use SKYPILOT_SERVER_ENV_VAR_PREFIX.
100
+ env_vars.pop(constants.ENV_VAR_DB_CONNECTION_URI, None)
89
101
  return env_vars
90
102
 
91
103
 
@@ -309,8 +321,13 @@ class StatusBody(RequestBody):
309
321
  cluster_names: Optional[List[str]] = None
310
322
  refresh: common_lib.StatusRefreshMode = common_lib.StatusRefreshMode.NONE
311
323
  all_users: bool = True
312
- # TODO (kyuds): default to False post 0.10.5
324
+ # TODO (kyuds): default to False post 0.12.0
313
325
  include_credentials: bool = True
326
+ # Only return fields that are needed for the
327
+ # dashboard / CLI summary response
328
+ summary_response: bool = False
329
+ # Include the cluster handle in the response
330
+ include_handle: bool = True
314
331
 
315
332
 
316
333
  class StartBody(RequestBody):
@@ -355,9 +372,10 @@ class CancelBody(RequestBody):
355
372
  return kwargs
356
373
 
357
374
 
358
- class ClusterNameBody(RequestBody):
375
+ class ProvisionLogsBody(RequestBody):
359
376
  """Cluster node."""
360
377
  cluster_name: str
378
+ worker: Optional[int] = None
361
379
 
362
380
 
363
381
  class ClusterJobBody(RequestBody):
@@ -458,6 +476,7 @@ class VolumeApplyBody(RequestBody):
458
476
  size: Optional[str] = None
459
477
  config: Optional[Dict[str, Any]] = None
460
478
  labels: Optional[Dict[str, str]] = None
479
+ use_existing: Optional[bool] = None
461
480
 
462
481
 
463
482
  class VolumeDeleteBody(RequestBody):
@@ -470,6 +489,17 @@ class VolumeListBody(RequestBody):
470
489
  pass
471
490
 
472
491
 
492
+ class VolumeValidateBody(RequestBody):
493
+ """The request body for the volume validate endpoint."""
494
+ name: Optional[str] = None
495
+ volume_type: Optional[str] = None
496
+ infra: Optional[str] = None
497
+ size: Optional[str] = None
498
+ labels: Optional[Dict[str, str]] = None
499
+ config: Optional[Dict[str, Any]] = None
500
+ use_existing: Optional[bool] = None
501
+
502
+
473
503
  class EndpointsBody(RequestBody):
474
504
  """The request body for the endpoint."""
475
505
  cluster: str
@@ -507,6 +537,14 @@ class JobsQueueBody(RequestBody):
507
537
  skip_finished: bool = False
508
538
  all_users: bool = False
509
539
  job_ids: Optional[List[int]] = None
540
+
541
+
542
+ class JobsQueueV2Body(RequestBody):
543
+ """The request body for the jobs queue endpoint."""
544
+ refresh: bool = False
545
+ skip_finished: bool = False
546
+ all_users: bool = False
547
+ job_ids: Optional[List[int]] = None
510
548
  user_match: Optional[str] = None
511
549
  workspace_match: Optional[str] = None
512
550
  name_match: Optional[str] = None
@@ -514,6 +552,9 @@ class JobsQueueBody(RequestBody):
514
552
  page: Optional[int] = None
515
553
  limit: Optional[int] = None
516
554
  statuses: Optional[List[str]] = None
555
+ # The fields to return in the response.
556
+ # Refer to the fields in the `class ManagedJobRecord` in `response.py`
557
+ fields: Optional[List[str]] = None
517
558
 
518
559
 
519
560
  class JobsCancelBody(RequestBody):
@@ -546,6 +587,8 @@ class RequestStatusBody(pydantic.BaseModel):
546
587
  """The request body for the API request status endpoint."""
547
588
  request_ids: Optional[List[str]] = None
548
589
  all_status: bool = False
590
+ limit: Optional[int] = None
591
+ fields: Optional[List[str]] = None
549
592
 
550
593
 
551
594
  class ServeUpBody(RequestBody):
@@ -627,6 +670,11 @@ class KubernetesNodeInfoRequestBody(RequestBody):
627
670
  context: Optional[str] = None
628
671
 
629
672
 
673
+ class SlurmNodeInfoRequestBody(RequestBody):
674
+ """The request body for the slurm node info endpoint."""
675
+ slurm_cluster_name: Optional[str] = None
676
+
677
+
630
678
  class ListAcceleratorsBody(RequestBody):
631
679
  """The request body for the list accelerators endpoint."""
632
680
  gpus_only: bool = True
@@ -651,12 +699,13 @@ class ListAcceleratorCountsBody(RequestBody):
651
699
  class LocalUpBody(RequestBody):
652
700
  """The request body for the local up endpoint."""
653
701
  gpus: bool = True
654
- ips: Optional[List[str]] = None
655
- ssh_user: Optional[str] = None
656
- ssh_key: Optional[str] = None
657
- cleanup: bool = False
658
- context_name: Optional[str] = None
659
- password: Optional[str] = None
702
+ name: Optional[str] = None
703
+ port_start: Optional[int] = None
704
+
705
+
706
+ class LocalDownBody(RequestBody):
707
+ """The request body for the local down endpoint."""
708
+ name: Optional[str] = None
660
709
 
661
710
 
662
711
  class SSHUpBody(RequestBody):
@@ -696,19 +745,22 @@ class JobsDownloadLogsBody(RequestBody):
696
745
 
697
746
  class JobsPoolApplyBody(RequestBody):
698
747
  """The request body for the jobs pool apply endpoint."""
699
- task: str
748
+ task: Optional[str] = None
749
+ workers: Optional[int] = None
700
750
  pool_name: str
701
751
  mode: serve.UpdateMode
702
752
 
703
753
  def to_kwargs(self) -> Dict[str, Any]:
704
754
  kwargs = super().to_kwargs()
705
- dag = common.process_mounts_in_task_on_api_server(self.task,
706
- self.env_vars,
707
- workdir_only=False)
708
- assert len(
709
- dag.tasks) == 1, ('Must only specify one task in the DAG for '
710
- 'a pool.', dag)
711
- kwargs['task'] = dag.tasks[0]
755
+ if self.task is not None:
756
+ dag = common.process_mounts_in_task_on_api_server(
757
+ self.task, self.env_vars, workdir_only=False)
758
+ assert len(
759
+ dag.tasks) == 1, ('Must only specify one task in the DAG for '
760
+ 'a pool.', dag)
761
+ kwargs['task'] = dag.tasks[0]
762
+ else:
763
+ kwargs['task'] = None
712
764
  return kwargs
713
765
 
714
766
 
@@ -779,6 +831,12 @@ class GetConfigBody(RequestBody):
779
831
  class CostReportBody(RequestBody):
780
832
  """The request body for the cost report endpoint."""
781
833
  days: Optional[int] = 30
834
+ # we use hashes instead of names to avoid the case where
835
+ # the name is not unique
836
+ cluster_hashes: Optional[List[str]] = None
837
+ # Only return fields that are needed for the dashboard
838
+ # summary page
839
+ dashboard_summary_response: bool = False
782
840
 
783
841
 
784
842
  class RequestPayload(BasePayload):
@@ -801,3 +859,9 @@ class RequestPayload(BasePayload):
801
859
  status_msg: Optional[str] = None
802
860
  should_retry: bool = False
803
861
  finished_at: Optional[float] = None
862
+
863
+
864
+ class SlurmGpuAvailabilityRequestBody(RequestBody):
865
+ """Request body for getting Slurm real-time GPU availability."""
866
+ name_filter: Optional[str] = None
867
+ quantity_filter: Optional[int] = None
@@ -90,7 +90,7 @@ class Precondition(abc.ABC):
90
90
  while True:
91
91
  if self.timeout > 0 and time.time() - start_time > self.timeout:
92
92
  # Cancel the request on timeout.
93
- api_requests.set_request_failed(
93
+ await api_requests.set_request_failed_async(
94
94
  self.request_id,
95
95
  exceptions.RequestCancelled(
96
96
  f'Request {self.request_id} precondition wait timed '
@@ -98,13 +98,15 @@ class Precondition(abc.ABC):
98
98
  return False
99
99
 
100
100
  # Check if the request has been cancelled
101
- request = await api_requests.get_request_async(self.request_id)
101
+ request = await api_requests.get_request_async(self.request_id,
102
+ fields=['status'])
102
103
  if request is None:
103
104
  logger.error(f'Request {self.request_id} not found')
104
105
  return False
105
106
  if request.status == api_requests.RequestStatus.CANCELLED:
106
107
  logger.debug(f'Request {self.request_id} cancelled')
107
108
  return False
109
+ del request
108
110
 
109
111
  try:
110
112
  met, status_msg = await self.check()
@@ -112,13 +114,11 @@ class Precondition(abc.ABC):
112
114
  return True
113
115
  if status_msg is not None and status_msg != last_status_msg:
114
116
  # Update the status message if it has changed.
115
- async with api_requests.update_request_async(
116
- self.request_id) as req:
117
- assert req is not None, self.request_id
118
- req.status_msg = status_msg
117
+ await api_requests.update_status_msg_async(
118
+ self.request_id, status_msg)
119
119
  last_status_msg = status_msg
120
120
  except (Exception, SystemExit, KeyboardInterrupt) as e: # pylint: disable=broad-except
121
- api_requests.set_request_failed(self.request_id, e)
121
+ await api_requests.set_request_failed_async(self.request_id, e)
122
122
  logger.info(f'Request {self.request_id} failed due to '
123
123
  f'{common_utils.format_exception(e)}')
124
124
  return False
@@ -146,10 +146,9 @@ class ClusterStartCompletePrecondition(Precondition):
146
146
  self.cluster_name = cluster_name
147
147
 
148
148
  async def check(self) -> Tuple[bool, Optional[str]]:
149
- cluster_record = global_user_state.get_cluster_from_name(
149
+ cluster_status = global_user_state.get_status_from_cluster_name(
150
150
  self.cluster_name)
151
- if (cluster_record and
152
- cluster_record['status'] is status_lib.ClusterStatus.UP):
151
+ if cluster_status is status_lib.ClusterStatus.UP:
153
152
  # Shortcut for started clusters, ignore cluster not found
154
153
  # since the cluster record might not yet be created by the
155
154
  # launch task.
@@ -165,11 +164,14 @@ class ClusterStartCompletePrecondition(Precondition):
165
164
  requests = await api_requests.get_request_tasks_async(
166
165
  req_filter=api_requests.RequestTaskFilter(
167
166
  status=[
168
- api_requests.RequestStatus.RUNNING,
169
- api_requests.RequestStatus.PENDING
167
+ api_requests.RequestStatus.PENDING,
168
+ api_requests.RequestStatus.RUNNING
170
169
  ],
171
170
  include_request_names=['sky.launch', 'sky.start'],
172
- cluster_names=[self.cluster_name]))
171
+ cluster_names=[self.cluster_name],
172
+ # Only get the request ID to avoid fetching the whole request.
173
+ # We're only interested in the count, not the whole request.
174
+ fields=['request_id']))
173
175
  if len(requests) == 0:
174
176
  # No running or pending tasks, the start process is done.
175
177
  return True, None
@@ -0,0 +1,123 @@
1
+ """Request names."""
2
+ import enum
3
+
4
+
5
+ class RequestName(str, enum.Enum):
6
+ """Enum of all the request names."""
7
+ # General requests
8
+ CHECK = 'check'
9
+ ENABLED_CLOUDS = 'enabled_clouds'
10
+ REALTIME_KUBERNETES_GPU_AVAILABILITY = (
11
+ 'realtime_kubernetes_gpu_availability')
12
+ KUBERNETES_NODE_INFO = 'kubernetes_node_info'
13
+ REALTIME_SLURM_GPU_AVAILABILITY = 'realtime_slurm_gpu_availability'
14
+ SLURM_NODE_INFO = 'slurm_node_info'
15
+ STATUS_KUBERNETES = 'status_kubernetes'
16
+ LIST_ACCELERATORS = 'list_accelerators'
17
+ LIST_ACCELERATOR_COUNTS = 'list_accelerator_counts'
18
+ OPTIMIZE = 'optimize'
19
+ # Cluster requests
20
+ CLUSTER_LAUNCH = 'launch'
21
+ CLUSTER_EXEC = 'exec'
22
+ CLUSTER_STOP = 'stop'
23
+ CLUSTER_STATUS = 'status'
24
+ CLUSTER_ENDPOINTS = 'endpoints'
25
+ CLUSTER_DOWN = 'down'
26
+ CLUSTER_START = 'start'
27
+ CLUSTER_AUTOSTOP = 'autostop'
28
+ CLUSTER_QUEUE = 'queue'
29
+ CLUSTER_JOB_STATUS = 'job_status'
30
+ CLUSTER_JOB_CANCEL = 'cancel'
31
+ CLUSTER_JOB_LOGS = 'logs'
32
+ CLUSTER_JOB_DOWNLOAD_LOGS = 'download_logs'
33
+ CLUSTER_COST_REPORT = 'cost_report'
34
+ # Storage requests
35
+ STORAGE_LS = 'storage_ls'
36
+ STORAGE_DELETE = 'storage_delete'
37
+ # Local requests
38
+ LOCAL_UP = 'local_up'
39
+ LOCAL_DOWN = 'local_down'
40
+ # API requests
41
+ API_CANCEL = 'api_cancel'
42
+ ALL_CONTEXTS = 'all_contexts'
43
+ # Managed jobs requests
44
+ JOBS_LAUNCH = 'jobs.launch'
45
+ JOBS_QUEUE = 'jobs.queue'
46
+ JOBS_QUEUE_V2 = 'jobs.queue_v2'
47
+ JOBS_CANCEL = 'jobs.cancel'
48
+ JOBS_LOGS = 'jobs.logs'
49
+ JOBS_DOWNLOAD_LOGS = 'jobs.download_logs'
50
+ JOBS_POOL_APPLY = 'jobs.pool_apply'
51
+ JOBS_POOL_DOWN = 'jobs.pool_down'
52
+ JOBS_POOL_STATUS = 'jobs.pool_status'
53
+ JOBS_POOL_LOGS = 'jobs.pool_logs'
54
+ JOBS_POOL_SYNC_DOWN_LOGS = 'jobs.pool_sync_down_logs'
55
+ # Serve requests
56
+ SERVE_UP = 'serve.up'
57
+ SERVE_UPDATE = 'serve.update'
58
+ SERVE_DOWN = 'serve.down'
59
+ SERVE_TERMINATE_REPLICA = 'serve.terminate_replica'
60
+ SERVE_STATUS = 'serve.status'
61
+ SERVE_LOGS = 'serve.logs'
62
+ SERVE_SYNC_DOWN_LOGS = 'serve.sync_down_logs'
63
+ # Volumes requests
64
+ VOLUME_LIST = 'volume_list'
65
+ VOLUME_DELETE = 'volume_delete'
66
+ VOLUME_APPLY = 'volume_apply'
67
+ # Workspaces requests
68
+ WORKSPACES_GET = 'workspaces.get'
69
+ WORKSPACES_UPDATE = 'workspaces.update'
70
+ WORKSPACES_CREATE = 'workspaces.create'
71
+ WORKSPACES_DELETE = 'workspaces.delete'
72
+ WORKSPACES_GET_CONFIG = 'workspaces.get_config'
73
+ WORKSPACES_UPDATE_CONFIG = 'workspaces.update_config'
74
+ # SSH node pools requests
75
+ SSH_NODE_POOLS_UP = 'ssh_node_pools.up'
76
+ SSH_NODE_POOLS_DOWN = 'ssh_node_pools.down'
77
+ # Internal request daemons
78
+ REQUEST_DAEMON_STATUS_REFRESH = 'status-refresh'
79
+ REQUEST_DAEMON_VOLUME_REFRESH = 'volume-refresh'
80
+ REQUEST_DAEMON_MANAGED_JOB_STATUS_REFRESH = 'managed-job-status-refresh'
81
+ REQUEST_DAEMON_SKY_SERVE_STATUS_REFRESH = 'sky-serve-status-refresh'
82
+ REQUEST_DAEMON_POOL_STATUS_REFRESH = 'pool-status-refresh'
83
+
84
+ def __repr__(self):
85
+ return self.value
86
+
87
+ def __str__(self):
88
+ return self.value
89
+
90
+
91
+ class AdminPolicyRequestName(str, enum.Enum):
92
+ """Enum of all the request names that are
93
+ used for admin policy application."""
94
+ # General requests
95
+ # validate call is not stored in the request db,
96
+ # but is defined here for admin policy application
97
+ VALIDATE = 'validate'
98
+ OPTIMIZE = RequestName.OPTIMIZE.value
99
+ # Cluster requests
100
+ CLUSTER_LAUNCH = RequestName.CLUSTER_LAUNCH.value
101
+ CLUSTER_EXEC = RequestName.CLUSTER_EXEC.value
102
+ # Jobs requests
103
+ JOBS_LAUNCH = RequestName.JOBS_LAUNCH.value
104
+ # jobs launch controller request is not stored in the request db,
105
+ # but is defined here for admin policy application
106
+ JOBS_LAUNCH_CONTROLLER = 'jobs.launch_controller'
107
+ JOBS_POOL_APPLY = RequestName.JOBS_POOL_APPLY.value
108
+ JOBS_LAUNCH_CLUSTER = 'jobs.launch_cluster'
109
+ # Serve requests
110
+ SERVE_UP = RequestName.SERVE_UP.value
111
+ # serve launch controller request is not stored in the request db,
112
+ # but is defined here for admin policy application
113
+ SERVE_LAUNCH_CONTROLLER = 'serve.launch_controller'
114
+ SERVE_UPDATE = RequestName.SERVE_UPDATE.value
115
+ # serve launch replica request is not stored in the request db,
116
+ # but is defined here for admin policy application
117
+ SERVE_LAUNCH_REPLICA = 'serve.launch_replica'
118
+
119
+ def __repr__(self):
120
+ return self.value
121
+
122
+ def __str__(self):
123
+ return self.value