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.
- sky/__init__.py +2 -2
- sky/backends/backend_utils.py +18 -10
- sky/backends/cloud_vm_ray_backend.py +2 -2
- sky/check.py +0 -29
- sky/client/cli/command.py +46 -25
- sky/client/cli/table_utils.py +58 -1
- sky/client/sdk.py +7 -18
- sky/core.py +15 -16
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-07349868f7905d37.js → [pool]-509b2977a6373bf6.js} +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-7340bc0f0dd8ae74.js → webpack-4f0c389a4ce5fd9c.js} +1 -1
- sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_buildManifest.js +1 -1
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/data/storage.py +11 -0
- sky/data/storage_utils.py +1 -45
- sky/jobs/client/sdk.py +3 -2
- sky/jobs/controller.py +15 -0
- sky/jobs/server/core.py +24 -2
- sky/jobs/server/server.py +1 -1
- sky/jobs/utils.py +2 -1
- sky/provision/kubernetes/instance.py +1 -1
- sky/schemas/api/responses.py +55 -0
- sky/server/common.py +2 -1
- sky/server/requests/serializers/decoders.py +8 -4
- sky/server/requests/serializers/encoders.py +6 -5
- sky/task.py +4 -0
- sky/utils/cluster_utils.py +23 -5
- sky/utils/command_runner.py +21 -5
- sky/utils/command_runner.pyi +11 -0
- sky/utils/volume.py +5 -0
- {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/METADATA +37 -37
- {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/RECORD +51 -51
- /sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/licenses/LICENSE +0 -0
- {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-
|
|
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-
|
|
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>
|
sky/dashboard/out/clusters.html
CHANGED
|
@@ -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-
|
|
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>
|
sky/dashboard/out/config.html
CHANGED
|
@@ -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-
|
|
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>
|
sky/dashboard/out/index.html
CHANGED
|
@@ -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-
|
|
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-
|
|
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>
|
sky/dashboard/out/infra.html
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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>
|
sky/dashboard/out/jobs.html
CHANGED
|
@@ -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-
|
|
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>
|
sky/dashboard/out/users.html
CHANGED
|
@@ -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-
|
|
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>
|
sky/dashboard/out/volumes.html
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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[
|
|
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[
|
|
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.
|
|
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=
|
|
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()
|
sky/schemas/api/responses.py
CHANGED
|
@@ -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.
|
|
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[
|
|
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[
|
|
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[
|
|
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
|
|
193
|
+
return [
|
|
194
|
+
responses.StorageRecord(**storage_info) for storage_info in return_value
|
|
195
|
+
]
|
|
192
196
|
|
|
193
197
|
|
|
194
198
|
@register_decoders('job_status')
|