skypilot-nightly 1.0.0.dev20250904__py3-none-any.whl → 1.0.0.dev20250906__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 +46 -0
- sky/backends/cloud_vm_ray_backend.py +11 -0
- sky/catalog/__init__.py +1 -0
- sky/client/sdk.py +20 -16
- sky/clouds/nebius.py +3 -0
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/{mriHUOVL_Ht-CeW-e7saa → ZOaq9s6U49jSoGAMkeKqu}/_buildManifest.js +1 -1
- sky/dashboard/out/_next/static/chunks/6856-6e2bc8a6fd0867af.js +1 -0
- sky/dashboard/out/_next/static/chunks/{8969-4a6f1a928fb6d370.js → 8969-0be3036bf86f8256.js} +1 -1
- sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +6 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/{[job]-39c9bd4cdb7e5a57.js → [job]-1cbba24bd1bd35f8.js} +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-24c4fc6d30ce0193.js → webpack-8df25bce0107f4bd.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/models.py +24 -1
- sky/provision/__init__.py +26 -0
- sky/provision/aws/config.py +30 -12
- sky/provision/kubernetes/__init__.py +2 -0
- sky/provision/kubernetes/volume.py +71 -1
- sky/provision/nebius/instance.py +2 -0
- sky/provision/nebius/utils.py +3 -1
- sky/provision/runpod/volume.py +22 -0
- sky/server/requests/executor.py +3 -0
- sky/server/requests/payloads.py +5 -0
- sky/server/requests/requests.py +15 -14
- sky/templates/nebius-ray.yml.j2 +1 -0
- sky/users/permission.py +6 -0
- sky/users/server.py +8 -2
- sky/utils/db/db_utils.py +3 -0
- sky/utils/schemas.py +7 -1
- sky/volumes/server/core.py +25 -2
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.dist-info}/METADATA +41 -41
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.dist-info}/RECORD +52 -52
- sky/dashboard/out/_next/static/chunks/6856-66e696640347e77b.js +0 -1
- sky/dashboard/out/_next/static/chunks/9037-1c0101b86582136f.js +0 -6
- /sky/dashboard/out/_next/static/{mriHUOVL_Ht-CeW-e7saa → ZOaq9s6U49jSoGAMkeKqu}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250904.dist-info → skypilot_nightly-1.0.0.dev20250906.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-8df25bce0107f4bd.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-0be3036bf86f8256.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-408ed10b2f9fce17.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-6e2bc8a6fd0867af.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-86cabed5d4669ad0.js" defer=""></script><script src="/dashboard/_next/static/chunks/9037-fa1737818d0a0969.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-0b4b35dc1dfe046c.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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-0be3036bf86f8256.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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-0be3036bf86f8256.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_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":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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-0be3036bf86f8256.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-408ed10b2f9fce17.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-86cabed5d4669ad0.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-943efc7aff0f0c06.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-af76bb06dbb3954f.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","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-8df25bce0107f4bd.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-7598c33a746cdc91.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/ZOaq9s6U49jSoGAMkeKqu/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"ZOaq9s6U49jSoGAMkeKqu","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|
sky/models.py
CHANGED
|
@@ -4,7 +4,7 @@ import collections
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
import getpass
|
|
6
6
|
import os
|
|
7
|
-
from typing import Any, Dict, Optional
|
|
7
|
+
from typing import Any, ClassVar, Dict, Optional
|
|
8
8
|
|
|
9
9
|
import pydantic
|
|
10
10
|
|
|
@@ -100,6 +100,11 @@ class KubernetesNodesInfo:
|
|
|
100
100
|
|
|
101
101
|
class VolumeConfig(pydantic.BaseModel):
|
|
102
102
|
"""Configuration for creating a volume."""
|
|
103
|
+
# If any fields changed, increment the version. For backward compatibility,
|
|
104
|
+
# modify the __setstate__ method to handle the old version.
|
|
105
|
+
_VERSION: ClassVar[int] = 1
|
|
106
|
+
|
|
107
|
+
_version: int
|
|
103
108
|
name: str
|
|
104
109
|
type: str
|
|
105
110
|
cloud: str
|
|
@@ -110,3 +115,21 @@ class VolumeConfig(pydantic.BaseModel):
|
|
|
110
115
|
config: Dict[str, Any] = {}
|
|
111
116
|
labels: Optional[Dict[str, str]] = None
|
|
112
117
|
id_on_cloud: Optional[str] = None
|
|
118
|
+
|
|
119
|
+
def __getstate__(self) -> Dict[str, Any]:
|
|
120
|
+
state = super().__getstate__()
|
|
121
|
+
state['_version'] = self._VERSION
|
|
122
|
+
return state
|
|
123
|
+
|
|
124
|
+
def __setstate__(self, state: Dict[str, Any]) -> None:
|
|
125
|
+
"""Set state from pickled state, for backward compatibility."""
|
|
126
|
+
super().__setstate__(state)
|
|
127
|
+
version = state.pop('_version', None)
|
|
128
|
+
if version is None:
|
|
129
|
+
version = -1
|
|
130
|
+
|
|
131
|
+
if version < 0:
|
|
132
|
+
state['id_on_cloud'] = None
|
|
133
|
+
|
|
134
|
+
state['_version'] = self._VERSION
|
|
135
|
+
self.__dict__.update(state)
|
sky/provision/__init__.py
CHANGED
|
@@ -139,6 +139,32 @@ def get_volume_usedby(
|
|
|
139
139
|
raise NotImplementedError
|
|
140
140
|
|
|
141
141
|
|
|
142
|
+
@_route_to_cloud_impl
|
|
143
|
+
def get_all_volumes_usedby(
|
|
144
|
+
provider_name: str, configs: List[models.VolumeConfig]
|
|
145
|
+
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
146
|
+
"""Get the usedby of a volume.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
usedby_pods: List of dictionaries, each containing the config keys for
|
|
150
|
+
a volume and a key containing pods using the volume.
|
|
151
|
+
These may include pods not created by SkyPilot.
|
|
152
|
+
usedby_clusters: List of dictionaries, each containing the config keys
|
|
153
|
+
for a volume and a key containing clusters using
|
|
154
|
+
the volume.
|
|
155
|
+
"""
|
|
156
|
+
raise NotImplementedError
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@_route_to_cloud_impl
|
|
160
|
+
def map_all_volumes_usedby(
|
|
161
|
+
provider_name: str, used_by_pods: Dict[str, Any],
|
|
162
|
+
used_by_clusters: Dict[str, Any],
|
|
163
|
+
config: models.VolumeConfig) -> Tuple[List[str], List[str]]:
|
|
164
|
+
"""Map the usedby resources of a volume."""
|
|
165
|
+
raise NotImplementedError
|
|
166
|
+
|
|
167
|
+
|
|
142
168
|
@_route_to_cloud_impl
|
|
143
169
|
def run_instances(provider_name: str, region: str, cluster_name_on_cloud: str,
|
|
144
170
|
config: common.ProvisionConfig) -> common.ProvisionRecord:
|
sky/provision/aws/config.py
CHANGED
|
@@ -406,10 +406,26 @@ def _usable_subnets(
|
|
|
406
406
|
s for s in candidate_subnets if s.vpc_id == vpc_id_of_sg
|
|
407
407
|
]
|
|
408
408
|
|
|
409
|
+
if not candidate_subnets:
|
|
410
|
+
_skypilot_log_error_and_exit_for_failover(
|
|
411
|
+
'No candidate subnets found in specified VPC '
|
|
412
|
+
f'{vpc_id_of_sg}.')
|
|
413
|
+
|
|
409
414
|
available_subnets = [
|
|
410
415
|
s for s in candidate_subnets if s.state == 'available'
|
|
411
416
|
]
|
|
412
417
|
|
|
418
|
+
if not available_subnets:
|
|
419
|
+
_skypilot_log_error_and_exit_for_failover(
|
|
420
|
+
'All candidate subnets are pending in specified VPC '
|
|
421
|
+
f'{vpc_id_of_sg}.')
|
|
422
|
+
|
|
423
|
+
if len(candidate_subnets) > len(available_subnets):
|
|
424
|
+
num_pruned = len(candidate_subnets) - len(available_subnets)
|
|
425
|
+
logger.debug(
|
|
426
|
+
f'{num_pruned} candidate subnets pruned since they are not '
|
|
427
|
+
'available.')
|
|
428
|
+
|
|
413
429
|
if use_internal_ips:
|
|
414
430
|
# Get private subnets.
|
|
415
431
|
#
|
|
@@ -421,6 +437,10 @@ def _usable_subnets(
|
|
|
421
437
|
if not _is_subnet_public(ec2, s.subnet_id, vpc_id_of_sg) and
|
|
422
438
|
not s.map_public_ip_on_launch
|
|
423
439
|
]
|
|
440
|
+
if not subnets:
|
|
441
|
+
_skypilot_log_error_and_exit_for_failover(
|
|
442
|
+
'The use_internal_ips option is set to True, but all '
|
|
443
|
+
'candidate subnets are public.')
|
|
424
444
|
else:
|
|
425
445
|
# Get public subnets.
|
|
426
446
|
#
|
|
@@ -436,6 +456,10 @@ def _usable_subnets(
|
|
|
436
456
|
s for s in available_subnets
|
|
437
457
|
if _is_subnet_public(ec2, s.subnet_id, vpc_id_of_sg)
|
|
438
458
|
]
|
|
459
|
+
if not subnets:
|
|
460
|
+
_skypilot_log_error_and_exit_for_failover(
|
|
461
|
+
'All candidate subnets are private, did you mean to '
|
|
462
|
+
'set use_internal_ips to True?')
|
|
439
463
|
|
|
440
464
|
subnets = sorted(
|
|
441
465
|
subnets,
|
|
@@ -449,18 +473,7 @@ def _usable_subnets(
|
|
|
449
473
|
'Failed to fetch available subnets from AWS.')
|
|
450
474
|
raise exc
|
|
451
475
|
|
|
452
|
-
if
|
|
453
|
-
vpc_msg = (f'Does a default VPC exist in region '
|
|
454
|
-
f'{ec2.meta.client.meta.region_name}? ') if (
|
|
455
|
-
vpc_id_of_sg is None) else ''
|
|
456
|
-
_skypilot_log_error_and_exit_for_failover(
|
|
457
|
-
f'No usable subnets found. {vpc_msg}'
|
|
458
|
-
'Try manually creating an instance in your specified region to '
|
|
459
|
-
'populate the list of subnets and try again. '
|
|
460
|
-
'Note that the subnet must map public IPs '
|
|
461
|
-
'on instance launch unless you set `use_internal_ips: true` in '
|
|
462
|
-
'the `provider` config.')
|
|
463
|
-
elif _are_user_subnets_pruned(subnets):
|
|
476
|
+
if _are_user_subnets_pruned(subnets):
|
|
464
477
|
_skypilot_log_error_and_exit_for_failover(
|
|
465
478
|
f'The specified subnets are not '
|
|
466
479
|
f'usable: {_get_pruned_subnets(subnets)}')
|
|
@@ -579,6 +592,11 @@ def _get_subnet_and_vpc_id(ec2: 'mypy_boto3_ec2.ServiceResource',
|
|
|
579
592
|
# not want SkyPilot to use.
|
|
580
593
|
if vpc_id_of_sg is None:
|
|
581
594
|
all_subnets = [s for s in all_subnets if s.vpc.is_default]
|
|
595
|
+
if not all_subnets:
|
|
596
|
+
_skypilot_log_error_and_exit_for_failover(
|
|
597
|
+
f'The default VPC in {region} either does not exist or '
|
|
598
|
+
'has no subnets.')
|
|
599
|
+
|
|
582
600
|
subnets, vpc_id = _usable_subnets(
|
|
583
601
|
ec2,
|
|
584
602
|
user_specified_subnets=None,
|
|
@@ -13,4 +13,6 @@ from sky.provision.kubernetes.network import open_ports
|
|
|
13
13
|
from sky.provision.kubernetes.network import query_ports
|
|
14
14
|
from sky.provision.kubernetes.volume import apply_volume
|
|
15
15
|
from sky.provision.kubernetes.volume import delete_volume
|
|
16
|
+
from sky.provision.kubernetes.volume import get_all_volumes_usedby
|
|
16
17
|
from sky.provision.kubernetes.volume import get_volume_usedby
|
|
18
|
+
from sky.provision.kubernetes.volume import map_all_volumes_usedby
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""Kubernetes pvc provisioning."""
|
|
2
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
2
|
+
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
3
3
|
|
|
4
4
|
from sky import global_user_state
|
|
5
5
|
from sky import models
|
|
@@ -160,6 +160,76 @@ def get_volume_usedby(
|
|
|
160
160
|
return _get_volume_usedby(context, namespace, pvc_name)
|
|
161
161
|
|
|
162
162
|
|
|
163
|
+
def get_all_volumes_usedby(
|
|
164
|
+
configs: List[models.VolumeConfig],
|
|
165
|
+
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
166
|
+
"""Gets the usedby resources of all volumes."""
|
|
167
|
+
field_selector = ','.join([
|
|
168
|
+
f'status.phase!={phase}'
|
|
169
|
+
for phase in k8s_constants.PVC_NOT_HOLD_POD_PHASES
|
|
170
|
+
])
|
|
171
|
+
label_selector = 'parent=skypilot'
|
|
172
|
+
context_to_namespaces: Dict[str, Set[str]] = {}
|
|
173
|
+
pvc_names = set()
|
|
174
|
+
for config in configs:
|
|
175
|
+
context, namespace = _get_context_namespace(config)
|
|
176
|
+
if context not in context_to_namespaces:
|
|
177
|
+
context_to_namespaces[context] = set()
|
|
178
|
+
context_to_namespaces[context].add(namespace)
|
|
179
|
+
pvc_names.add(config.name_on_cloud)
|
|
180
|
+
cloud_to_name_map = _get_cluster_name_on_cloud_to_cluster_name_map()
|
|
181
|
+
# Get all pods in the namespace
|
|
182
|
+
used_by_pods: Dict[str, Dict[str, Dict[str, List[str]]]] = {}
|
|
183
|
+
used_by_clusters: Dict[str, Dict[str, Dict[str, List[str]]]] = {}
|
|
184
|
+
for context, namespaces in context_to_namespaces.items():
|
|
185
|
+
used_by_pods[context] = {}
|
|
186
|
+
used_by_clusters[context] = {}
|
|
187
|
+
for namespace in namespaces:
|
|
188
|
+
used_by_pods[context][namespace] = {}
|
|
189
|
+
used_by_clusters[context][namespace] = {}
|
|
190
|
+
pods = kubernetes.core_api(context).list_namespaced_pod(
|
|
191
|
+
namespace=namespace,
|
|
192
|
+
field_selector=field_selector,
|
|
193
|
+
label_selector=label_selector)
|
|
194
|
+
for pod in pods.items:
|
|
195
|
+
if pod.spec.volumes is None:
|
|
196
|
+
continue
|
|
197
|
+
for volume in pod.spec.volumes:
|
|
198
|
+
if volume.persistent_volume_claim is None:
|
|
199
|
+
continue
|
|
200
|
+
volume_name = volume.persistent_volume_claim.claim_name
|
|
201
|
+
if volume_name not in pvc_names:
|
|
202
|
+
continue
|
|
203
|
+
if volume_name not in used_by_pods[context][namespace]:
|
|
204
|
+
used_by_pods[context][namespace][volume_name] = []
|
|
205
|
+
used_by_pods[context][namespace][volume_name].append(
|
|
206
|
+
pod.metadata.name)
|
|
207
|
+
cluster_name_on_cloud = pod.metadata.labels.get(
|
|
208
|
+
k8s_constants.TAG_SKYPILOT_CLUSTER_NAME)
|
|
209
|
+
if cluster_name_on_cloud is None:
|
|
210
|
+
continue
|
|
211
|
+
cluster_name = cloud_to_name_map.get(cluster_name_on_cloud)
|
|
212
|
+
if cluster_name is None:
|
|
213
|
+
continue
|
|
214
|
+
if cluster_name not in used_by_clusters[context][namespace]:
|
|
215
|
+
used_by_clusters[context][namespace][cluster_name] = []
|
|
216
|
+
used_by_clusters[context][namespace][cluster_name].append(
|
|
217
|
+
cluster_name)
|
|
218
|
+
return used_by_pods, used_by_clusters
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def map_all_volumes_usedby(
|
|
222
|
+
used_by_pods: Dict[str, Any], used_by_clusters: Dict[str, Any],
|
|
223
|
+
config: models.VolumeConfig) -> Tuple[List[str], List[str]]:
|
|
224
|
+
"""Maps the usedby resources of a volume."""
|
|
225
|
+
context, namespace = _get_context_namespace(config)
|
|
226
|
+
pvc_name = config.name_on_cloud
|
|
227
|
+
|
|
228
|
+
return (used_by_pods.get(context, {}).get(namespace, {}).get(pvc_name, []),
|
|
229
|
+
used_by_clusters.get(context, {}).get(namespace,
|
|
230
|
+
{}).get(pvc_name, []))
|
|
231
|
+
|
|
232
|
+
|
|
163
233
|
def create_persistent_volume_claim(namespace: str, context: Optional[str],
|
|
164
234
|
pvc_spec: Dict[str, Any]) -> None:
|
|
165
235
|
"""Creates a persistent volume claim for SkyServe controller."""
|
sky/provision/nebius/instance.py
CHANGED
|
@@ -137,6 +137,8 @@ def run_instances(region: str, cluster_name_on_cloud: str,
|
|
|
137
137
|
use_spot=config.node_config['use_spot'],
|
|
138
138
|
associate_public_ip_address=(
|
|
139
139
|
not config.provider_config['use_internal_ips']),
|
|
140
|
+
use_static_ip_address=config.provider_config.get(
|
|
141
|
+
'use_static_ip_address', False),
|
|
140
142
|
filesystems=config.node_config.get('filesystems', []),
|
|
141
143
|
network_tier=config.node_config.get('network_tier'))
|
|
142
144
|
except Exception as e: # pylint: disable=broad-except
|
sky/provision/nebius/utils.py
CHANGED
|
@@ -188,6 +188,7 @@ def launch(cluster_name_on_cloud: str,
|
|
|
188
188
|
user_data: str,
|
|
189
189
|
associate_public_ip_address: bool,
|
|
190
190
|
filesystems: List[Dict[str, Any]],
|
|
191
|
+
use_static_ip_address: bool = False,
|
|
191
192
|
use_spot: bool = False,
|
|
192
193
|
network_tier: Optional[resources_utils.NetworkTier] = None) -> str:
|
|
193
194
|
# Each node must have a unique name to avoid conflicts between
|
|
@@ -303,7 +304,8 @@ def launch(cluster_name_on_cloud: str,
|
|
|
303
304
|
subnet_id=sub_net.items[0].metadata.id,
|
|
304
305
|
ip_address=nebius.compute().IPAddress(),
|
|
305
306
|
name='network-interface-0',
|
|
306
|
-
public_ip_address=nebius.compute().PublicIPAddress(
|
|
307
|
+
public_ip_address=nebius.compute().PublicIPAddress(
|
|
308
|
+
static=use_static_ip_address)
|
|
307
309
|
if associate_public_ip_address else None,
|
|
308
310
|
)
|
|
309
311
|
],
|
sky/provision/runpod/volume.py
CHANGED
|
@@ -156,3 +156,25 @@ def get_volume_usedby(
|
|
|
156
156
|
cluster_names.append(matched)
|
|
157
157
|
|
|
158
158
|
return usedby_pod_names, cluster_names
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def get_all_volumes_usedby(
|
|
162
|
+
configs: List[models.VolumeConfig],
|
|
163
|
+
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
|
164
|
+
"""Gets the usedby resources of all volumes."""
|
|
165
|
+
used_by_results = [get_volume_usedby(config) for config in configs]
|
|
166
|
+
used_by_pods, used_by_clusters = {}, {}
|
|
167
|
+
for i in range(len(configs)):
|
|
168
|
+
config = configs[i]
|
|
169
|
+
used_by_pods[config.name_on_cloud] = used_by_results[i][0]
|
|
170
|
+
used_by_clusters[config.name_on_cloud] = used_by_results[i][1]
|
|
171
|
+
return used_by_pods, used_by_clusters
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def map_all_volumes_usedby(
|
|
175
|
+
used_by_pods: Dict[str, Any], used_by_clusters: Dict[str, Any],
|
|
176
|
+
config: models.VolumeConfig) -> Tuple[List[str], List[str]]:
|
|
177
|
+
"""Maps the usedby resources of a volume."""
|
|
178
|
+
return (used_by_pods.get(config.name_on_cloud,
|
|
179
|
+
[]), used_by_clusters.get(config.name_on_cloud,
|
|
180
|
+
[]))
|
sky/server/requests/executor.py
CHANGED
|
@@ -285,6 +285,9 @@ def override_request_env_and_config(
|
|
|
285
285
|
# affecting client requests. If set on the client side, it will be
|
|
286
286
|
# overridden by the request body.
|
|
287
287
|
os.environ.pop('SKYPILOT_DEBUG', None)
|
|
288
|
+
# Remove the db connection uri from client supplied env vars, as the
|
|
289
|
+
# client should not set the db string on server side.
|
|
290
|
+
request_body.env_vars.pop(constants.ENV_VAR_DB_CONNECTION_URI, None)
|
|
288
291
|
os.environ.update(request_body.env_vars)
|
|
289
292
|
# Note: may be overridden by AuthProxyMiddleware.
|
|
290
293
|
# TODO(zhwu): we need to make the entire request a context available to the
|
sky/server/requests/payloads.py
CHANGED
|
@@ -86,6 +86,11 @@ def request_body_env_vars() -> dict:
|
|
|
86
86
|
env_vars.pop(skypilot_config.ENV_VAR_SKYPILOT_CONFIG, None)
|
|
87
87
|
env_vars.pop(skypilot_config.ENV_VAR_GLOBAL_CONFIG, None)
|
|
88
88
|
env_vars.pop(skypilot_config.ENV_VAR_PROJECT_CONFIG, None)
|
|
89
|
+
# Remove the config related env vars, as the client config override
|
|
90
|
+
# should be passed in the request body.
|
|
91
|
+
# Any new environment variables that are server-specific should
|
|
92
|
+
# use SKYPILOT_SERVER_ENV_VAR_PREFIX.
|
|
93
|
+
env_vars.pop(constants.ENV_VAR_DB_CONNECTION_URI, None)
|
|
89
94
|
return env_vars
|
|
90
95
|
|
|
91
96
|
|