skypilot-nightly 1.0.0.dev20250927__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 (51) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +18 -10
  3. sky/backends/cloud_vm_ray_backend.py +2 -2
  4. sky/check.py +0 -29
  5. sky/client/cli/command.py +46 -25
  6. sky/client/cli/table_utils.py +58 -1
  7. sky/client/sdk.py +7 -18
  8. sky/core.py +15 -16
  9. sky/dashboard/out/404.html +1 -1
  10. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-07349868f7905d37.js → [pool]-509b2977a6373bf6.js} +1 -1
  11. sky/dashboard/out/_next/static/chunks/{webpack-7340bc0f0dd8ae74.js → webpack-4f0c389a4ce5fd9c.js} +1 -1
  12. sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_buildManifest.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/data/storage.py +11 -0
  29. sky/data/storage_utils.py +1 -45
  30. sky/jobs/client/sdk.py +3 -2
  31. sky/jobs/controller.py +15 -0
  32. sky/jobs/server/core.py +24 -2
  33. sky/jobs/server/server.py +1 -1
  34. sky/jobs/utils.py +2 -1
  35. sky/provision/kubernetes/instance.py +1 -1
  36. sky/schemas/api/responses.py +55 -0
  37. sky/server/common.py +2 -1
  38. sky/server/requests/serializers/decoders.py +8 -4
  39. sky/server/requests/serializers/encoders.py +6 -5
  40. sky/task.py +4 -0
  41. sky/utils/cluster_utils.py +23 -5
  42. sky/utils/command_runner.py +21 -5
  43. sky/utils/command_runner.pyi +11 -0
  44. sky/utils/volume.py +5 -0
  45. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/METADATA +37 -37
  46. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/RECORD +51 -51
  47. /sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_ssgManifest.js +0 -0
  48. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/WHEEL +0 -0
  49. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/entry_points.txt +0 -0
  50. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/licenses/LICENSE +0 -0
  51. {skypilot_nightly-1.0.0.dev20250927.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-7340bc0f0dd8ae74.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/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-ad77b12fc736dca3.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-ad77b12fc736dca3.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":"/clusters/[cluster]/[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-7340bc0f0dd8ae74.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/4676-9da7fdbde90b5549.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/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/6856-5fdc9b851a18acdb.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/9037-d0c00018a5ba198c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-e052384df65ef200.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/4676-9da7fdbde90b5549.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/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/6856-5fdc9b851a18acdb.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/9037-d0c00018a5ba198c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-e052384df65ef200.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":"/clusters/[cluster]","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-7340bc0f0dd8ae74.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-469814d711d63b1b.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/clusters-469814d711d63b1b.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":"/clusters","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/config-dfb9bf07b13045f4.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":"/config","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/index-444f1804401f04ea.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":"/","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-7340bc0f0dd8ae74.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-6563820e094f68ca.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/infra/%5Bcontext%5D-6563820e094f68ca.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":"/infra/[context]","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-7340bc0f0dd8ae74.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-aabba60d57826e0f.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/infra-aabba60d57826e0f.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":"/infra","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_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":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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-7340bc0f0dd8ae74.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/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","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/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
@@ -28,6 +28,7 @@ from sky.jobs import constants as managed_job_constants
28
28
  from sky.jobs import state as managed_job_state
29
29
  from sky.jobs import utils as managed_job_utils
30
30
  from sky.provision import common as provision_common
31
+ from sky.schemas.api import responses
31
32
  from sky.serve import serve_state
32
33
  from sky.serve import serve_utils
33
34
  from sky.serve.server import impl
@@ -296,8 +297,7 @@ def launch(
296
297
  # TODO: do something with returned status?
297
298
  _, _ = backend_utils.refresh_cluster_status_handle(
298
299
  cluster_name=cluster_name,
299
- force_refresh_statuses=set(status_lib.ClusterStatus),
300
- acquire_per_cluster_status_lock=False)
300
+ force_refresh_statuses=set(status_lib.ClusterStatus))
301
301
  except (exceptions.ClusterOwnerIdentityMismatchError,
302
302
  exceptions.CloudUserIdentityError,
303
303
  exceptions.ClusterStatusFetchingError) as e:
@@ -644,6 +644,28 @@ def queue(refresh: bool,
644
644
 
645
645
 
646
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
+
647
669
  def queue_v2(
648
670
  refresh: bool,
649
671
  skip_finished: bool = False,
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),
sky/jobs/utils.py CHANGED
@@ -33,6 +33,7 @@ from sky.backends import cloud_vm_ray_backend
33
33
  from sky.jobs import constants as managed_job_constants
34
34
  from sky.jobs import scheduler
35
35
  from sky.jobs import state as managed_job_state
36
+ from sky.schemas.api import responses
36
37
  from sky.skylet import constants
37
38
  from sky.skylet import job_lib
38
39
  from sky.skylet import log_lib
@@ -1517,7 +1518,7 @@ def load_managed_job_queue(
1517
1518
 
1518
1519
 
1519
1520
  def _get_job_status_from_tasks(
1520
- job_tasks: List[Dict[str, Any]]
1521
+ job_tasks: Union[List[responses.ManagedJobRecord], List[Dict[str, Any]]]
1521
1522
  ) -> Tuple[managed_job_state.ManagedJobStatus, int]:
1522
1523
  """Get the current task status and the current task id for a job."""
1523
1524
  managed_task_status = managed_job_state.ManagedJobStatus.SUCCEEDED
@@ -847,7 +847,7 @@ def _create_namespaced_pod_with_retries(namespace: str, pod_spec: dict,
847
847
  def _wait_for_deployment_pod(context,
848
848
  namespace,
849
849
  deployment,
850
- timeout=60) -> List:
850
+ timeout=300) -> List:
851
851
  label_selector = ','.join([
852
852
  f'{key}={value}'
853
853
  for key, value in deployment.spec.selector.match_labels.items()
@@ -5,7 +5,9 @@ from typing import Any, Dict, List, Optional
5
5
 
6
6
  import pydantic
7
7
 
8
+ from sky import data
8
9
  from sky import models
10
+ from sky.jobs import state as job_state
9
11
  from sky.server import common
10
12
  from sky.skylet import job_lib
11
13
  from sky.utils import status_lib
@@ -143,3 +145,56 @@ class UploadStatus(enum.Enum):
143
145
  """Status of the upload."""
144
146
  UPLOADING = 'uploading'
145
147
  COMPLETED = 'completed'
148
+
149
+
150
+ class StorageRecord(ResponseBaseModel):
151
+ """Response for the storage list endpoint."""
152
+ name: str
153
+ launched_at: int
154
+ store: List[data.StoreType]
155
+ last_use: str
156
+ status: status_lib.StorageStatus
157
+
158
+
159
+ # TODO (syang) figure out which fields are always present
160
+ # and therefore can be non-optional.
161
+ class ManagedJobRecord(ResponseBaseModel):
162
+ """A single managed job record."""
163
+ job_id: Optional[int] = None
164
+ task_id: Optional[int] = None
165
+ job_name: Optional[str] = None
166
+ task_name: Optional[str] = None
167
+ job_duration: Optional[float] = None
168
+ workspace: Optional[str] = None
169
+ status: Optional[job_state.ManagedJobStatus] = None
170
+ schedule_state: Optional[str] = None
171
+ resources: Optional[str] = None
172
+ cluster_resources: Optional[str] = None
173
+ cluster_resources_full: Optional[str] = None
174
+ cloud: Optional[str] = None
175
+ region: Optional[str] = None
176
+ zone: Optional[str] = None
177
+ infra: Optional[str] = None
178
+ recovery_count: Optional[int] = None
179
+ details: Optional[str] = None
180
+ failure_reason: Optional[str] = None
181
+ user_name: Optional[str] = None
182
+ user_hash: Optional[str] = None
183
+ submitted_at: Optional[float] = None
184
+ start_at: Optional[float] = None
185
+ end_at: Optional[float] = None
186
+ user_yaml: Optional[str] = None
187
+ entrypoint: Optional[str] = None
188
+ metadata: Optional[Dict[str, Any]] = None
189
+ controller_pid: Optional[int] = None
190
+ dag_yaml_path: Optional[str] = None
191
+ env_file_path: Optional[str] = None
192
+ last_recovered_at: Optional[float] = None
193
+ run_timestamp: Optional[str] = None
194
+ priority: Optional[int] = None
195
+ original_user_yaml_path: Optional[str] = None
196
+ pool: Optional[str] = None
197
+ pool_hash: Optional[str] = None
198
+ current_cluster_name: Optional[str] = None
199
+ job_id_on_pool_cluster: Optional[int] = None
200
+ accelerators: Optional[Dict[str, int]] = None
sky/server/common.py CHANGED
@@ -780,6 +780,7 @@ def check_server_healthy_or_start_fn(deploy: bool = False,
780
780
  os.path.expanduser(constants.API_SERVER_CREATION_LOCK_PATH)):
781
781
  # Check again if server is already running. Other processes may
782
782
  # have started the server while we were waiting for the lock.
783
+ get_api_server_status.cache_clear() # type: ignore[attr-defined]
783
784
  api_server_info = get_api_server_status(endpoint)
784
785
  if api_server_info.status == ApiServerStatus.UNHEALTHY:
785
786
  _start_api_server(deploy, host, foreground, metrics,
@@ -841,7 +842,7 @@ def process_mounts_in_task_on_api_server(task: str, env_vars: Dict[str, str],
841
842
  for task_config in task_configs:
842
843
  if task_config is None:
843
844
  continue
844
- file_mounts_mapping = task_config.get('file_mounts_mapping', {})
845
+ file_mounts_mapping = task_config.pop('file_mounts_mapping', {})
845
846
  if not file_mounts_mapping:
846
847
  # We did not mount any files to new paths on the remote server
847
848
  # so no need to resolve filepaths.
@@ -72,7 +72,7 @@ def decode_status_kubernetes(
72
72
  List[Dict[str, Any]], Optional[str]]
73
73
  ) -> Tuple[List[kubernetes_utils.KubernetesSkyPilotClusterInfoPayload],
74
74
  List[kubernetes_utils.KubernetesSkyPilotClusterInfoPayload],
75
- List[Dict[str, Any]], Optional[str]]:
75
+ List[responses.ManagedJobRecord], Optional[str]]:
76
76
  (encoded_all_clusters, encoded_unmanaged_clusters, all_jobs,
77
77
  context) = return_value
78
78
  all_clusters = []
@@ -85,6 +85,7 @@ def decode_status_kubernetes(
85
85
  cluster['status'] = status_lib.ClusterStatus(cluster['status'])
86
86
  unmanaged_clusters.append(
87
87
  kubernetes_utils.KubernetesSkyPilotClusterInfoPayload(**cluster))
88
+ all_jobs = [responses.ManagedJobRecord(**job) for job in all_jobs]
88
89
  return all_clusters, unmanaged_clusters, all_jobs, context
89
90
 
90
91
 
@@ -115,7 +116,7 @@ def decode_jobs_queue(return_value: List[dict],) -> List[Dict[str, Any]]:
115
116
 
116
117
 
117
118
  @register_decoders('jobs.queue_v2')
118
- def decode_jobs_queue_v2(return_value) -> List[Dict[str, Any]]:
119
+ def decode_jobs_queue_v2(return_value) -> List[responses.ManagedJobRecord]:
119
120
  """Decode jobs queue response.
120
121
 
121
122
  Supports legacy list, or a dict {jobs, total}.
@@ -129,6 +130,7 @@ def decode_jobs_queue_v2(return_value) -> List[Dict[str, Any]]:
129
130
  jobs = return_value
130
131
  for job in jobs:
131
132
  job['status'] = managed_jobs.ManagedJobStatus(job['status'])
133
+ jobs = [responses.ManagedJobRecord(**job) for job in jobs]
132
134
  return jobs
133
135
 
134
136
 
@@ -181,14 +183,16 @@ def decode_list_accelerators(
181
183
 
182
184
  @register_decoders('storage_ls')
183
185
  def decode_storage_ls(
184
- return_value: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
186
+ return_value: List[Dict[str, Any]]) -> List[responses.StorageRecord]:
185
187
  for storage_info in return_value:
186
188
  storage_info['status'] = status_lib.StorageStatus(
187
189
  storage_info['status'])
188
190
  storage_info['store'] = [
189
191
  storage.StoreType(store) for store in storage_info['store']
190
192
  ]
191
- return return_value
193
+ return [
194
+ responses.StorageRecord(**storage_info) for storage_info in return_value
195
+ ]
192
196
 
193
197
 
194
198
  @register_decoders('job_status')