skypilot-nightly 1.0.0.dev20251015__py3-none-any.whl → 1.0.0.dev20251017__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/authentication.py +17 -157
- sky/backends/backend_utils.py +6 -5
- sky/backends/cloud_vm_ray_backend.py +25 -12
- sky/catalog/kubernetes_catalog.py +5 -3
- sky/client/cli/command.py +0 -1
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-ac3a34c8f9fef041.js → webpack-3c431f6c9086e487.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/exceptions.py +13 -1
- sky/jobs/constants.py +1 -1
- sky/jobs/scheduler.py +2 -4
- sky/jobs/server/core.py +2 -1
- sky/jobs/server/server.py +5 -3
- sky/jobs/state.py +12 -6
- sky/jobs/utils.py +8 -2
- sky/provision/fluidstack/instance.py +2 -2
- sky/provision/seeweb/instance.py +3 -3
- sky/schemas/generated/jobsv1_pb2.py +52 -52
- sky/schemas/generated/jobsv1_pb2.pyi +4 -2
- sky/serve/server/server.py +1 -0
- sky/serve/service.py +2 -2
- sky/server/requests/executor.py +51 -15
- sky/server/requests/preconditions.py +2 -2
- sky/server/requests/requests.py +33 -24
- sky/server/requests/threads.py +106 -0
- sky/server/rest.py +36 -18
- sky/server/server.py +26 -4
- sky/server/stream_utils.py +10 -3
- sky/setup_files/dependencies.py +19 -8
- sky/skylet/constants.py +1 -1
- sky/skylet/services.py +3 -1
- sky/utils/auth_utils.py +153 -0
- sky/utils/command_runner.py +3 -0
- sky/utils/context_utils.py +2 -0
- sky/utils/locks.py +5 -2
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/METADATA +281 -52
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/RECORD +58 -56
- /sky/dashboard/out/_next/static/{-bih7JVStsXyeasac-dvQ → 3xvBA5BSGbiQ87tVmfbpY}/_buildManifest.js +0 -0
- /sky/dashboard/out/_next/static/{-bih7JVStsXyeasac-dvQ → 3xvBA5BSGbiQ87tVmfbpY}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.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-3c431f6c9086e487.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-e5c9ce6a24fc0de4.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-bc979970c247d8f3.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_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":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.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-a35a9dc3c5ccd657.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.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-98d2ed979084162a.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.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-835d14ba94808f79.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.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/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.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-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-3b40c39626f99c89.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-e8688c35c06f0ac5.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","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-3c431f6c9086e487.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-69c80d677d3c2949.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/3xvBA5BSGbiQ87tVmfbpY/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"3xvBA5BSGbiQ87tVmfbpY","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/exceptions.py
CHANGED
|
@@ -649,7 +649,14 @@ class VolumeTopologyConflictError(Exception):
|
|
|
649
649
|
|
|
650
650
|
class ServerTemporarilyUnavailableError(Exception):
|
|
651
651
|
"""Raised when the server is temporarily unavailable."""
|
|
652
|
-
|
|
652
|
+
|
|
653
|
+
def __init__(self, message: str):
|
|
654
|
+
super().__init__(message)
|
|
655
|
+
self.message = message
|
|
656
|
+
|
|
657
|
+
def __str__(self):
|
|
658
|
+
return ('SkyPilot API server is temporarily unavailable: '
|
|
659
|
+
f'{self.message}. Please try again later.')
|
|
653
660
|
|
|
654
661
|
|
|
655
662
|
class RestfulPolicyError(Exception):
|
|
@@ -686,3 +693,8 @@ class ClientError(Exception):
|
|
|
686
693
|
If a request encounters a ClientError, it will not be retried to the server.
|
|
687
694
|
"""
|
|
688
695
|
pass
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
class ConcurrentWorkerExhaustedError(Exception):
|
|
699
|
+
"""Raised when the concurrent worker is exhausted."""
|
|
700
|
+
pass
|
sky/jobs/constants.py
CHANGED
|
@@ -46,7 +46,7 @@ JOBS_CLUSTER_NAME_PREFIX_LENGTH = 25
|
|
|
46
46
|
# The version of the lib files that jobs/utils use. Whenever there is an API
|
|
47
47
|
# change for the jobs/utils, we need to bump this version and update
|
|
48
48
|
# job.utils.ManagedJobCodeGen to handle the version update.
|
|
49
|
-
MANAGED_JOBS_VERSION =
|
|
49
|
+
MANAGED_JOBS_VERSION = 11
|
|
50
50
|
|
|
51
51
|
# The command for setting up the jobs dashboard on the controller. It firstly
|
|
52
52
|
# checks if the systemd services are available, and if not (e.g., Kubernetes
|
sky/jobs/scheduler.py
CHANGED
|
@@ -64,7 +64,6 @@ from sky.jobs import utils as managed_job_utils
|
|
|
64
64
|
from sky.server import config as server_config
|
|
65
65
|
from sky.skylet import constants
|
|
66
66
|
from sky.utils import annotations
|
|
67
|
-
from sky.utils import common_utils
|
|
68
67
|
from sky.utils import controller_utils
|
|
69
68
|
from sky.utils import subprocess_utils
|
|
70
69
|
|
|
@@ -290,9 +289,8 @@ def submit_job(job_id: int, dag_yaml_path: str, original_user_yaml_path: str,
|
|
|
290
289
|
maybe_start_controllers(from_scheduler=True)
|
|
291
290
|
return
|
|
292
291
|
|
|
293
|
-
state.scheduler_set_waiting(job_id, dag_yaml_path,
|
|
294
|
-
|
|
295
|
-
common_utils.get_user_hash(), priority)
|
|
292
|
+
state.scheduler_set_waiting(job_id, dag_yaml_path, original_user_yaml_path,
|
|
293
|
+
env_file_path, priority)
|
|
296
294
|
if state.get_ha_recovery_script(job_id) is None:
|
|
297
295
|
# the run command is just the command that called scheduler
|
|
298
296
|
run = (f'source {env_file_path} && '
|
sky/jobs/server/core.py
CHANGED
|
@@ -142,7 +142,8 @@ def _maybe_submit_job_locally(prefix: str, dag: 'sky.Dag',
|
|
|
142
142
|
force_user_workspace=True),
|
|
143
143
|
entrypoint=common_utils.get_current_command(),
|
|
144
144
|
pool=pool,
|
|
145
|
-
pool_hash=pool_hash
|
|
145
|
+
pool_hash=pool_hash,
|
|
146
|
+
user_hash=common_utils.get_user_hash()))
|
|
146
147
|
for task_id, task in enumerate(dag.tasks):
|
|
147
148
|
resources_str = backend_utils.get_task_resources_str(
|
|
148
149
|
task, is_managed_job=True)
|
sky/jobs/server/server.py
CHANGED
|
@@ -99,6 +99,8 @@ async def logs(
|
|
|
99
99
|
# When refresh is specified, the job controller might be restarted,
|
|
100
100
|
# which takes longer time to finish. We schedule it to long executor.
|
|
101
101
|
schedule_type = api_requests.ScheduleType.LONG
|
|
102
|
+
if schedule_type == api_requests.ScheduleType.SHORT:
|
|
103
|
+
executor.check_request_thread_executor_available()
|
|
102
104
|
request_task = executor.prepare_request(
|
|
103
105
|
request_id=request.state.request_id,
|
|
104
106
|
request_name='jobs.logs',
|
|
@@ -107,14 +109,14 @@ async def logs(
|
|
|
107
109
|
schedule_type=schedule_type,
|
|
108
110
|
request_cluster_name=common.JOB_CONTROLLER_NAME,
|
|
109
111
|
)
|
|
110
|
-
if schedule_type == api_requests.ScheduleType.
|
|
111
|
-
executor.schedule_prepared_request(request_task)
|
|
112
|
-
else:
|
|
112
|
+
if schedule_type == api_requests.ScheduleType.SHORT:
|
|
113
113
|
# For short request, run in the coroutine to avoid blocking
|
|
114
114
|
# short workers.
|
|
115
115
|
task = executor.execute_request_in_coroutine(request_task)
|
|
116
116
|
# Cancel the coroutine after the request is done or client disconnects
|
|
117
117
|
background_tasks.add_task(task.cancel)
|
|
118
|
+
else:
|
|
119
|
+
executor.schedule_prepared_request(request_task)
|
|
118
120
|
|
|
119
121
|
return stream_utils.stream_response_for_long_request(
|
|
120
122
|
request_id=request_task.request_id,
|
sky/jobs/state.py
CHANGED
|
@@ -692,8 +692,8 @@ class ManagedJobScheduleState(enum.Enum):
|
|
|
692
692
|
# === Status transition functions ===
|
|
693
693
|
@_init_db
|
|
694
694
|
def set_job_info_without_job_id(name: str, workspace: str, entrypoint: str,
|
|
695
|
-
pool: Optional[str],
|
|
696
|
-
|
|
695
|
+
pool: Optional[str], pool_hash: Optional[str],
|
|
696
|
+
user_hash: Optional[str]) -> int:
|
|
697
697
|
assert _SQLALCHEMY_ENGINE is not None
|
|
698
698
|
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
699
699
|
if (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
@@ -712,6 +712,7 @@ def set_job_info_without_job_id(name: str, workspace: str, entrypoint: str,
|
|
|
712
712
|
entrypoint=entrypoint,
|
|
713
713
|
pool=pool,
|
|
714
714
|
pool_hash=pool_hash,
|
|
715
|
+
user_hash=user_hash,
|
|
715
716
|
)
|
|
716
717
|
|
|
717
718
|
if (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
@@ -1241,7 +1242,7 @@ def get_task_specs(job_id: int, task_id: int) -> Dict[str, Any]:
|
|
|
1241
1242
|
@_init_db
|
|
1242
1243
|
def scheduler_set_waiting(job_id: int, dag_yaml_path: str,
|
|
1243
1244
|
original_user_yaml_path: str, env_file_path: str,
|
|
1244
|
-
|
|
1245
|
+
priority: int):
|
|
1245
1246
|
"""Do not call without holding the scheduler lock.
|
|
1246
1247
|
|
|
1247
1248
|
Returns: Whether this is a recovery run or not.
|
|
@@ -1260,7 +1261,6 @@ def scheduler_set_waiting(job_id: int, dag_yaml_path: str,
|
|
|
1260
1261
|
job_info_table.c.dag_yaml_path: dag_yaml_path,
|
|
1261
1262
|
job_info_table.c.original_user_yaml_path: original_user_yaml_path,
|
|
1262
1263
|
job_info_table.c.env_file_path: env_file_path,
|
|
1263
|
-
job_info_table.c.user_hash: user_hash,
|
|
1264
1264
|
job_info_table.c.priority: priority,
|
|
1265
1265
|
})
|
|
1266
1266
|
session.commit()
|
|
@@ -2000,8 +2000,13 @@ async def scheduler_set_done_async(job_id: int,
|
|
|
2000
2000
|
|
|
2001
2001
|
|
|
2002
2002
|
@_init_db
|
|
2003
|
-
def set_job_info(job_id: int,
|
|
2004
|
-
|
|
2003
|
+
def set_job_info(job_id: int,
|
|
2004
|
+
name: str,
|
|
2005
|
+
workspace: str,
|
|
2006
|
+
entrypoint: str,
|
|
2007
|
+
pool: Optional[str],
|
|
2008
|
+
pool_hash: Optional[str],
|
|
2009
|
+
user_hash: Optional[str] = None):
|
|
2005
2010
|
assert _SQLALCHEMY_ENGINE is not None
|
|
2006
2011
|
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
2007
2012
|
if (_SQLALCHEMY_ENGINE.dialect.name ==
|
|
@@ -2020,6 +2025,7 @@ def set_job_info(job_id: int, name: str, workspace: str, entrypoint: str,
|
|
|
2020
2025
|
entrypoint=entrypoint,
|
|
2021
2026
|
pool=pool,
|
|
2022
2027
|
pool_hash=pool_hash,
|
|
2028
|
+
user_hash=user_hash,
|
|
2023
2029
|
)
|
|
2024
2030
|
session.execute(insert_stmt)
|
|
2025
2031
|
session.commit()
|
sky/jobs/utils.py
CHANGED
|
@@ -2148,8 +2148,12 @@ class ManagedJobCodeGen:
|
|
|
2148
2148
|
return cls._build(code)
|
|
2149
2149
|
|
|
2150
2150
|
@classmethod
|
|
2151
|
-
def set_pending(cls,
|
|
2152
|
-
|
|
2151
|
+
def set_pending(cls,
|
|
2152
|
+
job_id: int,
|
|
2153
|
+
managed_job_dag: 'dag_lib.Dag',
|
|
2154
|
+
workspace: str,
|
|
2155
|
+
entrypoint: str,
|
|
2156
|
+
user_hash: Optional[str] = None) -> str:
|
|
2153
2157
|
dag_name = managed_job_dag.name
|
|
2154
2158
|
pool = managed_job_dag.pool
|
|
2155
2159
|
# Add the managed job to queue table.
|
|
@@ -2166,6 +2170,8 @@ class ManagedJobCodeGen:
|
|
|
2166
2170
|
pool_hash = serve_state.get_service_hash({pool!r})
|
|
2167
2171
|
set_job_info_kwargs['pool'] = {pool!r}
|
|
2168
2172
|
set_job_info_kwargs['pool_hash'] = pool_hash
|
|
2173
|
+
if managed_job_version >= 11:
|
|
2174
|
+
set_job_info_kwargs['user_hash'] = {user_hash!r}
|
|
2169
2175
|
managed_job_state.set_job_info(
|
|
2170
2176
|
{job_id}, {dag_name!r}, **set_job_info_kwargs)
|
|
2171
2177
|
""")
|
|
@@ -3,11 +3,11 @@ import os
|
|
|
3
3
|
import time
|
|
4
4
|
from typing import Any, Dict, List, Optional, Tuple
|
|
5
5
|
|
|
6
|
-
from sky import authentication as auth
|
|
7
6
|
from sky import exceptions
|
|
8
7
|
from sky import sky_logging
|
|
9
8
|
from sky.provision import common
|
|
10
9
|
from sky.provision.fluidstack import fluidstack_utils as utils
|
|
10
|
+
from sky.utils import auth_utils
|
|
11
11
|
from sky.utils import command_runner
|
|
12
12
|
from sky.utils import common_utils
|
|
13
13
|
from sky.utils import status_lib
|
|
@@ -27,7 +27,7 @@ logger = sky_logging.init_logger(__name__)
|
|
|
27
27
|
def get_internal_ip(node_info: Dict[str, Any]) -> None:
|
|
28
28
|
node_info['internal_ip'] = node_info['ip_address']
|
|
29
29
|
|
|
30
|
-
private_key_path, _ =
|
|
30
|
+
private_key_path, _ = auth_utils.get_or_generate_keys()
|
|
31
31
|
runner = command_runner.SSHCommandRunner(
|
|
32
32
|
(node_info['ip_address'], 22),
|
|
33
33
|
ssh_user='ubuntu',
|
sky/provision/seeweb/instance.py
CHANGED
|
@@ -9,7 +9,6 @@ import subprocess
|
|
|
9
9
|
import time
|
|
10
10
|
from typing import Any, Dict, List, Optional, Tuple
|
|
11
11
|
|
|
12
|
-
from sky import authentication as auth
|
|
13
12
|
from sky import sky_logging
|
|
14
13
|
from sky.adaptors import seeweb as seeweb_adaptor
|
|
15
14
|
from sky.provision import common
|
|
@@ -17,6 +16,7 @@ from sky.provision.common import ClusterInfo
|
|
|
17
16
|
from sky.provision.common import InstanceInfo
|
|
18
17
|
from sky.provision.common import ProvisionConfig
|
|
19
18
|
from sky.provision.common import ProvisionRecord
|
|
19
|
+
from sky.utils import auth_utils
|
|
20
20
|
from sky.utils import command_runner # Unified SSH helper
|
|
21
21
|
from sky.utils import common_utils
|
|
22
22
|
from sky.utils import status_lib
|
|
@@ -75,7 +75,7 @@ class SeewebNodeProvider:
|
|
|
75
75
|
if self.config and self.config.authentication_config:
|
|
76
76
|
key_path = self.config.authentication_config.get('ssh_private_key')
|
|
77
77
|
if not key_path:
|
|
78
|
-
key_path, _ =
|
|
78
|
+
key_path, _ = auth_utils.get_or_generate_keys()
|
|
79
79
|
return os.path.expanduser(key_path)
|
|
80
80
|
|
|
81
81
|
# ------------------------------------------------------------------ #
|
|
@@ -661,7 +661,7 @@ def _ping_server_standalone(server_ip: str) -> bool:
|
|
|
661
661
|
def _check_ssh_ready_standalone(server_ip: str) -> bool:
|
|
662
662
|
"""Check that SSH is available on the server (standalone version)."""
|
|
663
663
|
try:
|
|
664
|
-
private_key_path, _ =
|
|
664
|
+
private_key_path, _ = auth_utils.get_or_generate_keys()
|
|
665
665
|
private_key_path = os.path.expanduser(private_key_path)
|
|
666
666
|
ssh_user = 'ecuser'
|
|
667
667
|
result = subprocess.run([
|
|
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"sky/schemas/generated/jobsv1.proto\x12\x07jobs.v1\"\x85\x01\n\rAddJobRequest\x12\x15\n\x08job_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x15\n\rrun_timestamp\x18\x03 \x01(\t\x12\x15\n\rresources_str\x18\x04 \x01(\t\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x0b\n\t_job_name\"1\n\x0e\x41\x64\x64JobResponse\x12\x0e\n\x06job_id\x18\x01 \x01(\x03\x12\x0f\n\x07log_dir\x18\x02 \x01(\t\"\xb3\x01\n\x0fQueueJobRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\x03\x12\x14\n\x07\x63odegen\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bscript_path\x18\x03 \x01(\t\x12\x16\n\x0eremote_log_dir\x18\x04 \x01(\t\x12\x31\n\x0bmanaged_job\x18\x05 \x01(\x0b\x32\x17.jobs.v1.ManagedJobInfoH\x01\x88\x01\x01\x42\n\n\x08_codegenB\x0e\n\x0c_managed_job\"\
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"sky/schemas/generated/jobsv1.proto\x12\x07jobs.v1\"\x85\x01\n\rAddJobRequest\x12\x15\n\x08job_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x15\n\rrun_timestamp\x18\x03 \x01(\t\x12\x15\n\rresources_str\x18\x04 \x01(\t\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x0b\n\t_job_name\"1\n\x0e\x41\x64\x64JobResponse\x12\x0e\n\x06job_id\x18\x01 \x01(\x03\x12\x0f\n\x07log_dir\x18\x02 \x01(\t\"\xb3\x01\n\x0fQueueJobRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\x03\x12\x14\n\x07\x63odegen\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bscript_path\x18\x03 \x01(\t\x12\x16\n\x0eremote_log_dir\x18\x04 \x01(\t\x12\x31\n\x0bmanaged_job\x18\x05 \x01(\x0b\x32\x17.jobs.v1.ManagedJobInfoH\x01\x88\x01\x01\x42\n\n\x08_codegenB\x0e\n\x0c_managed_job\"\xab\x01\n\x0eManagedJobInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\x04pool\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\tworkspace\x18\x03 \x01(\t\x12\x12\n\nentrypoint\x18\x04 \x01(\t\x12&\n\x05tasks\x18\x05 \x03(\x0b\x32\x17.jobs.v1.ManagedJobTask\x12\x14\n\x07user_id\x18\x06 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_poolB\n\n\x08_user_id\"]\n\x0eManagedJobTask\x12\x0f\n\x07task_id\x18\x01 \x01(\x05\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rresources_str\x18\x03 \x01(\t\x12\x15\n\rmetadata_json\x18\x04 \x01(\t\"\x12\n\x10QueueJobResponse\"\x15\n\x13UpdateStatusRequest\"\x16\n\x14UpdateStatusResponse\"L\n\x12GetJobQueueRequest\x12\x16\n\tuser_hash\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08\x61ll_jobs\x18\x02 \x01(\x08\x42\x0c\n\n_user_hash\"\xa3\x02\n\x07JobInfo\x12\x0e\n\x06job_id\x18\x01 \x01(\x03\x12\x10\n\x08job_name\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x14\n\x0csubmitted_at\x18\x04 \x01(\x01\x12\"\n\x06status\x18\x05 \x01(\x0e\x32\x12.jobs.v1.JobStatus\x12\x15\n\rrun_timestamp\x18\x06 \x01(\t\x12\x15\n\x08start_at\x18\x07 \x01(\x01H\x00\x88\x01\x01\x12\x13\n\x06\x65nd_at\x18\x08 \x01(\x01H\x01\x88\x01\x01\x12\x11\n\tresources\x18\t \x01(\t\x12\x10\n\x03pid\x18\n \x01(\x03H\x02\x88\x01\x01\x12\x10\n\x08log_path\x18\x0b \x01(\t\x12\x10\n\x08metadata\x18\x0c \x01(\tB\x0b\n\t_start_atB\t\n\x07_end_atB\x06\n\x04_pid\"5\n\x13GetJobQueueResponse\x12\x1e\n\x04jobs\x18\x01 \x03(\x0b\x32\x10.jobs.v1.JobInfo\"^\n\x11\x43\x61ncelJobsRequest\x12\x0f\n\x07job_ids\x18\x01 \x03(\x03\x12\x12\n\ncancel_all\x18\x02 \x01(\x08\x12\x16\n\tuser_hash\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_user_hash\"/\n\x12\x43\x61ncelJobsResponse\x12\x19\n\x11\x63\x61ncelled_job_ids\x18\x01 \x03(\x03\"\x1e\n\x1c\x46\x61ilAllInProgressJobsRequest\"\x1f\n\x1d\x46\x61ilAllInProgressJobsResponse\"\x7f\n\x0fTailLogsRequest\x12\x13\n\x06job_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x1b\n\x0emanaged_job_id\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12\x0e\n\x06\x66ollow\x18\x03 \x01(\x08\x12\x0c\n\x04tail\x18\x04 \x01(\x05\x42\t\n\x07_job_idB\x11\n\x0f_managed_job_id\"7\n\x10TailLogsResponse\x12\x10\n\x08log_line\x18\x01 \x01(\t\x12\x11\n\texit_code\x18\x02 \x01(\x05\"&\n\x13GetJobStatusRequest\x12\x0f\n\x07job_ids\x18\x01 \x03(\x03\"\xa4\x01\n\x14GetJobStatusResponse\x12\x44\n\x0cjob_statuses\x18\x01 \x03(\x0b\x32..jobs.v1.GetJobStatusResponse.JobStatusesEntry\x1a\x46\n\x10JobStatusesEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12!\n\x05value\x18\x02 \x01(\x0e\x32\x12.jobs.v1.JobStatus:\x02\x38\x01\"A\n\x1fGetJobSubmittedTimestampRequest\x12\x13\n\x06job_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\t\n\x07_job_id\"5\n GetJobSubmittedTimestampResponse\x12\x11\n\ttimestamp\x18\x01 \x01(\x02\"=\n\x1bGetJobEndedTimestampRequest\x12\x13\n\x06job_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\t\n\x07_job_id\"1\n\x1cGetJobEndedTimestampResponse\x12\x11\n\ttimestamp\x18\x01 \x01(\x02\"+\n\x18GetLogDirsForJobsRequest\x12\x0f\n\x07job_ids\x18\x01 \x03(\x03\"\x98\x01\n\x19GetLogDirsForJobsResponse\x12H\n\x0cjob_log_dirs\x18\x01 \x03(\x0b\x32\x32.jobs.v1.GetLogDirsForJobsResponse.JobLogDirsEntry\x1a\x31\n\x0fJobLogDirsEntry\x12\x0b\n\x03key\x18\x01 \x01(\x03\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\x8d\x02\n\tJobStatus\x12\x1a\n\x16JOB_STATUS_UNSPECIFIED\x10\x00\x12\x13\n\x0fJOB_STATUS_INIT\x10\x01\x12\x16\n\x12JOB_STATUS_PENDING\x10\x02\x12\x19\n\x15JOB_STATUS_SETTING_UP\x10\x03\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x04\x12\x1c\n\x18JOB_STATUS_FAILED_DRIVER\x10\x05\x12\x18\n\x14JOB_STATUS_SUCCEEDED\x10\x06\x12\x15\n\x11JOB_STATUS_FAILED\x10\x07\x12\x1b\n\x17JOB_STATUS_FAILED_SETUP\x10\x08\x12\x18\n\x14JOB_STATUS_CANCELLED\x10\t2\x91\x07\n\x0bJobsService\x12\x39\n\x06\x41\x64\x64Job\x12\x16.jobs.v1.AddJobRequest\x1a\x17.jobs.v1.AddJobResponse\x12?\n\x08QueueJob\x12\x18.jobs.v1.QueueJobRequest\x1a\x19.jobs.v1.QueueJobResponse\x12K\n\x0cUpdateStatus\x12\x1c.jobs.v1.UpdateStatusRequest\x1a\x1d.jobs.v1.UpdateStatusResponse\x12H\n\x0bGetJobQueue\x12\x1b.jobs.v1.GetJobQueueRequest\x1a\x1c.jobs.v1.GetJobQueueResponse\x12\x45\n\nCancelJobs\x12\x1a.jobs.v1.CancelJobsRequest\x1a\x1b.jobs.v1.CancelJobsResponse\x12\x66\n\x15\x46\x61ilAllInProgressJobs\x12%.jobs.v1.FailAllInProgressJobsRequest\x1a&.jobs.v1.FailAllInProgressJobsResponse\x12\x41\n\x08TailLogs\x12\x18.jobs.v1.TailLogsRequest\x1a\x19.jobs.v1.TailLogsResponse0\x01\x12K\n\x0cGetJobStatus\x12\x1c.jobs.v1.GetJobStatusRequest\x1a\x1d.jobs.v1.GetJobStatusResponse\x12o\n\x18GetJobSubmittedTimestamp\x12(.jobs.v1.GetJobSubmittedTimestampRequest\x1a).jobs.v1.GetJobSubmittedTimestampResponse\x12\x63\n\x14GetJobEndedTimestamp\x12$.jobs.v1.GetJobEndedTimestampRequest\x1a%.jobs.v1.GetJobEndedTimestampResponse\x12Z\n\x11GetLogDirsForJobs\x12!.jobs.v1.GetLogDirsForJobsRequest\x1a\".jobs.v1.GetLogDirsForJobsResponseb\x06proto3')
|
|
18
18
|
|
|
19
19
|
_globals = globals()
|
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -25,8 +25,8 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
|
25
25
|
_globals['_GETJOBSTATUSRESPONSE_JOBSTATUSESENTRY']._serialized_options = b'8\001'
|
|
26
26
|
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._loaded_options = None
|
|
27
27
|
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._serialized_options = b'8\001'
|
|
28
|
-
_globals['_JOBSTATUS']._serialized_start=
|
|
29
|
-
_globals['_JOBSTATUS']._serialized_end=
|
|
28
|
+
_globals['_JOBSTATUS']._serialized_start=2219
|
|
29
|
+
_globals['_JOBSTATUS']._serialized_end=2488
|
|
30
30
|
_globals['_ADDJOBREQUEST']._serialized_start=48
|
|
31
31
|
_globals['_ADDJOBREQUEST']._serialized_end=181
|
|
32
32
|
_globals['_ADDJOBRESPONSE']._serialized_start=183
|
|
@@ -34,53 +34,53 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
|
34
34
|
_globals['_QUEUEJOBREQUEST']._serialized_start=235
|
|
35
35
|
_globals['_QUEUEJOBREQUEST']._serialized_end=414
|
|
36
36
|
_globals['_MANAGEDJOBINFO']._serialized_start=417
|
|
37
|
-
_globals['_MANAGEDJOBINFO']._serialized_end=
|
|
38
|
-
_globals['_MANAGEDJOBTASK']._serialized_start=
|
|
39
|
-
_globals['_MANAGEDJOBTASK']._serialized_end=
|
|
40
|
-
_globals['_QUEUEJOBRESPONSE']._serialized_start=
|
|
41
|
-
_globals['_QUEUEJOBRESPONSE']._serialized_end=
|
|
42
|
-
_globals['_UPDATESTATUSREQUEST']._serialized_start=
|
|
43
|
-
_globals['_UPDATESTATUSREQUEST']._serialized_end=
|
|
44
|
-
_globals['_UPDATESTATUSRESPONSE']._serialized_start=
|
|
45
|
-
_globals['_UPDATESTATUSRESPONSE']._serialized_end=
|
|
46
|
-
_globals['_GETJOBQUEUEREQUEST']._serialized_start=
|
|
47
|
-
_globals['_GETJOBQUEUEREQUEST']._serialized_end=
|
|
48
|
-
_globals['_JOBINFO']._serialized_start=
|
|
49
|
-
_globals['_JOBINFO']._serialized_end=
|
|
50
|
-
_globals['_GETJOBQUEUERESPONSE']._serialized_start=
|
|
51
|
-
_globals['_GETJOBQUEUERESPONSE']._serialized_end=
|
|
52
|
-
_globals['_CANCELJOBSREQUEST']._serialized_start=
|
|
53
|
-
_globals['_CANCELJOBSREQUEST']._serialized_end=
|
|
54
|
-
_globals['_CANCELJOBSRESPONSE']._serialized_start=
|
|
55
|
-
_globals['_CANCELJOBSRESPONSE']._serialized_end=
|
|
56
|
-
_globals['_FAILALLINPROGRESSJOBSREQUEST']._serialized_start=
|
|
57
|
-
_globals['_FAILALLINPROGRESSJOBSREQUEST']._serialized_end=
|
|
58
|
-
_globals['_FAILALLINPROGRESSJOBSRESPONSE']._serialized_start=
|
|
59
|
-
_globals['_FAILALLINPROGRESSJOBSRESPONSE']._serialized_end=
|
|
60
|
-
_globals['_TAILLOGSREQUEST']._serialized_start=
|
|
61
|
-
_globals['_TAILLOGSREQUEST']._serialized_end=
|
|
62
|
-
_globals['_TAILLOGSRESPONSE']._serialized_start=
|
|
63
|
-
_globals['_TAILLOGSRESPONSE']._serialized_end=
|
|
64
|
-
_globals['_GETJOBSTATUSREQUEST']._serialized_start=
|
|
65
|
-
_globals['_GETJOBSTATUSREQUEST']._serialized_end=
|
|
66
|
-
_globals['_GETJOBSTATUSRESPONSE']._serialized_start=
|
|
67
|
-
_globals['_GETJOBSTATUSRESPONSE']._serialized_end=
|
|
68
|
-
_globals['_GETJOBSTATUSRESPONSE_JOBSTATUSESENTRY']._serialized_start=
|
|
69
|
-
_globals['_GETJOBSTATUSRESPONSE_JOBSTATUSESENTRY']._serialized_end=
|
|
70
|
-
_globals['_GETJOBSUBMITTEDTIMESTAMPREQUEST']._serialized_start=
|
|
71
|
-
_globals['_GETJOBSUBMITTEDTIMESTAMPREQUEST']._serialized_end=
|
|
72
|
-
_globals['_GETJOBSUBMITTEDTIMESTAMPRESPONSE']._serialized_start=
|
|
73
|
-
_globals['_GETJOBSUBMITTEDTIMESTAMPRESPONSE']._serialized_end=
|
|
74
|
-
_globals['_GETJOBENDEDTIMESTAMPREQUEST']._serialized_start=
|
|
75
|
-
_globals['_GETJOBENDEDTIMESTAMPREQUEST']._serialized_end=
|
|
76
|
-
_globals['_GETJOBENDEDTIMESTAMPRESPONSE']._serialized_start=
|
|
77
|
-
_globals['_GETJOBENDEDTIMESTAMPRESPONSE']._serialized_end=
|
|
78
|
-
_globals['_GETLOGDIRSFORJOBSREQUEST']._serialized_start=
|
|
79
|
-
_globals['_GETLOGDIRSFORJOBSREQUEST']._serialized_end=
|
|
80
|
-
_globals['_GETLOGDIRSFORJOBSRESPONSE']._serialized_start=
|
|
81
|
-
_globals['_GETLOGDIRSFORJOBSRESPONSE']._serialized_end=
|
|
82
|
-
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._serialized_start=
|
|
83
|
-
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._serialized_end=
|
|
84
|
-
_globals['_JOBSSERVICE']._serialized_start=
|
|
85
|
-
_globals['_JOBSSERVICE']._serialized_end=
|
|
37
|
+
_globals['_MANAGEDJOBINFO']._serialized_end=588
|
|
38
|
+
_globals['_MANAGEDJOBTASK']._serialized_start=590
|
|
39
|
+
_globals['_MANAGEDJOBTASK']._serialized_end=683
|
|
40
|
+
_globals['_QUEUEJOBRESPONSE']._serialized_start=685
|
|
41
|
+
_globals['_QUEUEJOBRESPONSE']._serialized_end=703
|
|
42
|
+
_globals['_UPDATESTATUSREQUEST']._serialized_start=705
|
|
43
|
+
_globals['_UPDATESTATUSREQUEST']._serialized_end=726
|
|
44
|
+
_globals['_UPDATESTATUSRESPONSE']._serialized_start=728
|
|
45
|
+
_globals['_UPDATESTATUSRESPONSE']._serialized_end=750
|
|
46
|
+
_globals['_GETJOBQUEUEREQUEST']._serialized_start=752
|
|
47
|
+
_globals['_GETJOBQUEUEREQUEST']._serialized_end=828
|
|
48
|
+
_globals['_JOBINFO']._serialized_start=831
|
|
49
|
+
_globals['_JOBINFO']._serialized_end=1122
|
|
50
|
+
_globals['_GETJOBQUEUERESPONSE']._serialized_start=1124
|
|
51
|
+
_globals['_GETJOBQUEUERESPONSE']._serialized_end=1177
|
|
52
|
+
_globals['_CANCELJOBSREQUEST']._serialized_start=1179
|
|
53
|
+
_globals['_CANCELJOBSREQUEST']._serialized_end=1273
|
|
54
|
+
_globals['_CANCELJOBSRESPONSE']._serialized_start=1275
|
|
55
|
+
_globals['_CANCELJOBSRESPONSE']._serialized_end=1322
|
|
56
|
+
_globals['_FAILALLINPROGRESSJOBSREQUEST']._serialized_start=1324
|
|
57
|
+
_globals['_FAILALLINPROGRESSJOBSREQUEST']._serialized_end=1354
|
|
58
|
+
_globals['_FAILALLINPROGRESSJOBSRESPONSE']._serialized_start=1356
|
|
59
|
+
_globals['_FAILALLINPROGRESSJOBSRESPONSE']._serialized_end=1387
|
|
60
|
+
_globals['_TAILLOGSREQUEST']._serialized_start=1389
|
|
61
|
+
_globals['_TAILLOGSREQUEST']._serialized_end=1516
|
|
62
|
+
_globals['_TAILLOGSRESPONSE']._serialized_start=1518
|
|
63
|
+
_globals['_TAILLOGSRESPONSE']._serialized_end=1573
|
|
64
|
+
_globals['_GETJOBSTATUSREQUEST']._serialized_start=1575
|
|
65
|
+
_globals['_GETJOBSTATUSREQUEST']._serialized_end=1613
|
|
66
|
+
_globals['_GETJOBSTATUSRESPONSE']._serialized_start=1616
|
|
67
|
+
_globals['_GETJOBSTATUSRESPONSE']._serialized_end=1780
|
|
68
|
+
_globals['_GETJOBSTATUSRESPONSE_JOBSTATUSESENTRY']._serialized_start=1710
|
|
69
|
+
_globals['_GETJOBSTATUSRESPONSE_JOBSTATUSESENTRY']._serialized_end=1780
|
|
70
|
+
_globals['_GETJOBSUBMITTEDTIMESTAMPREQUEST']._serialized_start=1782
|
|
71
|
+
_globals['_GETJOBSUBMITTEDTIMESTAMPREQUEST']._serialized_end=1847
|
|
72
|
+
_globals['_GETJOBSUBMITTEDTIMESTAMPRESPONSE']._serialized_start=1849
|
|
73
|
+
_globals['_GETJOBSUBMITTEDTIMESTAMPRESPONSE']._serialized_end=1902
|
|
74
|
+
_globals['_GETJOBENDEDTIMESTAMPREQUEST']._serialized_start=1904
|
|
75
|
+
_globals['_GETJOBENDEDTIMESTAMPREQUEST']._serialized_end=1965
|
|
76
|
+
_globals['_GETJOBENDEDTIMESTAMPRESPONSE']._serialized_start=1967
|
|
77
|
+
_globals['_GETJOBENDEDTIMESTAMPRESPONSE']._serialized_end=2016
|
|
78
|
+
_globals['_GETLOGDIRSFORJOBSREQUEST']._serialized_start=2018
|
|
79
|
+
_globals['_GETLOGDIRSFORJOBSREQUEST']._serialized_end=2061
|
|
80
|
+
_globals['_GETLOGDIRSFORJOBSRESPONSE']._serialized_start=2064
|
|
81
|
+
_globals['_GETLOGDIRSFORJOBSRESPONSE']._serialized_end=2216
|
|
82
|
+
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._serialized_start=2167
|
|
83
|
+
_globals['_GETLOGDIRSFORJOBSRESPONSE_JOBLOGDIRSENTRY']._serialized_end=2216
|
|
84
|
+
_globals['_JOBSSERVICE']._serialized_start=2491
|
|
85
|
+
_globals['_JOBSSERVICE']._serialized_end=3404
|
|
86
86
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -66,18 +66,20 @@ class QueueJobRequest(_message.Message):
|
|
|
66
66
|
def __init__(self, job_id: _Optional[int] = ..., codegen: _Optional[str] = ..., script_path: _Optional[str] = ..., remote_log_dir: _Optional[str] = ..., managed_job: _Optional[_Union[ManagedJobInfo, _Mapping]] = ...) -> None: ...
|
|
67
67
|
|
|
68
68
|
class ManagedJobInfo(_message.Message):
|
|
69
|
-
__slots__ = ("name", "pool", "workspace", "entrypoint", "tasks")
|
|
69
|
+
__slots__ = ("name", "pool", "workspace", "entrypoint", "tasks", "user_id")
|
|
70
70
|
NAME_FIELD_NUMBER: _ClassVar[int]
|
|
71
71
|
POOL_FIELD_NUMBER: _ClassVar[int]
|
|
72
72
|
WORKSPACE_FIELD_NUMBER: _ClassVar[int]
|
|
73
73
|
ENTRYPOINT_FIELD_NUMBER: _ClassVar[int]
|
|
74
74
|
TASKS_FIELD_NUMBER: _ClassVar[int]
|
|
75
|
+
USER_ID_FIELD_NUMBER: _ClassVar[int]
|
|
75
76
|
name: str
|
|
76
77
|
pool: str
|
|
77
78
|
workspace: str
|
|
78
79
|
entrypoint: str
|
|
79
80
|
tasks: _containers.RepeatedCompositeFieldContainer[ManagedJobTask]
|
|
80
|
-
|
|
81
|
+
user_id: str
|
|
82
|
+
def __init__(self, name: _Optional[str] = ..., pool: _Optional[str] = ..., workspace: _Optional[str] = ..., entrypoint: _Optional[str] = ..., tasks: _Optional[_Iterable[_Union[ManagedJobTask, _Mapping]]] = ..., user_id: _Optional[str] = ...) -> None: ...
|
|
81
83
|
|
|
82
84
|
class ManagedJobTask(_message.Message):
|
|
83
85
|
__slots__ = ("task_id", "name", "resources_str", "metadata_json")
|
sky/serve/server/server.py
CHANGED
|
@@ -98,6 +98,7 @@ async def tail_logs(
|
|
|
98
98
|
request: fastapi.Request, log_body: payloads.ServeLogsBody,
|
|
99
99
|
background_tasks: fastapi.BackgroundTasks
|
|
100
100
|
) -> fastapi.responses.StreamingResponse:
|
|
101
|
+
executor.check_request_thread_executor_available()
|
|
101
102
|
request_task = executor.prepare_request(
|
|
102
103
|
request_id=request.state.request_id,
|
|
103
104
|
request_name='serve.logs',
|
sky/serve/service.py
CHANGED
|
@@ -13,7 +13,6 @@ from typing import Dict
|
|
|
13
13
|
|
|
14
14
|
import filelock
|
|
15
15
|
|
|
16
|
-
from sky import authentication
|
|
17
16
|
from sky import exceptions
|
|
18
17
|
from sky import global_user_state
|
|
19
18
|
from sky import sky_logging
|
|
@@ -28,6 +27,7 @@ from sky.serve import replica_managers
|
|
|
28
27
|
from sky.serve import serve_state
|
|
29
28
|
from sky.serve import serve_utils
|
|
30
29
|
from sky.skylet import constants as skylet_constants
|
|
30
|
+
from sky.utils import auth_utils
|
|
31
31
|
from sky.utils import common_utils
|
|
32
32
|
from sky.utils import controller_utils
|
|
33
33
|
from sky.utils import subprocess_utils
|
|
@@ -227,7 +227,7 @@ def _start(service_name: str, tmp_task_yaml: str, job_id: int, entrypoint: str):
|
|
|
227
227
|
"""
|
|
228
228
|
# Generate ssh key pair to avoid race condition when multiple sky.launch
|
|
229
229
|
# are executed at the same time.
|
|
230
|
-
|
|
230
|
+
auth_utils.get_or_generate_keys()
|
|
231
231
|
|
|
232
232
|
# Initialize database record for the service.
|
|
233
233
|
task = task_lib.Task.from_yaml(tmp_task_yaml)
|