skypilot-nightly 1.0.0.dev20250926__py3-none-any.whl → 1.0.0.dev20251001__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 (71) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +43 -14
  3. sky/backends/cloud_vm_ray_backend.py +153 -38
  4. sky/check.py +0 -29
  5. sky/client/cli/command.py +48 -26
  6. sky/client/cli/table_utils.py +91 -0
  7. sky/client/sdk.py +14 -23
  8. sky/client/sdk_async.py +5 -5
  9. sky/core.py +18 -20
  10. sky/dashboard/out/404.html +1 -1
  11. sky/dashboard/out/_next/static/chunks/{3294.03e02ae73455f48e.js → 3294.93d9336bdc032b3a.js} +1 -1
  12. sky/dashboard/out/_next/static/chunks/6856-5fdc9b851a18acdb.js +1 -0
  13. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-07349868f7905d37.js → [pool]-509b2977a6373bf6.js} +1 -1
  14. sky/dashboard/out/_next/static/chunks/{webpack-8e64d11e58eab5cb.js → webpack-4f0c389a4ce5fd9c.js} +1 -1
  15. sky/dashboard/out/_next/static/{VXU6_xE28M55BOdwmUUJS → m3YT2i5s6v4SsIdYc8WZa}/_buildManifest.js +1 -1
  16. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  17. sky/dashboard/out/clusters/[cluster].html +1 -1
  18. sky/dashboard/out/clusters.html +1 -1
  19. sky/dashboard/out/config.html +1 -1
  20. sky/dashboard/out/index.html +1 -1
  21. sky/dashboard/out/infra/[context].html +1 -1
  22. sky/dashboard/out/infra.html +1 -1
  23. sky/dashboard/out/jobs/[job].html +1 -1
  24. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  25. sky/dashboard/out/jobs.html +1 -1
  26. sky/dashboard/out/users.html +1 -1
  27. sky/dashboard/out/volumes.html +1 -1
  28. sky/dashboard/out/workspace/new.html +1 -1
  29. sky/dashboard/out/workspaces/[name].html +1 -1
  30. sky/dashboard/out/workspaces.html +1 -1
  31. sky/data/storage.py +11 -0
  32. sky/data/storage_utils.py +1 -45
  33. sky/execution.py +0 -1
  34. sky/global_user_state.py +3 -3
  35. sky/jobs/client/sdk.py +3 -2
  36. sky/jobs/controller.py +15 -0
  37. sky/jobs/server/core.py +120 -28
  38. sky/jobs/server/server.py +1 -1
  39. sky/jobs/server/utils.py +65 -32
  40. sky/jobs/state.py +145 -3
  41. sky/jobs/utils.py +87 -8
  42. sky/provision/kubernetes/instance.py +1 -1
  43. sky/schemas/api/responses.py +73 -0
  44. sky/schemas/generated/managed_jobsv1_pb2.py +70 -0
  45. sky/schemas/generated/managed_jobsv1_pb2.pyi +262 -0
  46. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  47. sky/serve/serve_utils.py +16 -0
  48. sky/serve/server/core.py +1 -1
  49. sky/serve/server/impl.py +6 -6
  50. sky/server/common.py +2 -1
  51. sky/server/requests/serializers/decoders.py +10 -6
  52. sky/server/requests/serializers/encoders.py +13 -8
  53. sky/skylet/constants.py +1 -1
  54. sky/skylet/job_lib.py +2 -32
  55. sky/skylet/log_lib.py +211 -0
  56. sky/skylet/log_lib.pyi +30 -1
  57. sky/skylet/services.py +208 -2
  58. sky/skylet/skylet.py +3 -0
  59. sky/task.py +4 -0
  60. sky/utils/cluster_utils.py +23 -5
  61. sky/utils/command_runner.py +21 -5
  62. sky/utils/command_runner.pyi +11 -0
  63. sky/utils/volume.py +5 -0
  64. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/METADATA +35 -35
  65. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/RECORD +70 -66
  66. sky/dashboard/out/_next/static/chunks/6856-2b3600ff2854d066.js +0 -1
  67. /sky/dashboard/out/_next/static/{VXU6_xE28M55BOdwmUUJS → m3YT2i5s6v4SsIdYc8WZa}/_ssgManifest.js +0 -0
  68. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/WHEEL +0 -0
  69. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/entry_points.txt +0 -0
  70. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/licenses/LICENSE +0 -0
  71. {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-509b2977a6373bf6.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-1f70d9faa564804f.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-1f70d9faa564804f.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-018bf31cda52e11b.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-018bf31cda52e11b.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-739726d6b823f532.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-739726d6b823f532.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1836-37fede578e2da5f8.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-88c7c8d69b0b6dba.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-159df2d4c441a9d1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-af76bb06dbb3954f.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1836-37fede578e2da5f8.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-d8bc3a2b9cf839a9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-88c7c8d69b0b6dba.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-159df2d4c441a9d1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-af76bb06dbb3954f.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-8e64d11e58eab5cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-7528cc0ef8c522c5.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/VXU6_xE28M55BOdwmUUJS/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"VXU6_xE28M55BOdwmUUJS","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-7528cc0ef8c522c5.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/data/storage.py CHANGED
@@ -1301,6 +1301,17 @@ class Storage(object):
1301
1301
  if store.is_sky_managed:
1302
1302
  global_user_state.set_storage_status(self.name, StorageStatus.READY)
1303
1303
 
1304
+ @classmethod
1305
+ def from_handle(cls, handle: StorageHandle) -> 'Storage':
1306
+ """Create Storage from StorageHandle object.
1307
+ """
1308
+ obj = cls(name=handle.storage_name,
1309
+ source=handle.source,
1310
+ sync_on_reconstruction=False)
1311
+ obj.handle = handle
1312
+ obj._add_store_from_metadata(handle.sky_stores)
1313
+ return obj
1314
+
1304
1315
  @classmethod
1305
1316
  def from_yaml_config(cls, config: Dict[str, Any]) -> 'Storage':
1306
1317
  common_utils.validate_schema(config, schemas.get_storage_schema(),
sky/data/storage_utils.py CHANGED
@@ -5,7 +5,7 @@ import pathlib
5
5
  import shlex
6
6
  import stat
7
7
  import subprocess
8
- from typing import Any, Dict, List, Optional, Set, TextIO, Union
8
+ from typing import List, Optional, Set, TextIO, Union
9
9
  import warnings
10
10
  import zipfile
11
11
 
@@ -15,7 +15,6 @@ from sky import exceptions
15
15
  from sky import sky_logging
16
16
  from sky.skylet import constants
17
17
  from sky.utils import common_utils
18
- from sky.utils import log_utils
19
18
 
20
19
  logger = sky_logging.init_logger(__name__)
21
20
 
@@ -23,49 +22,6 @@ _USE_SKYIGNORE_HINT = (
23
22
  'To avoid using .gitignore, you can create a .skyignore file instead.')
24
23
 
25
24
 
26
- def format_storage_table(storages: List[Dict[str, Any]],
27
- show_all: bool = False) -> str:
28
- """Format the storage table for display.
29
-
30
- Args:
31
- storage_table (dict): The storage table.
32
-
33
- Returns:
34
- str: The formatted storage table.
35
- """
36
- storage_table = log_utils.create_table([
37
- 'NAME',
38
- 'UPDATED',
39
- 'STORE',
40
- 'COMMAND',
41
- 'STATUS',
42
- ])
43
-
44
- for row in storages:
45
- launched_at = row['launched_at']
46
- if show_all:
47
- command = row['last_use']
48
- else:
49
- command = common_utils.truncate_long_string(
50
- row['last_use'], constants.LAST_USE_TRUNC_LENGTH)
51
- storage_table.add_row([
52
- # NAME
53
- row['name'],
54
- # LAUNCHED
55
- log_utils.readable_time_duration(launched_at),
56
- # CLOUDS
57
- ', '.join([s.value for s in row['store']]),
58
- # COMMAND,
59
- command,
60
- # STATUS
61
- row['status'].value,
62
- ])
63
- if storages:
64
- return str(storage_table)
65
- else:
66
- return 'No existing storage.'
67
-
68
-
69
25
  def get_excluded_files_from_skyignore(src_dir_path: str) -> List[str]:
70
26
  """List files and patterns ignored by the .skyignore file
71
27
  in the given source directory.
sky/execution.py CHANGED
@@ -673,7 +673,6 @@ def launch(
673
673
  # see the setup logs when inspecting the launch process to know
674
674
  # excatly what the job is waiting for.
675
675
  detach_setup = controller_utils.Controllers.from_name(cluster_name) is None
676
-
677
676
  return _execute(
678
677
  entrypoint=entrypoint,
679
678
  dryrun=dryrun,
sky/global_user_state.py CHANGED
@@ -483,7 +483,7 @@ def get_user(user_id: str) -> Optional[models.User]:
483
483
 
484
484
  @_init_db
485
485
  @metrics_lib.time_me
486
- def _get_users(user_ids: Set[str]) -> Dict[str, models.User]:
486
+ def get_users(user_ids: Set[str]) -> Dict[str, models.User]:
487
487
  assert _SQLALCHEMY_ENGINE is not None
488
488
  with orm.Session(_SQLALCHEMY_ENGINE) as session:
489
489
  rows = session.query(user_table).filter(
@@ -1659,7 +1659,7 @@ def get_clusters(
1659
1659
 
1660
1660
  # get all users needed for the rows at once
1661
1661
  user_hashes = set(row_to_user_hash.values())
1662
- user_hash_to_user = _get_users(user_hashes)
1662
+ user_hash_to_user = get_users(user_hashes)
1663
1663
 
1664
1664
  # get last cluster event for each row
1665
1665
  cluster_hashes = set(row_to_user_hash.keys())
@@ -1807,7 +1807,7 @@ def get_clusters_from_history(
1807
1807
  row_to_user_hash[row.cluster_hash] = user_hash
1808
1808
 
1809
1809
  user_hashes = set(row_to_user_hash.values())
1810
- user_hash_to_user = _get_users(user_hashes)
1810
+ user_hash_to_user = get_users(user_hashes)
1811
1811
  cluster_hashes = set(row_to_user_hash.keys())
1812
1812
  if not abbreviate_response:
1813
1813
  last_cluster_event_dict = _get_last_cluster_event_multiple(
sky/jobs/client/sdk.py CHANGED
@@ -9,6 +9,7 @@ from sky import sky_logging
9
9
  from sky.adaptors import common as adaptors_common
10
10
  from sky.client import common as client_common
11
11
  from sky.client import sdk
12
+ from sky.schemas.api import responses
12
13
  from sky.serve.client import impl
13
14
  from sky.server import common as server_common
14
15
  from sky.server import rest
@@ -130,7 +131,7 @@ def queue(
130
131
  skip_finished: bool = False,
131
132
  all_users: bool = False,
132
133
  job_ids: Optional[List[int]] = None
133
- ) -> server_common.RequestId[List[Dict[str, Any]]]:
134
+ ) -> server_common.RequestId[List[responses.ManagedJobRecord]]:
134
135
  """Gets statuses of managed jobs.
135
136
 
136
137
  Please refer to sky.cli.job_queue for documentation.
@@ -145,7 +146,7 @@ def queue(
145
146
  The request ID of the queue request.
146
147
 
147
148
  Request Returns:
148
- job_records (List[Dict[str, Any]]): A list of dicts, with each dict
149
+ job_records (List[responses.ManagedJobRecord]): A list of dicts, with each dict
149
150
  containing the information of a job.
150
151
 
151
152
  .. code-block:: python
sky/jobs/controller.py CHANGED
@@ -363,6 +363,21 @@ class JobsController:
363
363
  cluster_name, job_id_on_pool_cluster = (
364
364
  await
365
365
  managed_job_state.get_pool_submit_info_async(self._job_id))
366
+ if cluster_name is None:
367
+ # Check if we have been cancelled here, in the case where a user
368
+ # quickly cancels the job we want to gracefully handle it here,
369
+ # otherwise we will end up in the FAILED_CONTROLLER state.
370
+ self._logger.info(f'Cluster name is None for job {self._job_id}, '
371
+ f'task {task_id}. Checking if we have been '
372
+ 'cancelled.')
373
+ status = await (managed_job_state.get_job_status_with_task_id_async(
374
+ job_id=self._job_id, task_id=task_id))
375
+ self._logger.debug(f'Status for job {self._job_id}, task {task_id}:'
376
+ f'{status}')
377
+ if status == managed_job_state.ManagedJobStatus.CANCELLED:
378
+ self._logger.info(f'Job {self._job_id}, task {task_id} has '
379
+ 'been quickly cancelled.')
380
+ raise asyncio.CancelledError()
366
381
  assert cluster_name is not None, (cluster_name, job_id_on_pool_cluster)
367
382
 
368
383
  if not is_resume:
sky/jobs/server/core.py CHANGED
@@ -19,13 +19,16 @@ from sky import provision as provision_lib
19
19
  from sky import sky_logging
20
20
  from sky import skypilot_config
21
21
  from sky import task as task_lib
22
+ from sky.adaptors import common as adaptors_common
22
23
  from sky.backends import backend_utils
24
+ from sky.backends import cloud_vm_ray_backend
23
25
  from sky.catalog import common as service_catalog_common
24
26
  from sky.data import storage as storage_lib
25
27
  from sky.jobs import constants as managed_job_constants
26
28
  from sky.jobs import state as managed_job_state
27
29
  from sky.jobs import utils as managed_job_utils
28
30
  from sky.provision import common as provision_common
31
+ from sky.schemas.api import responses
29
32
  from sky.serve import serve_state
30
33
  from sky.serve import serve_utils
31
34
  from sky.serve.server import impl
@@ -44,8 +47,15 @@ from sky.utils import ux_utils
44
47
  from sky.workspaces import core as workspaces_core
45
48
 
46
49
  if typing.TYPE_CHECKING:
50
+ from google.protobuf import json_format
51
+
47
52
  import sky
48
- from sky.backends import cloud_vm_ray_backend
53
+ from sky.schemas.generated import managed_jobsv1_pb2
54
+ else:
55
+ json_format = adaptors_common.LazyImport('google.protobuf.json_format')
56
+
57
+ managed_jobsv1_pb2 = adaptors_common.LazyImport(
58
+ 'sky.schemas.generated.managed_jobsv1_pb2')
49
59
 
50
60
  logger = sky_logging.init_logger(__name__)
51
61
 
@@ -287,8 +297,7 @@ def launch(
287
297
  # TODO: do something with returned status?
288
298
  _, _ = backend_utils.refresh_cluster_status_handle(
289
299
  cluster_name=cluster_name,
290
- force_refresh_statuses=set(status_lib.ClusterStatus),
291
- acquire_per_cluster_status_lock=False)
300
+ force_refresh_statuses=set(status_lib.ClusterStatus))
292
301
  except (exceptions.ClusterOwnerIdentityMismatchError,
293
302
  exceptions.CloudUserIdentityError,
294
303
  exceptions.ClusterStatusFetchingError) as e:
@@ -635,6 +644,28 @@ def queue(refresh: bool,
635
644
 
636
645
 
637
646
  @usage_lib.entrypoint
647
+ def queue_v2_api(
648
+ refresh: bool,
649
+ skip_finished: bool = False,
650
+ all_users: bool = False,
651
+ job_ids: Optional[List[int]] = None,
652
+ user_match: Optional[str] = None,
653
+ workspace_match: Optional[str] = None,
654
+ name_match: Optional[str] = None,
655
+ pool_match: Optional[str] = None,
656
+ page: Optional[int] = None,
657
+ limit: Optional[int] = None,
658
+ statuses: Optional[List[str]] = None,
659
+ ) -> Tuple[List[responses.ManagedJobRecord], int, Dict[str, int], int]:
660
+ """Gets statuses of managed jobs and parse the
661
+ jobs to responses.ManagedJobRecord."""
662
+ jobs, total, status_counts, total_no_filter = queue_v2(
663
+ refresh, skip_finished, all_users, job_ids, user_match, workspace_match,
664
+ name_match, pool_match, page, limit, statuses)
665
+ return [responses.ManagedJobRecord(**job) for job in jobs
666
+ ], total, status_counts, total_no_filter
667
+
668
+
638
669
  def queue_v2(
639
670
  refresh: bool,
640
671
  skip_finished: bool = False,
@@ -701,11 +732,13 @@ def queue_v2(
701
732
  assert isinstance(backend, backends.CloudVmRayBackend)
702
733
 
703
734
  user_hashes: Optional[List[Optional[str]]] = None
735
+ show_jobs_without_user_hash = False
704
736
  if not all_users:
705
737
  user_hashes = [common_utils.get_user_hash()]
706
738
  # For backwards compatibility, we show jobs that do not have a
707
739
  # user_hash. TODO(cooperc): Remove before 0.12.0.
708
740
  user_hashes.append(None)
741
+ show_jobs_without_user_hash = True
709
742
  elif user_match is not None:
710
743
  users = global_user_state.get_user_by_name_match(user_match)
711
744
  if not users:
@@ -713,6 +746,38 @@ def queue_v2(
713
746
  user_hashes = [user.id for user in users]
714
747
 
715
748
  accessible_workspaces = list(workspaces_core.get_workspaces().keys())
749
+
750
+ if handle.is_grpc_enabled_with_flag:
751
+ try:
752
+ request = managed_jobsv1_pb2.GetJobTableRequest(
753
+ skip_finished=skip_finished,
754
+ accessible_workspaces=accessible_workspaces,
755
+ job_ids=managed_jobsv1_pb2.JobIds(
756
+ ids=job_ids) if job_ids is not None else None,
757
+ workspace_match=workspace_match,
758
+ name_match=name_match,
759
+ pool_match=pool_match,
760
+ page=page,
761
+ limit=limit,
762
+ # Remove None from user_hashes, as the gRPC server uses the
763
+ # show_jobs_without_user_hash flag instead.
764
+ user_hashes=managed_jobsv1_pb2.UserHashes(hashes=[
765
+ user_hash for user_hash in user_hashes
766
+ if user_hash is not None
767
+ ]) if user_hashes is not None else None,
768
+ statuses=managed_jobsv1_pb2.Statuses(
769
+ statuses=statuses) if statuses is not None else None,
770
+ show_jobs_without_user_hash=show_jobs_without_user_hash,
771
+ )
772
+ response = backend_utils.invoke_skylet_with_retries(
773
+ lambda: cloud_vm_ray_backend.SkyletClient(
774
+ handle.get_grpc_channel()).get_managed_job_table(request))
775
+ jobs = managed_job_utils.decode_managed_job_protos(response.jobs)
776
+ return jobs, response.total, dict(
777
+ response.status_counts), response.total_no_filter
778
+ except exceptions.SkyletMethodNotImplementedError:
779
+ pass
780
+
716
781
  code = managed_job_utils.ManagedJobCodeGen.get_job_table(
717
782
  skip_finished, accessible_workspaces, job_ids, workspace_match,
718
783
  name_match, pool_match, page, limit, user_hashes, statuses)
@@ -819,33 +884,60 @@ def cancel(name: Optional[str] = None,
819
884
  'Can only specify one of JOB_IDS, name, pool, or all/'
820
885
  f'all_users. Provided {" ".join(arguments)!r}.')
821
886
 
887
+ job_ids = None if (all_users or all) else job_ids
888
+
822
889
  backend = backend_utils.get_backend_from_handle(handle)
823
890
  assert isinstance(backend, backends.CloudVmRayBackend)
824
- if all_users:
825
- code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_id(
826
- None, all_users=True)
827
- elif all:
828
- code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_id(None)
829
- elif job_ids:
830
- code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_id(
831
- job_ids)
832
- elif name is not None:
833
- code = managed_job_utils.ManagedJobCodeGen.cancel_job_by_name(name)
834
- else:
835
- assert pool is not None, (job_ids, name, pool, all)
836
- code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_pool(pool)
837
- # The stderr is redirected to stdout
838
- returncode, stdout, stderr = backend.run_on_head(handle,
839
- code,
840
- require_outputs=True,
841
- stream_logs=False)
842
- try:
843
- subprocess_utils.handle_returncode(returncode, code,
844
- 'Failed to cancel managed job',
845
- stdout + stderr)
846
- except exceptions.CommandError as e:
847
- with ux_utils.print_exception_no_traceback():
848
- raise RuntimeError(e.error_msg) from e
891
+
892
+ use_legacy = not handle.is_grpc_enabled_with_flag
893
+
894
+ if not use_legacy:
895
+ current_workspace = skypilot_config.get_active_workspace()
896
+ try:
897
+ request = managed_jobsv1_pb2.CancelJobsRequest(
898
+ current_workspace=current_workspace)
899
+
900
+ if all_users or all or job_ids:
901
+ request.all_users = all_users
902
+ if all:
903
+ request.user_hash = common_utils.get_user_hash()
904
+ if job_ids is not None:
905
+ request.job_ids.CopyFrom(
906
+ managed_jobsv1_pb2.JobIds(ids=job_ids))
907
+ elif name is not None:
908
+ request.job_name = name
909
+ else:
910
+ assert pool is not None, (job_ids, name, pool, all)
911
+ request.pool_name = pool
912
+
913
+ response = backend_utils.invoke_skylet_with_retries(
914
+ lambda: cloud_vm_ray_backend.SkyletClient(
915
+ handle.get_grpc_channel()).cancel_managed_jobs(request))
916
+ stdout = response.message
917
+ except exceptions.SkyletMethodNotImplementedError:
918
+ use_legacy = True
919
+
920
+ if use_legacy:
921
+ if all_users or all or job_ids:
922
+ code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_id(
923
+ job_ids, all_users=all_users)
924
+ elif name is not None:
925
+ code = managed_job_utils.ManagedJobCodeGen.cancel_job_by_name(
926
+ name)
927
+ else:
928
+ assert pool is not None, (job_ids, name, pool, all)
929
+ code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_pool(
930
+ pool)
931
+ # The stderr is redirected to stdout
932
+ returncode, stdout, stderr = backend.run_on_head(
933
+ handle, code, require_outputs=True, stream_logs=False)
934
+ try:
935
+ subprocess_utils.handle_returncode(
936
+ returncode, code, 'Failed to cancel managed job',
937
+ stdout + stderr)
938
+ except exceptions.CommandError as e:
939
+ with ux_utils.print_exception_no_traceback():
940
+ raise RuntimeError(e.error_msg) from e
849
941
 
850
942
  logger.info(stdout)
851
943
  if 'Multiple jobs found with name' in stdout:
sky/jobs/server/server.py CHANGED
@@ -68,7 +68,7 @@ async def queue_v2(request: fastapi.Request,
68
68
  request_id=request.state.request_id,
69
69
  request_name='jobs.queue_v2',
70
70
  request_body=jobs_queue_body_v2,
71
- func=core.queue_v2,
71
+ func=core.queue_v2_api,
72
72
  schedule_type=(api_requests.ScheduleType.LONG
73
73
  if jobs_queue_body_v2.refresh else
74
74
  api_requests.ScheduleType.SHORT),