skypilot-nightly 1.0.0.dev20250926__py3-none-any.whl → 1.0.0.dev20251001__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of skypilot-nightly might be problematic. Click here for more details.
- sky/__init__.py +2 -2
- sky/backends/backend_utils.py +43 -14
- sky/backends/cloud_vm_ray_backend.py +153 -38
- sky/check.py +0 -29
- sky/client/cli/command.py +48 -26
- sky/client/cli/table_utils.py +91 -0
- sky/client/sdk.py +14 -23
- sky/client/sdk_async.py +5 -5
- sky/core.py +18 -20
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/{3294.03e02ae73455f48e.js → 3294.93d9336bdc032b3a.js} +1 -1
- sky/dashboard/out/_next/static/chunks/6856-5fdc9b851a18acdb.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-07349868f7905d37.js → [pool]-509b2977a6373bf6.js} +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-8e64d11e58eab5cb.js → webpack-4f0c389a4ce5fd9c.js} +1 -1
- sky/dashboard/out/_next/static/{VXU6_xE28M55BOdwmUUJS → 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/execution.py +0 -1
- sky/global_user_state.py +3 -3
- sky/jobs/client/sdk.py +3 -2
- sky/jobs/controller.py +15 -0
- sky/jobs/server/core.py +120 -28
- sky/jobs/server/server.py +1 -1
- sky/jobs/server/utils.py +65 -32
- sky/jobs/state.py +145 -3
- sky/jobs/utils.py +87 -8
- sky/provision/kubernetes/instance.py +1 -1
- sky/schemas/api/responses.py +73 -0
- sky/schemas/generated/managed_jobsv1_pb2.py +70 -0
- sky/schemas/generated/managed_jobsv1_pb2.pyi +262 -0
- sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
- sky/serve/serve_utils.py +16 -0
- sky/serve/server/core.py +1 -1
- sky/serve/server/impl.py +6 -6
- sky/server/common.py +2 -1
- sky/server/requests/serializers/decoders.py +10 -6
- sky/server/requests/serializers/encoders.py +13 -8
- sky/skylet/constants.py +1 -1
- sky/skylet/job_lib.py +2 -32
- sky/skylet/log_lib.py +211 -0
- sky/skylet/log_lib.pyi +30 -1
- sky/skylet/services.py +208 -2
- sky/skylet/skylet.py +3 -0
- 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.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/METADATA +35 -35
- {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/RECORD +70 -66
- sky/dashboard/out/_next/static/chunks/6856-2b3600ff2854d066.js +0 -1
- /sky/dashboard/out/_next/static/{VXU6_xE28M55BOdwmUUJS → m3YT2i5s6v4SsIdYc8WZa}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250926.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/top_level.txt +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-
|
|
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/execution.py
CHANGED
|
@@ -673,7 +673,6 @@ def launch(
|
|
|
673
673
|
# see the setup logs when inspecting the launch process to know
|
|
674
674
|
# excatly what the job is waiting for.
|
|
675
675
|
detach_setup = controller_utils.Controllers.from_name(cluster_name) is None
|
|
676
|
-
|
|
677
676
|
return _execute(
|
|
678
677
|
entrypoint=entrypoint,
|
|
679
678
|
dryrun=dryrun,
|
sky/global_user_state.py
CHANGED
|
@@ -483,7 +483,7 @@ def get_user(user_id: str) -> Optional[models.User]:
|
|
|
483
483
|
|
|
484
484
|
@_init_db
|
|
485
485
|
@metrics_lib.time_me
|
|
486
|
-
def
|
|
486
|
+
def get_users(user_ids: Set[str]) -> Dict[str, models.User]:
|
|
487
487
|
assert _SQLALCHEMY_ENGINE is not None
|
|
488
488
|
with orm.Session(_SQLALCHEMY_ENGINE) as session:
|
|
489
489
|
rows = session.query(user_table).filter(
|
|
@@ -1659,7 +1659,7 @@ def get_clusters(
|
|
|
1659
1659
|
|
|
1660
1660
|
# get all users needed for the rows at once
|
|
1661
1661
|
user_hashes = set(row_to_user_hash.values())
|
|
1662
|
-
user_hash_to_user =
|
|
1662
|
+
user_hash_to_user = get_users(user_hashes)
|
|
1663
1663
|
|
|
1664
1664
|
# get last cluster event for each row
|
|
1665
1665
|
cluster_hashes = set(row_to_user_hash.keys())
|
|
@@ -1807,7 +1807,7 @@ def get_clusters_from_history(
|
|
|
1807
1807
|
row_to_user_hash[row.cluster_hash] = user_hash
|
|
1808
1808
|
|
|
1809
1809
|
user_hashes = set(row_to_user_hash.values())
|
|
1810
|
-
user_hash_to_user =
|
|
1810
|
+
user_hash_to_user = get_users(user_hashes)
|
|
1811
1811
|
cluster_hashes = set(row_to_user_hash.keys())
|
|
1812
1812
|
if not abbreviate_response:
|
|
1813
1813
|
last_cluster_event_dict = _get_last_cluster_event_multiple(
|
sky/jobs/client/sdk.py
CHANGED
|
@@ -9,6 +9,7 @@ from sky import sky_logging
|
|
|
9
9
|
from sky.adaptors import common as adaptors_common
|
|
10
10
|
from sky.client import common as client_common
|
|
11
11
|
from sky.client import sdk
|
|
12
|
+
from sky.schemas.api import responses
|
|
12
13
|
from sky.serve.client import impl
|
|
13
14
|
from sky.server import common as server_common
|
|
14
15
|
from sky.server import rest
|
|
@@ -130,7 +131,7 @@ def queue(
|
|
|
130
131
|
skip_finished: bool = False,
|
|
131
132
|
all_users: bool = False,
|
|
132
133
|
job_ids: Optional[List[int]] = None
|
|
133
|
-
) -> server_common.RequestId[List[
|
|
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
|
@@ -19,13 +19,16 @@ from sky import provision as provision_lib
|
|
|
19
19
|
from sky import sky_logging
|
|
20
20
|
from sky import skypilot_config
|
|
21
21
|
from sky import task as task_lib
|
|
22
|
+
from sky.adaptors import common as adaptors_common
|
|
22
23
|
from sky.backends import backend_utils
|
|
24
|
+
from sky.backends import cloud_vm_ray_backend
|
|
23
25
|
from sky.catalog import common as service_catalog_common
|
|
24
26
|
from sky.data import storage as storage_lib
|
|
25
27
|
from sky.jobs import constants as managed_job_constants
|
|
26
28
|
from sky.jobs import state as managed_job_state
|
|
27
29
|
from sky.jobs import utils as managed_job_utils
|
|
28
30
|
from sky.provision import common as provision_common
|
|
31
|
+
from sky.schemas.api import responses
|
|
29
32
|
from sky.serve import serve_state
|
|
30
33
|
from sky.serve import serve_utils
|
|
31
34
|
from sky.serve.server import impl
|
|
@@ -44,8 +47,15 @@ from sky.utils import ux_utils
|
|
|
44
47
|
from sky.workspaces import core as workspaces_core
|
|
45
48
|
|
|
46
49
|
if typing.TYPE_CHECKING:
|
|
50
|
+
from google.protobuf import json_format
|
|
51
|
+
|
|
47
52
|
import sky
|
|
48
|
-
from sky.
|
|
53
|
+
from sky.schemas.generated import managed_jobsv1_pb2
|
|
54
|
+
else:
|
|
55
|
+
json_format = adaptors_common.LazyImport('google.protobuf.json_format')
|
|
56
|
+
|
|
57
|
+
managed_jobsv1_pb2 = adaptors_common.LazyImport(
|
|
58
|
+
'sky.schemas.generated.managed_jobsv1_pb2')
|
|
49
59
|
|
|
50
60
|
logger = sky_logging.init_logger(__name__)
|
|
51
61
|
|
|
@@ -287,8 +297,7 @@ def launch(
|
|
|
287
297
|
# TODO: do something with returned status?
|
|
288
298
|
_, _ = backend_utils.refresh_cluster_status_handle(
|
|
289
299
|
cluster_name=cluster_name,
|
|
290
|
-
force_refresh_statuses=set(status_lib.ClusterStatus)
|
|
291
|
-
acquire_per_cluster_status_lock=False)
|
|
300
|
+
force_refresh_statuses=set(status_lib.ClusterStatus))
|
|
292
301
|
except (exceptions.ClusterOwnerIdentityMismatchError,
|
|
293
302
|
exceptions.CloudUserIdentityError,
|
|
294
303
|
exceptions.ClusterStatusFetchingError) as e:
|
|
@@ -635,6 +644,28 @@ def queue(refresh: bool,
|
|
|
635
644
|
|
|
636
645
|
|
|
637
646
|
@usage_lib.entrypoint
|
|
647
|
+
def queue_v2_api(
|
|
648
|
+
refresh: bool,
|
|
649
|
+
skip_finished: bool = False,
|
|
650
|
+
all_users: bool = False,
|
|
651
|
+
job_ids: Optional[List[int]] = None,
|
|
652
|
+
user_match: Optional[str] = None,
|
|
653
|
+
workspace_match: Optional[str] = None,
|
|
654
|
+
name_match: Optional[str] = None,
|
|
655
|
+
pool_match: Optional[str] = None,
|
|
656
|
+
page: Optional[int] = None,
|
|
657
|
+
limit: Optional[int] = None,
|
|
658
|
+
statuses: Optional[List[str]] = None,
|
|
659
|
+
) -> Tuple[List[responses.ManagedJobRecord], int, Dict[str, int], int]:
|
|
660
|
+
"""Gets statuses of managed jobs and parse the
|
|
661
|
+
jobs to responses.ManagedJobRecord."""
|
|
662
|
+
jobs, total, status_counts, total_no_filter = queue_v2(
|
|
663
|
+
refresh, skip_finished, all_users, job_ids, user_match, workspace_match,
|
|
664
|
+
name_match, pool_match, page, limit, statuses)
|
|
665
|
+
return [responses.ManagedJobRecord(**job) for job in jobs
|
|
666
|
+
], total, status_counts, total_no_filter
|
|
667
|
+
|
|
668
|
+
|
|
638
669
|
def queue_v2(
|
|
639
670
|
refresh: bool,
|
|
640
671
|
skip_finished: bool = False,
|
|
@@ -701,11 +732,13 @@ def queue_v2(
|
|
|
701
732
|
assert isinstance(backend, backends.CloudVmRayBackend)
|
|
702
733
|
|
|
703
734
|
user_hashes: Optional[List[Optional[str]]] = None
|
|
735
|
+
show_jobs_without_user_hash = False
|
|
704
736
|
if not all_users:
|
|
705
737
|
user_hashes = [common_utils.get_user_hash()]
|
|
706
738
|
# For backwards compatibility, we show jobs that do not have a
|
|
707
739
|
# user_hash. TODO(cooperc): Remove before 0.12.0.
|
|
708
740
|
user_hashes.append(None)
|
|
741
|
+
show_jobs_without_user_hash = True
|
|
709
742
|
elif user_match is not None:
|
|
710
743
|
users = global_user_state.get_user_by_name_match(user_match)
|
|
711
744
|
if not users:
|
|
@@ -713,6 +746,38 @@ def queue_v2(
|
|
|
713
746
|
user_hashes = [user.id for user in users]
|
|
714
747
|
|
|
715
748
|
accessible_workspaces = list(workspaces_core.get_workspaces().keys())
|
|
749
|
+
|
|
750
|
+
if handle.is_grpc_enabled_with_flag:
|
|
751
|
+
try:
|
|
752
|
+
request = managed_jobsv1_pb2.GetJobTableRequest(
|
|
753
|
+
skip_finished=skip_finished,
|
|
754
|
+
accessible_workspaces=accessible_workspaces,
|
|
755
|
+
job_ids=managed_jobsv1_pb2.JobIds(
|
|
756
|
+
ids=job_ids) if job_ids is not None else None,
|
|
757
|
+
workspace_match=workspace_match,
|
|
758
|
+
name_match=name_match,
|
|
759
|
+
pool_match=pool_match,
|
|
760
|
+
page=page,
|
|
761
|
+
limit=limit,
|
|
762
|
+
# Remove None from user_hashes, as the gRPC server uses the
|
|
763
|
+
# show_jobs_without_user_hash flag instead.
|
|
764
|
+
user_hashes=managed_jobsv1_pb2.UserHashes(hashes=[
|
|
765
|
+
user_hash for user_hash in user_hashes
|
|
766
|
+
if user_hash is not None
|
|
767
|
+
]) if user_hashes is not None else None,
|
|
768
|
+
statuses=managed_jobsv1_pb2.Statuses(
|
|
769
|
+
statuses=statuses) if statuses is not None else None,
|
|
770
|
+
show_jobs_without_user_hash=show_jobs_without_user_hash,
|
|
771
|
+
)
|
|
772
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
773
|
+
lambda: cloud_vm_ray_backend.SkyletClient(
|
|
774
|
+
handle.get_grpc_channel()).get_managed_job_table(request))
|
|
775
|
+
jobs = managed_job_utils.decode_managed_job_protos(response.jobs)
|
|
776
|
+
return jobs, response.total, dict(
|
|
777
|
+
response.status_counts), response.total_no_filter
|
|
778
|
+
except exceptions.SkyletMethodNotImplementedError:
|
|
779
|
+
pass
|
|
780
|
+
|
|
716
781
|
code = managed_job_utils.ManagedJobCodeGen.get_job_table(
|
|
717
782
|
skip_finished, accessible_workspaces, job_ids, workspace_match,
|
|
718
783
|
name_match, pool_match, page, limit, user_hashes, statuses)
|
|
@@ -819,33 +884,60 @@ def cancel(name: Optional[str] = None,
|
|
|
819
884
|
'Can only specify one of JOB_IDS, name, pool, or all/'
|
|
820
885
|
f'all_users. Provided {" ".join(arguments)!r}.')
|
|
821
886
|
|
|
887
|
+
job_ids = None if (all_users or all) else job_ids
|
|
888
|
+
|
|
822
889
|
backend = backend_utils.get_backend_from_handle(handle)
|
|
823
890
|
assert isinstance(backend, backends.CloudVmRayBackend)
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
891
|
+
|
|
892
|
+
use_legacy = not handle.is_grpc_enabled_with_flag
|
|
893
|
+
|
|
894
|
+
if not use_legacy:
|
|
895
|
+
current_workspace = skypilot_config.get_active_workspace()
|
|
896
|
+
try:
|
|
897
|
+
request = managed_jobsv1_pb2.CancelJobsRequest(
|
|
898
|
+
current_workspace=current_workspace)
|
|
899
|
+
|
|
900
|
+
if all_users or all or job_ids:
|
|
901
|
+
request.all_users = all_users
|
|
902
|
+
if all:
|
|
903
|
+
request.user_hash = common_utils.get_user_hash()
|
|
904
|
+
if job_ids is not None:
|
|
905
|
+
request.job_ids.CopyFrom(
|
|
906
|
+
managed_jobsv1_pb2.JobIds(ids=job_ids))
|
|
907
|
+
elif name is not None:
|
|
908
|
+
request.job_name = name
|
|
909
|
+
else:
|
|
910
|
+
assert pool is not None, (job_ids, name, pool, all)
|
|
911
|
+
request.pool_name = pool
|
|
912
|
+
|
|
913
|
+
response = backend_utils.invoke_skylet_with_retries(
|
|
914
|
+
lambda: cloud_vm_ray_backend.SkyletClient(
|
|
915
|
+
handle.get_grpc_channel()).cancel_managed_jobs(request))
|
|
916
|
+
stdout = response.message
|
|
917
|
+
except exceptions.SkyletMethodNotImplementedError:
|
|
918
|
+
use_legacy = True
|
|
919
|
+
|
|
920
|
+
if use_legacy:
|
|
921
|
+
if all_users or all or job_ids:
|
|
922
|
+
code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_id(
|
|
923
|
+
job_ids, all_users=all_users)
|
|
924
|
+
elif name is not None:
|
|
925
|
+
code = managed_job_utils.ManagedJobCodeGen.cancel_job_by_name(
|
|
926
|
+
name)
|
|
927
|
+
else:
|
|
928
|
+
assert pool is not None, (job_ids, name, pool, all)
|
|
929
|
+
code = managed_job_utils.ManagedJobCodeGen.cancel_jobs_by_pool(
|
|
930
|
+
pool)
|
|
931
|
+
# The stderr is redirected to stdout
|
|
932
|
+
returncode, stdout, stderr = backend.run_on_head(
|
|
933
|
+
handle, code, require_outputs=True, stream_logs=False)
|
|
934
|
+
try:
|
|
935
|
+
subprocess_utils.handle_returncode(
|
|
936
|
+
returncode, code, 'Failed to cancel managed job',
|
|
937
|
+
stdout + stderr)
|
|
938
|
+
except exceptions.CommandError as e:
|
|
939
|
+
with ux_utils.print_exception_no_traceback():
|
|
940
|
+
raise RuntimeError(e.error_msg) from e
|
|
849
941
|
|
|
850
942
|
logger.info(stdout)
|
|
851
943
|
if 'Multiple jobs found with name' in stdout:
|
sky/jobs/server/server.py
CHANGED
|
@@ -68,7 +68,7 @@ async def queue_v2(request: fastapi.Request,
|
|
|
68
68
|
request_id=request.state.request_id,
|
|
69
69
|
request_name='jobs.queue_v2',
|
|
70
70
|
request_body=jobs_queue_body_v2,
|
|
71
|
-
func=core.
|
|
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),
|