skypilot-nightly 1.0.0.dev20251022__py3-none-any.whl → 1.0.0.dev20251023__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 (51) hide show
  1. sky/__init__.py +2 -2
  2. sky/client/cli/command.py +118 -30
  3. sky/client/cli/table_utils.py +14 -8
  4. sky/dashboard/out/404.html +1 -1
  5. sky/dashboard/out/_next/static/{IgACOQPupLbX9z-RYVEDx → CJlKj9Z9fXGlQCmH4EpLX}/_buildManifest.js +1 -1
  6. sky/dashboard/out/_next/static/chunks/1871-165dc0e1553d9822.js +6 -0
  7. sky/dashboard/out/_next/static/chunks/2755.1ffbda43f960962b.js +26 -0
  8. sky/dashboard/out/_next/static/chunks/3015-2dcace420c8939f4.js +1 -0
  9. sky/dashboard/out/_next/static/chunks/{3294.998db87cd52a1238.js → 3294.27318ad826343ea6.js} +1 -1
  10. sky/dashboard/out/_next/static/chunks/{4725.10f7a9a5d3ea8208.js → 4725.a830b5c9e7867c92.js} +1 -1
  11. sky/dashboard/out/_next/static/chunks/9360.07d78b8552bc9d17.js +31 -0
  12. sky/dashboard/out/_next/static/chunks/{webpack-919e3c01ab6b2633.js → webpack-434b7577d72c879b.js} +1 -1
  13. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  14. sky/dashboard/out/clusters/[cluster].html +1 -1
  15. sky/dashboard/out/clusters.html +1 -1
  16. sky/dashboard/out/config.html +1 -1
  17. sky/dashboard/out/index.html +1 -1
  18. sky/dashboard/out/infra/[context].html +1 -1
  19. sky/dashboard/out/infra.html +1 -1
  20. sky/dashboard/out/jobs/[job].html +1 -1
  21. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  22. sky/dashboard/out/jobs.html +1 -1
  23. sky/dashboard/out/users.html +1 -1
  24. sky/dashboard/out/volumes.html +1 -1
  25. sky/dashboard/out/workspace/new.html +1 -1
  26. sky/dashboard/out/workspaces/[name].html +1 -1
  27. sky/dashboard/out/workspaces.html +1 -1
  28. sky/jobs/client/sdk.py +28 -9
  29. sky/jobs/client/sdk_async.py +9 -3
  30. sky/jobs/server/core.py +3 -1
  31. sky/jobs/utils.py +33 -22
  32. sky/server/auth/oauth2_proxy.py +2 -5
  33. sky/server/requests/requests.py +39 -6
  34. sky/server/requests/serializers/decoders.py +23 -10
  35. sky/server/requests/serializers/encoders.py +4 -3
  36. sky/server/rest.py +35 -1
  37. sky/skylet/log_lib.py +8 -1
  38. sky/skylet/subprocess_daemon.py +103 -29
  39. sky/utils/db/db_utils.py +21 -0
  40. sky/utils/subprocess_utils.py +13 -1
  41. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.dist-info}/METADATA +37 -37
  42. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.dist-info}/RECORD +47 -47
  43. sky/dashboard/out/_next/static/chunks/1871-df9f87fcb7f24292.js +0 -6
  44. sky/dashboard/out/_next/static/chunks/2755.9b1e69c921b5a870.js +0 -26
  45. sky/dashboard/out/_next/static/chunks/3015-d014dc5b9412fade.js +0 -1
  46. sky/dashboard/out/_next/static/chunks/9360.14326e329484b57e.js +0 -31
  47. /sky/dashboard/out/_next/static/{IgACOQPupLbX9z-RYVEDx → CJlKj9Z9fXGlQCmH4EpLX}/_ssgManifest.js +0 -0
  48. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.dist-info}/WHEEL +0 -0
  49. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.dist-info}/entry_points.txt +0 -0
  50. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.dist-info}/licenses/LICENSE +0 -0
  51. {skypilot_nightly-1.0.0.dev20251022.dist-info → skypilot_nightly-1.0.0.dev20251023.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-919e3c01ab6b2633.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/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.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-0389e2cb52412db3.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/4282-d2f3ef2fbf78e347.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-d014dc5b9412fade.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-5c94d394259cdb6e.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-df9f87fcb7f24292.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-18b334dedbd9f6f2.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.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-0389e2cb52412db3.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/4282-d2f3ef2fbf78e347.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-2dcace420c8939f4.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-5c94d394259cdb6e.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-165dc0e1553d9822.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-18b334dedbd9f6f2.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/clusters-57221ec2e4e01076.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/clusters-57221ec2e4e01076.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/infra/%5Bcontext%5D-44ce535a0a0ad4ec.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/infra/%5Bcontext%5D-44ce535a0a0ad4ec.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/infra-872e6a00165534f4.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/infra-872e6a00165534f4.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/6212-7bd06f60ba693125.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-0389e2cb52412db3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-8677af16befde039.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/6212-7bd06f60ba693125.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-0389e2cb52412db3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-8677af16befde039.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/6212-7bd06f60ba693125.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-0389e2cb52412db3.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-e020fd69dbe76cea.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_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":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/6212-7bd06f60ba693125.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-0389e2cb52412db3.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-e020fd69dbe76cea.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_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":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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-0dc34cf9a8710a9f.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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-0dc34cf9a8710a9f.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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-3a543725492fb896.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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-3a543725492fb896.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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-d2af9d22e87cc4ba.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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-d2af9d22e87cc4ba.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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/7359-c8d04e06886000b3.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-0389e2cb52412db3.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/4282-d2f3ef2fbf78e347.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-d014dc5b9412fade.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-ec6f902ffb865853.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-9ad108cd67d16d96.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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/7359-c8d04e06886000b3.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-0389e2cb52412db3.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/4282-d2f3ef2fbf78e347.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-2dcace420c8939f4.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-ec6f902ffb865853.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-9ad108cd67d16d96.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","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-919e3c01ab6b2633.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-6fc994fa1ee6c6bf.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/IgACOQPupLbX9z-RYVEDx/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"IgACOQPupLbX9z-RYVEDx","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-434b7577d72c879b.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-6fc994fa1ee6c6bf.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/CJlKj9Z9fXGlQCmH4EpLX/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"CJlKj9Z9fXGlQCmH4EpLX","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/jobs/client/sdk.py CHANGED
@@ -130,8 +130,11 @@ def queue(
130
130
  refresh: bool,
131
131
  skip_finished: bool = False,
132
132
  all_users: bool = False,
133
- job_ids: Optional[List[int]] = None
134
- ) -> server_common.RequestId[List[responses.ManagedJobRecord]]:
133
+ job_ids: Optional[List[int]] = None,
134
+ limit: Optional[int] = None,
135
+ fields: Optional[List[str]] = None,
136
+ ) -> server_common.RequestId[Union[List[responses.ManagedJobRecord], Tuple[
137
+ List[responses.ManagedJobRecord], int, Dict[str, int], int]]]:
135
138
  """Gets statuses of managed jobs.
136
139
 
137
140
  Please refer to sky.cli.job_queue for documentation.
@@ -141,6 +144,8 @@ def queue(
141
144
  skip_finished: Whether to skip finished jobs.
142
145
  all_users: Whether to show all users' jobs.
143
146
  job_ids: IDs of the managed jobs to show.
147
+ limit: Number of jobs to show.
148
+ fields: Fields to get for the managed jobs.
144
149
 
145
150
  Returns:
146
151
  The request ID of the queue request.
@@ -173,15 +178,29 @@ def queue(
173
178
  does not exist.
174
179
  RuntimeError: if failed to get the managed jobs with ssh.
175
180
  """
176
- body = payloads.JobsQueueBody(
177
- refresh=refresh,
178
- skip_finished=skip_finished,
179
- all_users=all_users,
180
- job_ids=job_ids,
181
- )
181
+ remote_api_version = versions.get_remote_api_version()
182
+ if remote_api_version and remote_api_version >= 18:
183
+ body = payloads.JobsQueueV2Body(
184
+ refresh=refresh,
185
+ skip_finished=skip_finished,
186
+ all_users=all_users,
187
+ job_ids=job_ids,
188
+ limit=limit,
189
+ fields=fields,
190
+ )
191
+ path = '/jobs/queue/v2'
192
+ else:
193
+ body = payloads.JobsQueueBody(
194
+ refresh=refresh,
195
+ skip_finished=skip_finished,
196
+ all_users=all_users,
197
+ job_ids=job_ids,
198
+ )
199
+ path = '/jobs/queue'
200
+
182
201
  response = server_common.make_authenticated_request(
183
202
  'POST',
184
- '/jobs/queue',
203
+ path,
185
204
  json=json.loads(body.model_dump_json()),
186
205
  timeout=(5, None))
187
206
  return server_common.get_request_id(response=response)
@@ -1,12 +1,13 @@
1
1
  """Async SDK functions for managed jobs."""
2
2
  import typing
3
- from typing import Any, Dict, List, Optional, Tuple, Union
3
+ from typing import Dict, List, Optional, Tuple, Union
4
4
 
5
5
  from sky import backends
6
6
  from sky import sky_logging
7
7
  from sky.adaptors import common as adaptors_common
8
8
  from sky.client import sdk_async
9
9
  from sky.jobs.client import sdk
10
+ from sky.schemas.api import responses
10
11
  from sky.skylet import constants
11
12
  from sky.usage import usage_lib
12
13
  from sky.utils import common_utils
@@ -50,12 +51,17 @@ async def queue(
50
51
  refresh: bool,
51
52
  skip_finished: bool = False,
52
53
  all_users: bool = False,
54
+ job_ids: Optional[List[int]] = None,
55
+ limit: Optional[int] = None,
56
+ fields: Optional[List[str]] = None,
53
57
  stream_logs: Optional[
54
58
  sdk_async.StreamConfig] = sdk_async.DEFAULT_STREAM_CONFIG
55
- ) -> List[Dict[str, Any]]:
59
+ ) -> Union[List[responses.ManagedJobRecord], Tuple[
60
+ List[responses.ManagedJobRecord], int, Dict[str, int], int]]:
56
61
  """Async version of queue() that gets statuses of managed jobs."""
57
62
  request_id = await context_utils.to_thread(sdk.queue, refresh,
58
- skip_finished, all_users)
63
+ skip_finished, all_users,
64
+ job_ids, limit, fields)
59
65
  if stream_logs is not None:
60
66
  return await sdk_async._stream_and_get(request_id, stream_logs) # pylint: disable=protected-access
61
67
  else:
sky/jobs/server/core.py CHANGED
@@ -337,6 +337,7 @@ def launch(
337
337
  def _submit_one(
338
338
  consolidation_mode_job_id: Optional[int] = None,
339
339
  job_rank: Optional[int] = None,
340
+ num_jobs: Optional[int] = None,
340
341
  ) -> Tuple[Optional[int], Optional[backends.ResourceHandle]]:
341
342
  rank_suffix = '' if job_rank is None else f'-{job_rank}'
342
343
  remote_original_user_yaml_path = (
@@ -359,6 +360,7 @@ def launch(
359
360
  for task_ in dag.tasks:
360
361
  if job_rank is not None:
361
362
  task_.update_envs({'SKYPILOT_JOB_RANK': str(job_rank)})
363
+ task_.update_envs({'SKYPILOT_NUM_JOBS': str(num_jobs)})
362
364
 
363
365
  dag_utils.dump_chain_dag_to_yaml(dag, f.name)
364
366
 
@@ -475,7 +477,7 @@ def launch(
475
477
  for job_rank in range(num_jobs):
476
478
  job_id = (consolidation_mode_job_ids[job_rank]
477
479
  if consolidation_mode_job_ids is not None else None)
478
- jid, handle = _submit_one(job_id, job_rank)
480
+ jid, handle = _submit_one(job_id, job_rank, num_jobs=num_jobs)
479
481
  assert jid is not None, (job_id, handle)
480
482
  ids.append(jid)
481
483
  all_handle = handle
sky/jobs/utils.py CHANGED
@@ -1710,29 +1710,37 @@ def _get_job_status_from_tasks(
1710
1710
 
1711
1711
 
1712
1712
  @typing.overload
1713
- def format_job_table(tasks: List[Dict[str, Any]],
1714
- show_all: bool,
1715
- show_user: bool,
1716
- return_rows: Literal[False] = False,
1717
- max_jobs: Optional[int] = None) -> str:
1713
+ def format_job_table(
1714
+ tasks: List[Dict[str, Any]],
1715
+ show_all: bool,
1716
+ show_user: bool,
1717
+ return_rows: Literal[False] = False,
1718
+ max_jobs: Optional[int] = None,
1719
+ job_status_counts: Optional[Dict[str, int]] = None,
1720
+ ) -> str:
1718
1721
  ...
1719
1722
 
1720
1723
 
1721
1724
  @typing.overload
1722
- def format_job_table(tasks: List[Dict[str, Any]],
1723
- show_all: bool,
1724
- show_user: bool,
1725
- return_rows: Literal[True],
1726
- max_jobs: Optional[int] = None) -> List[List[str]]:
1725
+ def format_job_table(
1726
+ tasks: List[Dict[str, Any]],
1727
+ show_all: bool,
1728
+ show_user: bool,
1729
+ return_rows: Literal[True],
1730
+ max_jobs: Optional[int] = None,
1731
+ job_status_counts: Optional[Dict[str, int]] = None,
1732
+ ) -> List[List[str]]:
1727
1733
  ...
1728
1734
 
1729
1735
 
1730
1736
  def format_job_table(
1731
- tasks: List[Dict[str, Any]],
1732
- show_all: bool,
1733
- show_user: bool,
1734
- return_rows: bool = False,
1735
- max_jobs: Optional[int] = None) -> Union[str, List[List[str]]]:
1737
+ tasks: List[Dict[str, Any]],
1738
+ show_all: bool,
1739
+ show_user: bool,
1740
+ return_rows: bool = False,
1741
+ max_jobs: Optional[int] = None,
1742
+ job_status_counts: Optional[Dict[str, int]] = None,
1743
+ ) -> Union[str, List[List[str]]]:
1736
1744
  """Returns managed jobs as a formatted string.
1737
1745
 
1738
1746
  Args:
@@ -1741,6 +1749,7 @@ def format_job_table(
1741
1749
  max_jobs: The maximum number of jobs to show in the table.
1742
1750
  return_rows: If True, return the rows as a list of strings instead of
1743
1751
  all rows concatenated into a single string.
1752
+ job_status_counts: The counts of each job status.
1744
1753
 
1745
1754
  Returns: A formatted string of managed jobs, if not `return_rows`; otherwise
1746
1755
  a list of "rows" (each of which is a list of str).
@@ -1762,12 +1771,8 @@ def format_job_table(
1762
1771
  # by the task_id.
1763
1772
  jobs[get_hash(task)].append(task)
1764
1773
 
1765
- status_counts: Dict[str, int] = collections.defaultdict(int)
1766
1774
  workspaces = set()
1767
1775
  for job_tasks in jobs.values():
1768
- managed_job_status = _get_job_status_from_tasks(job_tasks)[0]
1769
- if not managed_job_status.is_terminal():
1770
- status_counts[managed_job_status.value] += 1
1771
1776
  workspaces.add(job_tasks[0].get('workspace',
1772
1777
  constants.SKYPILOT_DEFAULT_WORKSPACE))
1773
1778
 
@@ -1810,9 +1815,15 @@ def format_job_table(
1810
1815
  job_table = log_utils.create_table(columns)
1811
1816
 
1812
1817
  status_counts: Dict[str, int] = collections.defaultdict(int)
1813
- for task in tasks:
1814
- if not task['status'].is_terminal():
1815
- status_counts[task['status'].value] += 1
1818
+ if job_status_counts:
1819
+ for status_value, count in job_status_counts.items():
1820
+ status = managed_job_state.ManagedJobStatus(status_value)
1821
+ if not status.is_terminal():
1822
+ status_counts[status_value] = count
1823
+ else:
1824
+ for task in tasks:
1825
+ if not task['status'].is_terminal():
1826
+ status_counts[task['status'].value] += 1
1816
1827
 
1817
1828
  all_tasks = tasks
1818
1829
  if max_jobs is not None:
@@ -126,13 +126,10 @@ class OAuth2ProxyMiddleware(starlette.middleware.base.BaseHTTPMiddleware):
126
126
 
127
127
  async def _authenticate(self, request: fastapi.Request, call_next,
128
128
  session: aiohttp.ClientSession):
129
- forwarded_headers = dict(request.headers)
129
+ forwarded_headers = {}
130
130
  auth_url = f'{self.proxy_base}/oauth2/auth'
131
131
  forwarded_headers['X-Forwarded-Uri'] = str(request.url).rstrip('/')
132
- # Remove content-length and content-type headers and drop request body
133
- # to reduce the auth overhead.
134
- forwarded_headers.pop('content-length', None)
135
- forwarded_headers.pop('content-type', None)
132
+ forwarded_headers['Host'] = request.url.hostname
136
133
  logger.debug(f'authenticate request: {auth_url}, '
137
134
  f'headers: {forwarded_headers}')
138
135
 
@@ -578,6 +578,26 @@ def reset_db_and_logs():
578
578
  f'{server_common.API_SERVER_CLIENT_DIR.expanduser()}')
579
579
  shutil.rmtree(server_common.API_SERVER_CLIENT_DIR.expanduser(),
580
580
  ignore_errors=True)
581
+ with _init_db_lock:
582
+ _init_db_within_lock()
583
+ assert _DB is not None
584
+ with _DB.conn:
585
+ cursor = _DB.conn.cursor()
586
+ cursor.execute('SELECT sqlite_version()')
587
+ row = cursor.fetchone()
588
+ if row is None:
589
+ raise RuntimeError('Failed to get SQLite version')
590
+ version_str = row[0]
591
+ version_parts = version_str.split('.')
592
+ assert len(version_parts) >= 2, \
593
+ f'Invalid version string: {version_str}'
594
+ major, minor = int(version_parts[0]), int(version_parts[1])
595
+ # SQLite 3.35.0+ supports RETURNING statements.
596
+ # 3.35.0 was released in March 2021.
597
+ if not ((major > 3) or (major == 3 and minor >= 35)):
598
+ raise RuntimeError(
599
+ f'SQLite version {version_str} is not supported. '
600
+ 'Please upgrade to SQLite 3.35.0 or later.')
581
601
 
582
602
 
583
603
  def request_lock_path(request_id: str) -> str:
@@ -733,12 +753,25 @@ async def get_request_status_async(
733
753
  @metrics_lib.time_me_async
734
754
  @asyncio_utils.shield
735
755
  async def create_if_not_exists_async(request: Request) -> bool:
736
- """Async version of create_if_not_exists."""
737
- async with filelock.AsyncFileLock(request_lock_path(request.request_id)):
738
- if await _get_request_no_lock_async(request.request_id) is not None:
739
- return False
740
- await _add_or_update_request_no_lock_async(request)
741
- return True
756
+ """Create a request if it does not exist, otherwise do nothing.
757
+
758
+ Returns:
759
+ True if a new request is created, False if the request already exists.
760
+ """
761
+ assert _DB is not None
762
+ request_columns = ', '.join(REQUEST_COLUMNS)
763
+ values_str = ', '.join(['?'] * len(REQUEST_COLUMNS))
764
+ sql_statement = (
765
+ f'INSERT INTO {REQUEST_TABLE} '
766
+ f'({request_columns}) VALUES '
767
+ f'({values_str}) ON CONFLICT(request_id) DO NOTHING RETURNING ROWID')
768
+ request_row = request.to_row()
769
+ # Execute the SQL statement without getting the request lock.
770
+ # The request lock is used to prevent racing with cancellation codepath,
771
+ # but a request cannot be cancelled before it is created.
772
+ row = await _DB.execute_get_returning_value_async(sql_statement,
773
+ request_row)
774
+ return True if row else False
742
775
 
743
776
 
744
777
  @dataclasses.dataclass
@@ -2,7 +2,7 @@
2
2
  import base64
3
3
  import pickle
4
4
  import typing
5
- from typing import Any, Dict, List, Optional, Tuple
5
+ from typing import Any, Dict, List, Optional, Tuple, Union
6
6
 
7
7
  from sky import jobs as managed_jobs
8
8
  from sky import models
@@ -116,22 +116,35 @@ def decode_jobs_queue(return_value: List[dict],) -> List[Dict[str, Any]]:
116
116
 
117
117
 
118
118
  @register_decoders('jobs.queue_v2')
119
- def decode_jobs_queue_v2(return_value) -> List[responses.ManagedJobRecord]:
119
+ def decode_jobs_queue_v2(
120
+ return_value
121
+ ) -> Union[Tuple[List[responses.ManagedJobRecord], int, Dict[str, int], int],
122
+ List[responses.ManagedJobRecord]]:
120
123
  """Decode jobs queue response.
121
124
 
122
- Supports legacy list, or a dict {jobs, total}.
123
- - Returns list[job]
125
+ Supports legacy list, or a dict {jobs, total, total_no_filter,
126
+ status_counts}.
127
+
128
+ - Returns either list[job] or tuple(list[job], total, status_counts,
129
+ total_no_filter)
124
130
  """
125
- # Case 1: dict shape {jobs, total}
126
- if isinstance(return_value, dict) and 'jobs' in return_value:
131
+ # Case 1: dict shape {jobs, total, total_no_filter, status_counts}
132
+ if isinstance(return_value, dict):
127
133
  jobs = return_value.get('jobs', [])
134
+ total = return_value.get('total', len(jobs))
135
+ total_no_filter = return_value.get('total_no_filter', total)
136
+ status_counts = return_value.get('status_counts', {})
137
+ for job in jobs:
138
+ job['status'] = managed_jobs.ManagedJobStatus(job['status'])
139
+ jobs = [responses.ManagedJobRecord(**job) for job in jobs]
140
+ return jobs, total, status_counts, total_no_filter
128
141
  else:
129
142
  # Case 2: legacy list
130
143
  jobs = return_value
131
- for job in jobs:
132
- job['status'] = managed_jobs.ManagedJobStatus(job['status'])
133
- jobs = [responses.ManagedJobRecord(**job) for job in jobs]
134
- return jobs
144
+ for job in jobs:
145
+ job['status'] = managed_jobs.ManagedJobStatus(job['status'])
146
+ jobs = [responses.ManagedJobRecord(**job) for job in jobs]
147
+ return jobs
135
148
 
136
149
 
137
150
  def _decode_serve_status(
@@ -148,12 +148,13 @@ def encode_jobs_queue_v2(
148
148
  else:
149
149
  jobs = jobs_or_tuple
150
150
  total = None
151
- for job in jobs:
151
+ jobs_dict = [job.model_dump(by_alias=True) for job in jobs]
152
+ for job in jobs_dict:
152
153
  job['status'] = job['status'].value
153
154
  if total is None:
154
- return [job.model_dump(by_alias=True) for job in jobs]
155
+ return jobs_dict
155
156
  return {
156
- 'jobs': [job.model_dump(by_alias=True) for job in jobs],
157
+ 'jobs': jobs_dict,
157
158
  'total': total,
158
159
  'total_no_filter': total_no_filter,
159
160
  'status_counts': status_counts