skypilot-nightly 1.0.0.dev20250708__py3-none-any.whl → 1.0.0.dev20250709__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.
Files changed (35) hide show
  1. sky/__init__.py +2 -2
  2. sky/clouds/kubernetes.py +2 -2
  3. sky/dashboard/out/404.html +1 -1
  4. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  5. sky/dashboard/out/clusters/[cluster].html +1 -1
  6. sky/dashboard/out/clusters.html +1 -1
  7. sky/dashboard/out/config.html +1 -1
  8. sky/dashboard/out/index.html +1 -1
  9. sky/dashboard/out/infra/[context].html +1 -1
  10. sky/dashboard/out/infra.html +1 -1
  11. sky/dashboard/out/jobs/[job].html +1 -1
  12. sky/dashboard/out/jobs.html +1 -1
  13. sky/dashboard/out/users.html +1 -1
  14. sky/dashboard/out/volumes.html +1 -1
  15. sky/dashboard/out/workspace/new.html +1 -1
  16. sky/dashboard/out/workspaces/[name].html +1 -1
  17. sky/dashboard/out/workspaces.html +1 -1
  18. sky/global_user_state.py +6 -3
  19. sky/jobs/state.py +6 -3
  20. sky/provision/kubernetes/utils.py +3 -0
  21. sky/server/metrics.py +2 -3
  22. sky/server/requests/executor.py +2 -5
  23. sky/server/requests/payloads.py +1 -0
  24. sky/server/requests/requests.py +94 -4
  25. sky/server/server.py +19 -5
  26. sky/server/uvicorn.py +4 -1
  27. sky/utils/schemas.py +3 -0
  28. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/METADATA +1 -1
  29. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/RECORD +35 -35
  30. /sky/dashboard/out/_next/static/{O3wBEOmvYEVEqZxAP7Czn → EqELoF4IXcALfWVihInou}/_buildManifest.js +0 -0
  31. /sky/dashboard/out/_next/static/{O3wBEOmvYEVEqZxAP7Czn → EqELoF4IXcALfWVihInou}/_ssgManifest.js +0 -0
  32. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/WHEEL +0 -0
  33. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/entry_points.txt +0 -0
  34. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/licenses/LICENSE +0 -0
  35. {skypilot_nightly-1.0.0.dev20250708.dist-info → skypilot_nightly-1.0.0.dev20250709.dist-info}/top_level.txt +0 -0
sky/__init__.py CHANGED
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = '81af2fc744e51537d1509ba2f10749593bdb3a3b'
8
+ _SKYPILOT_COMMIT_SHA = '049a61037fec870c541621cb37b03783e046d44b'
9
9
 
10
10
 
11
11
  def _get_git_commit():
@@ -35,7 +35,7 @@ def _get_git_commit():
35
35
 
36
36
 
37
37
  __commit__ = _get_git_commit()
38
- __version__ = '1.0.0.dev20250708'
38
+ __version__ = '1.0.0.dev20250709'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
sky/clouds/kubernetes.py CHANGED
@@ -435,9 +435,9 @@ class Kubernetes(clouds.Cloud):
435
435
  max_timeout = 60 # Cap at 1 minute
436
436
  if enable_flex_start:
437
437
  # Flex start takes longer to provision.
438
- base_timeout = 600
438
+ base_timeout = 1200
439
439
  per_node_timeout = 10
440
- max_timeout = 900
440
+ max_timeout = 2400
441
441
  elif volume_mounts is not None:
442
442
  for volume_mount in volume_mounts:
443
443
  if (volume_mount.volume_config.type ==
@@ -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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"EqELoF4IXcALfWVihInou","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-8135aba0712bda37.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-8135aba0712bda37.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]/[job]","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/3947-b059261d6fa88a1f.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-d0dc765474fa0eca.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-1b39779691bb4030.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-fcfad0ddf92ec7ab.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-044ad21de8b4626b.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-80dea41717729fa5.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-1159f362b960e2b8.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/3947-b059261d6fa88a1f.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-d0dc765474fa0eca.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-1b39779691bb4030.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-fcfad0ddf92ec7ab.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-044ad21de8b4626b.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-80dea41717729fa5.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-1159f362b960e2b8.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-9744c271a1642f76.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-9744c271a1642f76.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-927ddeebe57a8ac3.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-927ddeebe57a8ac3.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-8b0809f59034d509.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-8b0809f59034d509.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-ae9d2f705ce582c9.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-ae9d2f705ce582c9.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-c4d5cfac7fbc0668.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-c4d5cfac7fbc0668.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-5bbdc71878f0a068.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-5bbdc71878f0a068.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-cd43fb3c122eedde.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-cd43fb3c122eedde.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-4ebf6484f7216387.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-4ebf6484f7216387.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/3947-b059261d6fa88a1f.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-d0dc765474fa0eca.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-1b39779691bb4030.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-fcfad0ddf92ec7ab.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-044ad21de8b4626b.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-726e5a3f00b67185.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-7c0187f43757a548.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/804-9f5e98ce84d46bdd.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/3947-b059261d6fa88a1f.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-6ff4e45dfb49d11d.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-52ad1ca228faa776.js" defer=""></script><script src="/dashboard/_next/static/chunks/9470-21d059a1dfa03f61.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-d0dc765474fa0eca.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-909d53833da080cb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-1b39779691bb4030.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-fcfad0ddf92ec7ab.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-044ad21de8b4626b.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-726e5a3f00b67185.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-7c0187f43757a548.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"EqELoF4IXcALfWVihInou","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/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-06bde99155fa6292.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"O3wBEOmvYEVEqZxAP7Czn","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/0da6afe66176678a.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/0da6afe66176678a.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-9a81ea998672c303.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-a37b06ddb64521fd.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-06bde99155fa6292.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"EqELoF4IXcALfWVihInou","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/global_user_state.py CHANGED
@@ -391,7 +391,8 @@ def initialize_and_get_db() -> sqlalchemy.engine.Engine:
391
391
  conn_string = skypilot_config.get_nested(('db',), None)
392
392
  if conn_string:
393
393
  logger.debug(f'using db URI from {conn_string}')
394
- _SQLALCHEMY_ENGINE = sqlalchemy.create_engine(conn_string)
394
+ _SQLALCHEMY_ENGINE = sqlalchemy.create_engine(
395
+ conn_string, poolclass=sqlalchemy.NullPool)
395
396
  else:
396
397
  db_path = os.path.expanduser('~/.sky/state.db')
397
398
  pathlib.Path(db_path).parents[0].mkdir(parents=True,
@@ -497,10 +498,12 @@ def add_or_update_user(user: models.User,
497
498
  ))
498
499
 
499
500
  result = session.execute(upsert_stmnt)
501
+ row = result.fetchone()
502
+
503
+ ret = bool(row.was_inserted) if row else False
500
504
  session.commit()
501
505
 
502
- row = result.fetchone()
503
- return bool(row.was_inserted) if row else False
506
+ return ret
504
507
  else:
505
508
  raise ValueError('Unsupported database dialect')
506
509
 
sky/jobs/state.py CHANGED
@@ -219,7 +219,8 @@ def initialize_and_get_db() -> sqlalchemy.engine.Engine:
219
219
  conn_string = skypilot_config.get_nested(('db',), None)
220
220
  if conn_string:
221
221
  logger.debug(f'using db URI from {conn_string}')
222
- _SQLALCHEMY_ENGINE = sqlalchemy.create_engine(conn_string)
222
+ _SQLALCHEMY_ENGINE = sqlalchemy.create_engine(
223
+ conn_string, poolclass=sqlalchemy.NullPool)
223
224
  else:
224
225
  db_path = os.path.expanduser('~/.sky/spot_jobs.db')
225
226
  pathlib.Path(db_path).parents[0].mkdir(parents=True,
@@ -544,14 +545,16 @@ def set_job_info_without_job_id(name: str, workspace: str,
544
545
  if (_SQLALCHEMY_ENGINE.dialect.name ==
545
546
  db_utils.SQLAlchemyDialect.SQLITE.value):
546
547
  result = session.execute(insert_stmt)
548
+ ret = result.lastrowid
547
549
  session.commit()
548
- return result.lastrowid
550
+ return ret
549
551
  elif (_SQLALCHEMY_ENGINE.dialect.name ==
550
552
  db_utils.SQLAlchemyDialect.POSTGRESQL.value):
551
553
  result = session.execute(
552
554
  insert_stmt.returning(job_info_table.c.spot_job_id))
555
+ ret = result.scalar()
553
556
  session.commit()
554
- return result.scalar()
557
+ return ret
555
558
  else:
556
559
  raise ValueError('Unsupported database dialect')
557
560
 
@@ -313,6 +313,9 @@ def get_gke_accelerator_name(accelerator: str) -> str:
313
313
  # A100-80GB, L4, H100-80GB and H100-MEGA-80GB
314
314
  # have a different name pattern.
315
315
  return 'nvidia-{}'.format(accelerator.lower())
316
+ elif accelerator == 'H200':
317
+ # H200s on GCP use this label format
318
+ return 'nvidia-h200-141gb'
316
319
  elif accelerator.startswith('tpu-'):
317
320
  return accelerator
318
321
  else:
sky/server/metrics.py CHANGED
@@ -1,6 +1,5 @@
1
1
  """Instrumentation for the API server."""
2
2
 
3
- import asyncio
4
3
  import os
5
4
  import time
6
5
 
@@ -50,7 +49,7 @@ async def metrics() -> fastapi.Response:
50
49
  headers={'Cache-Control': 'no-cache'})
51
50
 
52
51
 
53
- def run_metrics_server(host: str, port: int):
52
+ def build_metrics_server(host: str, port: int) -> uvicorn.Server:
54
53
  metrics_config = uvicorn.Config(
55
54
  'sky.server.metrics:metrics_app',
56
55
  host=host,
@@ -58,7 +57,7 @@ def run_metrics_server(host: str, port: int):
58
57
  workers=1,
59
58
  )
60
59
  metrics_server_instance = uvicorn.Server(metrics_config)
61
- asyncio.run(metrics_server_instance.serve())
60
+ return metrics_server_instance
62
61
 
63
62
 
64
63
  def _get_status_code_group(status_code: int) -> str:
@@ -399,11 +399,8 @@ def _request_execution_wrapper(request_id: str,
399
399
  f'{common_utils.format_exception(e)}')
400
400
  return
401
401
  else:
402
- with api_requests.update_request(request_id) as request_task:
403
- assert request_task is not None, request_id
404
- request_task.status = api_requests.RequestStatus.SUCCEEDED
405
- if not ignore_return_value:
406
- request_task.set_return_value(return_value)
402
+ api_requests.set_request_succeeded(
403
+ request_id, return_value if not ignore_return_value else None)
407
404
  _restore_output(original_stdout, original_stderr)
408
405
  logger.info(f'Request {request_id} finished')
409
406
 
@@ -710,3 +710,4 @@ class RequestPayload(BasePayload):
710
710
  cluster_name: Optional[str] = None
711
711
  status_msg: Optional[str] = None
712
712
  should_retry: bool = False
713
+ finished_at: Optional[float] = None
@@ -1,4 +1,5 @@
1
1
  """Utilities for REST API."""
2
+ import asyncio
2
3
  import contextlib
3
4
  import dataclasses
4
5
  import enum
@@ -20,6 +21,7 @@ import filelock
20
21
  from sky import exceptions
21
22
  from sky import global_user_state
22
23
  from sky import sky_logging
24
+ from sky import skypilot_config
23
25
  from sky.server import common as server_common
24
26
  from sky.server import constants as server_constants
25
27
  from sky.server.requests import payloads
@@ -29,6 +31,7 @@ from sky.utils import common
29
31
  from sky.utils import common_utils
30
32
  from sky.utils import db_utils
31
33
  from sky.utils import env_options
34
+ from sky.utils import subprocess_utils
32
35
  from sky.utils import ux_utils
33
36
 
34
37
  logger = sky_logging.init_logger(__name__)
@@ -39,8 +42,11 @@ COL_CLUSTER_NAME = 'cluster_name'
39
42
  COL_USER_ID = 'user_id'
40
43
  COL_STATUS_MSG = 'status_msg'
41
44
  COL_SHOULD_RETRY = 'should_retry'
45
+ COL_FINISHED_AT = 'finished_at'
42
46
  REQUEST_LOG_PATH_PREFIX = '~/sky_logs/api_server/requests'
43
47
 
48
+ DEFAULT_REQUESTS_RETENTION_HOURS = 24 # 1 day
49
+
44
50
  # TODO(zhwu): For scalability, there are several TODOs:
45
51
  # [x] Have a way to queue requests.
46
52
  # [ ] Move logs to persistent place.
@@ -64,6 +70,10 @@ class RequestStatus(enum.Enum):
64
70
  color = _STATUS_TO_COLOR[self]
65
71
  return f'{color}{self.value}{colorama.Style.RESET_ALL}'
66
72
 
73
+ @classmethod
74
+ def finished_status(cls) -> List['RequestStatus']:
75
+ return [cls.SUCCEEDED, cls.FAILED, cls.CANCELLED]
76
+
67
77
 
68
78
  _STATUS_TO_COLOR = {
69
79
  RequestStatus.PENDING: colorama.Fore.BLUE,
@@ -88,6 +98,7 @@ REQUEST_COLUMNS = [
88
98
  COL_USER_ID,
89
99
  COL_STATUS_MSG,
90
100
  COL_SHOULD_RETRY,
101
+ COL_FINISHED_AT,
91
102
  ]
92
103
 
93
104
 
@@ -120,6 +131,8 @@ class Request:
120
131
  status_msg: Optional[str] = None
121
132
  # Whether the request should be retried.
122
133
  should_retry: bool = False
134
+ # When the request finished.
135
+ finished_at: Optional[float] = None
123
136
 
124
137
  @property
125
138
  def log_path(self) -> pathlib.Path:
@@ -206,6 +219,7 @@ class Request:
206
219
  cluster_name=self.cluster_name,
207
220
  status_msg=self.status_msg,
208
221
  should_retry=self.should_retry,
222
+ finished_at=self.finished_at,
209
223
  )
210
224
 
211
225
  def encode(self) -> payloads.RequestPayload:
@@ -228,6 +242,7 @@ class Request:
228
242
  cluster_name=self.cluster_name,
229
243
  status_msg=self.status_msg,
230
244
  should_retry=self.should_retry,
245
+ finished_at=self.finished_at,
231
246
  )
232
247
  except (TypeError, ValueError) as e:
233
248
  # The error is unexpected, so we don't suppress the stack trace.
@@ -260,6 +275,7 @@ class Request:
260
275
  cluster_name=payload.cluster_name,
261
276
  status_msg=payload.status_msg,
262
277
  should_retry=payload.should_retry,
278
+ finished_at=payload.finished_at,
263
279
  )
264
280
  except (TypeError, ValueError) as e:
265
281
  logger.error(
@@ -439,6 +455,7 @@ def kill_requests(request_ids: Optional[List[str]] = None,
439
455
  # process for each request.
440
456
  os.kill(request_record.pid, signal.SIGTERM)
441
457
  request_record.status = RequestStatus.CANCELLED
458
+ request_record.finished_at = time.time()
442
459
  cancelled_request_ids.append(request_id)
443
460
  return cancelled_request_ids
444
461
 
@@ -474,13 +491,16 @@ def create_table(cursor, conn):
474
491
  schedule_type TEXT,
475
492
  {COL_USER_ID} TEXT,
476
493
  {COL_STATUS_MSG} TEXT,
477
- {COL_SHOULD_RETRY} INTEGER
494
+ {COL_SHOULD_RETRY} INTEGER,
495
+ {COL_FINISHED_AT} REAL
478
496
  )""")
479
497
 
480
498
  db_utils.add_column_to_table(cursor, conn, REQUEST_TABLE, COL_STATUS_MSG,
481
499
  'TEXT')
482
500
  db_utils.add_column_to_table(cursor, conn, REQUEST_TABLE, COL_SHOULD_RETRY,
483
501
  'INTEGER')
502
+ db_utils.add_column_to_table(cursor, conn, REQUEST_TABLE, COL_FINISHED_AT,
503
+ 'REAL')
484
504
 
485
505
 
486
506
  _DB = None
@@ -583,6 +603,7 @@ def get_request_tasks(
583
603
  user_id: Optional[str] = None,
584
604
  exclude_request_names: Optional[List[str]] = None,
585
605
  include_request_names: Optional[List[str]] = None,
606
+ finished_before: Optional[float] = None,
586
607
  ) -> List[Request]:
587
608
  """Get a list of requests that match the given filters.
588
609
 
@@ -595,6 +616,8 @@ def get_request_tasks(
595
616
  If None, all users are included.
596
617
  include_request_names: a list of request names to filter on.
597
618
  Mutually exclusive with exclude_request_names.
619
+ finished_before: if provided, only include requests finished before this
620
+ timestamp.
598
621
 
599
622
  Raises:
600
623
  ValueError: If both exclude_request_names and include_request_names are
@@ -606,7 +629,7 @@ def get_request_tasks(
606
629
  'provided, not both.')
607
630
 
608
631
  filters = []
609
- filter_params = []
632
+ filter_params: List[Any] = []
610
633
  if status is not None:
611
634
  status_list_str = ','.join(repr(status.value) for status in status)
612
635
  filters.append(f'status IN ({status_list_str})')
@@ -624,6 +647,9 @@ def get_request_tasks(
624
647
  request_names_str = ','.join(
625
648
  repr(name) for name in include_request_names)
626
649
  filters.append(f'name IN ({request_names_str})')
650
+ if finished_before is not None:
651
+ filters.append('finished_at < ?')
652
+ filter_params.append(finished_before)
627
653
  assert _DB is not None
628
654
  with _DB.conn:
629
655
  cursor = _DB.conn.cursor()
@@ -665,19 +691,83 @@ def set_request_failed(request_id: str, e: BaseException) -> None:
665
691
  with update_request(request_id) as request_task:
666
692
  assert request_task is not None, request_id
667
693
  request_task.status = RequestStatus.FAILED
694
+ request_task.finished_at = time.time()
668
695
  request_task.set_error(e)
669
696
 
670
697
 
671
- def set_request_succeeded(request_id: str, result: Any) -> None:
698
+ def set_request_succeeded(request_id: str, result: Optional[Any]) -> None:
672
699
  """Set a request to succeeded and populate the result."""
673
700
  with update_request(request_id) as request_task:
674
701
  assert request_task is not None, request_id
675
702
  request_task.status = RequestStatus.SUCCEEDED
676
- request_task.set_return_value(result)
703
+ request_task.finished_at = time.time()
704
+ if result is not None:
705
+ request_task.set_return_value(result)
677
706
 
678
707
 
679
708
  def set_request_cancelled(request_id: str) -> None:
680
709
  """Set a request to cancelled."""
681
710
  with update_request(request_id) as request_task:
682
711
  assert request_task is not None, request_id
712
+ request_task.finished_at = time.time()
683
713
  request_task.status = RequestStatus.CANCELLED
714
+
715
+
716
+ @init_db
717
+ def _delete_requests(requests: List[Request]):
718
+ """Clean up requests by their IDs."""
719
+ id_list_str = ','.join(repr(req.request_id) for req in requests)
720
+ assert _DB is not None
721
+ with _DB.conn:
722
+ cursor = _DB.conn.cursor()
723
+ cursor.execute(
724
+ f'DELETE FROM {REQUEST_TABLE} WHERE request_id IN ({id_list_str})')
725
+
726
+
727
+ def clean_finished_requests_with_retention(retention_seconds: int):
728
+ """Clean up finished requests older than the retention period.
729
+
730
+ This function removes old finished requests (SUCCEEDED, FAILED, CANCELLED)
731
+ from the database and cleans up their associated log files.
732
+
733
+ Args:
734
+ retention_seconds: Requests older than this many seconds will be
735
+ deleted.
736
+ """
737
+ reqs = get_request_tasks(status=RequestStatus.finished_status(),
738
+ finished_before=time.time() - retention_seconds)
739
+
740
+ subprocess_utils.run_in_parallel(
741
+ func=lambda req: req.log_path.unlink(missing_ok=True),
742
+ args=reqs,
743
+ num_threads=len(reqs))
744
+
745
+ _delete_requests(reqs)
746
+
747
+ # To avoid leakage of the log file, logs must be deleted before the
748
+ # request task in the database.
749
+ logger.info(f'Cleaned up {len(reqs)} finished requests '
750
+ f'older than {retention_seconds} seconds')
751
+
752
+
753
+ async def requests_gc_daemon():
754
+ """Garbage collect finished requests periodically."""
755
+ while True:
756
+ logger.info('Running requests GC daemon...')
757
+ # Use the latest config.
758
+ skypilot_config.reload_config()
759
+ retention_seconds = skypilot_config.get_nested(
760
+ ('api_server', 'requests_retention_hours'),
761
+ DEFAULT_REQUESTS_RETENTION_HOURS) * 3600
762
+ try:
763
+ # Negative value disables the requests GC
764
+ if retention_seconds >= 0:
765
+ clean_finished_requests_with_retention(retention_seconds)
766
+ except asyncio.CancelledError:
767
+ logger.info('Requests GC daemon cancelled')
768
+ break
769
+ except Exception as e: # pylint: disable=broad-except
770
+ logger.error(f'Error running requests GC daemon: {e}')
771
+ # Run the daemon at most once every hour to avoid too frequent
772
+ # cleanup.
773
+ await asyncio.sleep(max(retention_seconds, 3600))
sky/server/server.py CHANGED
@@ -26,6 +26,7 @@ import fastapi
26
26
  from fastapi.middleware import cors
27
27
  from passlib.hash import apr_md5_crypt
28
28
  import starlette.middleware.base
29
+ import uvloop
29
30
 
30
31
  import sky
31
32
  from sky import catalog
@@ -1461,6 +1462,12 @@ async def stream(
1461
1462
  raise fastapi.HTTPException(
1462
1463
  status_code=404, detail=f'Request {request_id!r} not found')
1463
1464
  log_path_to_stream = request_task.log_path
1465
+ if not log_path_to_stream.exists():
1466
+ # The log file might be deleted by the request GC daemon but the
1467
+ # request task is still in the database.
1468
+ raise fastapi.HTTPException(
1469
+ status_code=404,
1470
+ detail=f'Log of request {request_id!r} has been deleted')
1464
1471
  else:
1465
1472
  assert log_path is not None, (request_id, log_path)
1466
1473
  if log_path == constants.API_SERVER_LOGS:
@@ -1775,13 +1782,18 @@ if __name__ == '__main__':
1775
1782
 
1776
1783
  queue_server: Optional[multiprocessing.Process] = None
1777
1784
  workers: List[executor.RequestWorker] = []
1785
+ # Global background tasks that will be scheduled in a separate event loop.
1786
+ global_tasks: List[asyncio.Task] = []
1778
1787
  try:
1788
+ background = uvloop.new_event_loop()
1779
1789
  if os.environ.get(constants.ENV_VAR_SERVER_METRICS_ENABLED):
1780
- metrics_thread = threading.Thread(target=metrics.run_metrics_server,
1781
- args=(cmd_args.host,
1782
- cmd_args.metrics_port),
1783
- daemon=True)
1784
- metrics_thread.start()
1790
+ metrics_server = metrics.build_metrics_server(
1791
+ cmd_args.host, cmd_args.metrics_port)
1792
+ global_tasks.append(background.create_task(metrics_server.serve()))
1793
+ global_tasks.append(
1794
+ background.create_task(requests_lib.requests_gc_daemon()))
1795
+ threading.Thread(target=background.run_forever, daemon=True).start()
1796
+
1785
1797
  queue_server, workers = executor.start(config)
1786
1798
 
1787
1799
  logger.info(f'Starting SkyPilot API server, workers={num_workers}')
@@ -1799,6 +1811,8 @@ if __name__ == '__main__':
1799
1811
  finally:
1800
1812
  logger.info('Shutting down SkyPilot API server...')
1801
1813
 
1814
+ for gt in global_tasks:
1815
+ gt.cancel()
1802
1816
  subprocess_utils.run_in_parallel(lambda worker: worker.cancel(),
1803
1817
  workers,
1804
1818
  num_threads=len(workers))
sky/server/uvicorn.py CHANGED
@@ -150,7 +150,10 @@ class Server(uvicorn.Server):
150
150
  if req is None:
151
151
  return
152
152
  if req.pid is not None:
153
- os.kill(req.pid, signal.SIGTERM)
153
+ try:
154
+ os.kill(req.pid, signal.SIGTERM)
155
+ except ProcessLookupError:
156
+ logger.debug(f'Process {req.pid} already finished.')
154
157
  req.status = requests_lib.RequestStatus.CANCELLED
155
158
  req.should_retry = True
156
159
  logger.info(
sky/utils/schemas.py CHANGED
@@ -1449,6 +1449,9 @@ def get_config_schema():
1449
1449
  }
1450
1450
  ]
1451
1451
  },
1452
+ 'requests_retention_hours': {
1453
+ 'type': 'integer',
1454
+ },
1452
1455
  }
1453
1456
  }
1454
1457
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250708
3
+ Version: 1.0.0.dev20250709
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,4 +1,4 @@
1
- sky/__init__.py,sha256=2m87hTVZYhVtroMcDUmk2ARgl6amW0fR_wkXuI6H2L8,6419
1
+ sky/__init__.py,sha256=roU5EIKmMo9iJ6-Wtx6Y9b-S0juTQEg07ortKHBrpDA,6419
2
2
  sky/admin_policy.py,sha256=FMiizgvVTmD9gFA2OUaveXnuY3lbNU-fCbUYAODBZj4,9427
3
3
  sky/authentication.py,sha256=V7zGSV7bqcAKC_EGOOS0KhJ01ZFLnme0WnjLFO7zavs,25603
4
4
  sky/check.py,sha256=R0pFsTq2v-wr3NFePlX9DmDhsbvWEoFJAXsys3pUmT4,30338
@@ -8,7 +8,7 @@ sky/core.py,sha256=5UbaZ5xamYTajEq4TyiT81Q_cVzqPnMQRXASSz4OcNg,56272
8
8
  sky/dag.py,sha256=5MFXlP43y9U54zxfYGhVyBiWEInoFFlt_zJ7ASJntXw,3889
9
9
  sky/exceptions.py,sha256=Vn7VVhyrTaMBTdVxsro325aKSMM4_KRJOghFX31xIVM,19164
10
10
  sky/execution.py,sha256=BhI4paGKpXMhWJoelHFe7LGFbCnW7hl0rIAmdIay-dk,33223
11
- sky/global_user_state.py,sha256=8_oKM5l5aey_IadFC6beiilfsbG10J27sqVxnHxFc7A,73040
11
+ sky/global_user_state.py,sha256=eUSbLPwwHRdbmVjYbCGSfxRqijVqK28XkYgw3TFar9c,73115
12
12
  sky/models.py,sha256=Eor-cT4D71QTimogcnJ5ey1G1PXK-OXN-snEtE8Uu_g,3152
13
13
  sky/optimizer.py,sha256=oE4NrDmyE1A9B5NI3T_s7QUV5HkCeSJUU75NoJoVIPI,63323
14
14
  sky/resources.py,sha256=MHdipCUpW2foB2romFIM57b__Lg4WCBfYDNSYAx2MEA,105546
@@ -92,7 +92,7 @@ sky/clouds/fluidstack.py,sha256=TkFHChRa7HH_-f5SDRgtFqKCmUCYcSfPCf4lpQH90do,1322
92
92
  sky/clouds/gcp.py,sha256=92qzPagPCabVScWMqbDh4Nd14LzcZnK5ojb_phw9bRA,68430
93
93
  sky/clouds/hyperbolic.py,sha256=cvcYeTs7js36OOXwehme4vzzjtDWqjPyqtxmb4XuUk4,11492
94
94
  sky/clouds/ibm.py,sha256=JQTJQ5wVxVSqH7O05GOld8X5iO16g6Idd_YmRAGZmB8,22567
95
- sky/clouds/kubernetes.py,sha256=Qu-GmEfy8IDigPHaDSQQeNPKH9k68H-FRI4ab8xFtuc,47947
95
+ sky/clouds/kubernetes.py,sha256=0og8H4h-liU7q9ywLjSYl0bUWi94jl5yK_lFf9vRG_0,47949
96
96
  sky/clouds/lambda_cloud.py,sha256=ZoKSseOGYlZFNhue2OK75dTU836AAE_pkuVod4yZX68,13260
97
97
  sky/clouds/nebius.py,sha256=0ceJUwl1kjwhTJOSDERke8jCrfRxeyb9nLMkQfjBktQ,20926
98
98
  sky/clouds/oci.py,sha256=Tos4hgXhYJ4kNkh6aa8_WsaxcD_JmbarR_1GltV-YrM,28158
@@ -108,19 +108,19 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
108
108
  sky/clouds/utils/gcp_utils.py,sha256=zpdibyvdROgDGqllcvQuST3pKqj6pzqX-gxCw-DsCfc,9873
109
109
  sky/clouds/utils/oci_utils.py,sha256=yv_Y9oM5WNCnOofu44aKyOPTZZdKfpFLCx3ewZ2VBFY,7994
110
110
  sky/clouds/utils/scp_utils.py,sha256=VGuccVO5uFGr8-yolWSoYrgr11z6cIeDBGcqkBzAyOs,18409
111
- sky/dashboard/out/404.html,sha256=cUx0906JlcJsKNoEoUyaV9G7oHtgifRqsQV1TlVb164,1423
112
- sky/dashboard/out/clusters.html,sha256=agiI2ZkkBKXhhvNcJfUkMW_FEs-4SpOwzx63y4JN3Rw,1418
113
- sky/dashboard/out/config.html,sha256=fvv80Dyym6z2Mf-9e74yg0StvER5Qqypw9unDLg8a-w,1414
111
+ sky/dashboard/out/404.html,sha256=1cUJyoOUj36FC21oRB3kA_VnABSzNZvA9_tVnKzdrto,1423
112
+ sky/dashboard/out/clusters.html,sha256=ooS7fIlp_3rgi41v8n72zTXLudifQuQQYGnBVQ1tfnc,1418
113
+ sky/dashboard/out/config.html,sha256=tKnG-4CQQRiOoHEpHC2hTbH2vXaqvYgh-RB2MIdeEy4,1414
114
114
  sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
115
- sky/dashboard/out/index.html,sha256=NgaE4sIkYBGYeQMa2jG9Kbs2ldBlCjFzf1pqP32cEPA,1407
116
- sky/dashboard/out/infra.html,sha256=djapoJeEBzqxrTX1kJWC-ON6k-cZ8z_rTDN0DpPQJ2g,1412
117
- sky/dashboard/out/jobs.html,sha256=ZiWwGLNouIOd6OAmngnKrcOtl6AJIXmaNsGFaz5VcF0,1410
115
+ sky/dashboard/out/index.html,sha256=OSD1eqZEm6IdYMpRT92ird5FezONFyBFkAX2GZ7day4,1407
116
+ sky/dashboard/out/infra.html,sha256=r065hx9gKvfdEH-wsAsBeHrmWDQSb9BuU_sEUafGI1Q,1412
117
+ sky/dashboard/out/jobs.html,sha256=f8uOTarAuYvc5e1EBByhLbs1PX1I-UDoHWJa0eBtM4w,1410
118
118
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
119
- sky/dashboard/out/users.html,sha256=xOmOz4CjIEuaA_w8rAXK10EsM-OTXwFJhzlQkwxG3nI,1412
120
- sky/dashboard/out/volumes.html,sha256=7yudeUFl-ga2pdzpvgT79uQx91SXJcTLFkHqFBko-bY,1416
121
- sky/dashboard/out/workspaces.html,sha256=0TivthxDR3hSrhl2F3bL8I6hr0_YRCV0zIaO94L_nzk,1422
122
- sky/dashboard/out/_next/static/O3wBEOmvYEVEqZxAP7Czn/_buildManifest.js,sha256=SMKLljkiS_9UQoF0v1MyY_ziwbXl8KnBBlwCuTRc3V8,2235
123
- sky/dashboard/out/_next/static/O3wBEOmvYEVEqZxAP7Czn/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
119
+ sky/dashboard/out/users.html,sha256=g7cyYDat_yz6RwRY_oSFvGiCghSt9S8F9j1RgcPpjEs,1412
120
+ sky/dashboard/out/volumes.html,sha256=je57QhfSfpBj2K6E_VQJKmPAsuswqqE9qbSOa2kGF78,1416
121
+ sky/dashboard/out/workspaces.html,sha256=HjEMiyX1WCyfxMP9kXatazmd0KBo70b4ZswCLmtGJ-w,1422
122
+ sky/dashboard/out/_next/static/EqELoF4IXcALfWVihInou/_buildManifest.js,sha256=SMKLljkiS_9UQoF0v1MyY_ziwbXl8KnBBlwCuTRc3V8,2235
123
+ sky/dashboard/out/_next/static/EqELoF4IXcALfWVihInou/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
124
124
  sky/dashboard/out/_next/static/chunks/1043-1b39779691bb4030.js,sha256=k8-hHIedPKi22M0wZwGOdWZ_S-H0jVnepFwm7i9_zg4,18192
125
125
  sky/dashboard/out/_next/static/chunks/1141-726e5a3f00b67185.js,sha256=lEAVPk_18NZpZuPrGx1Xy9VWqE_5n3JuqWbIPS1_ZMw,17823
126
126
  sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js,sha256=VJ6y-Z6Eg2T93hQIRfWAbjAkQ7nQhglmIaVbEpKSILY,38451
@@ -174,13 +174,13 @@ sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-c4d5cfac7fbc0668.js,sha25
174
174
  sky/dashboard/out/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js,sha256=K9tqKHcB2kiSHTAddLaM2oL1PzmqZNTdLDOuNzCaJNM,765
175
175
  sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-7c0187f43757a548.js,sha256=FsoenC6VRkPLE29KkLd4nlSq2qociH4zFexYMxgetOM,1530
176
176
  sky/dashboard/out/_next/static/css/0da6afe66176678a.css,sha256=I8b7x4ULdoXHkgk0BsNa0D6k2UYoA2mEhq7H1G_tVQE,44869
177
- sky/dashboard/out/clusters/[cluster].html,sha256=NM-HMqTyAzV-R2JNs3qnbViOfTycmUg3P3cByzw78kQ,2847
178
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=fYfmNXABLQjZ8wZLUn4iWBxNhJ7GdoTeyRmW6VZYh5M,2160
179
- sky/dashboard/out/infra/[context].html,sha256=RiwkWxB6fUaM5z_v990T-C-l1N3O3Uc_SKkC6uMTSos,1436
180
- sky/dashboard/out/jobs/[job].html,sha256=ZbWhC3gyI8ACf2fsHupfJrDJe5EKvTdMlpXG-P-Q7mY,2304
177
+ sky/dashboard/out/clusters/[cluster].html,sha256=-E1Yuu3F-dITbL8XXz0Ph_gLTo36DEN0wm42MmtzJGY,2847
178
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=kd7PFYTTbwsVwCr-zbX1STj34fG7T-6xRGzY81PITT0,2160
179
+ sky/dashboard/out/infra/[context].html,sha256=1YUcsad_v6Vw6gvR0svuBMZKy0zF9nwwpNGV0s2qk2c,1436
180
+ sky/dashboard/out/jobs/[job].html,sha256=Z4wdvPhnjt4eAA2ZK6W4e0nRsMXT8ZvNvKJyJx4Sev8,2304
181
181
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
182
- sky/dashboard/out/workspace/new.html,sha256=af4sIaen1YnffB1kT5IPustRH1PgkF78S_Ix-pyUxy8,1428
183
- sky/dashboard/out/workspaces/[name].html,sha256=PfZBShKwPOfYYKBhgD_aAFchecW4zjuVmEFVq1t_hfc,2845
182
+ sky/dashboard/out/workspace/new.html,sha256=flSk-JBbIf0OHjVUZ8FJO1dA9bMI5r0p6x2WS5rM8h4,1428
183
+ sky/dashboard/out/workspaces/[name].html,sha256=Ob77WxnNheWD-T_3YhzGrNY6wKYY_ntDpT5AA3olM4E,2845
184
184
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
185
185
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
186
186
  sky/data/data_utils.py,sha256=CNYPM963qby5ddW0DZNbhiWXkqgB9MHh_jrC5DoBctM,33437
@@ -192,7 +192,7 @@ sky/jobs/constants.py,sha256=5n6wcYVyOnllM39uJDQDv7hHILcdSwiyg_-tqMc7nJk,3305
192
192
  sky/jobs/controller.py,sha256=C-SrZ4MyNg30Rx-K7bpLf99V039QuW9m29_3vzVm8i0,35631
193
193
  sky/jobs/recovery_strategy.py,sha256=a9A4W-6U3KU-pjkWiFpIdgTHC8W26-jYrmi4vzU9iOg,28818
194
194
  sky/jobs/scheduler.py,sha256=b3RAjEzCXyoikh_BcmmGjoZ9ZeXr-tBnXoLFctt95ko,14375
195
- sky/jobs/state.py,sha256=HHERdEhuJ3QHMu5dvY2mHVJgtHzIkAI6F1Cv2Iz3Hvw,65516
195
+ sky/jobs/state.py,sha256=C9CSTkrztNmnBlb9K6JdClPETq1xm-ahXMu_LDRc3lo,65612
196
196
  sky/jobs/utils.py,sha256=gfW4smCWWMmE4OwIbEqI5j5gVh5Gvfs6paqKQR2Tia8,70920
197
197
  sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
198
  sky/jobs/client/sdk.py,sha256=Nw7bP8pJ-uLIi14kMekEtmzqPmdIiN-CbhoNCJlHA7s,11340
@@ -252,7 +252,7 @@ sky/provision/kubernetes/constants.py,sha256=vZJQsAVjAgwsOskB48tIFSXtNw7IFnJOQE_
252
252
  sky/provision/kubernetes/instance.py,sha256=VlwOQGhLS_yZwBtpb7d0V40O1I_VI0nDEjRrHIsTb8w,58910
253
253
  sky/provision/kubernetes/network.py,sha256=Dgj8u7IQBHKHt-mSDhYzue1wfDk96FR_8fO89TwuZ2E,12846
254
254
  sky/provision/kubernetes/network_utils.py,sha256=eEbt8acJW3Ohe6qHZNZ9GAQ29kIZEQX7Q5S08yOuvhA,12220
255
- sky/provision/kubernetes/utils.py,sha256=OSU4m5eMuhDaIw3Verzt5B5L_dG46D0gN7nPZNEMDVw,143136
255
+ sky/provision/kubernetes/utils.py,sha256=_thZxGqs9_2NY7kZw3q4eUXGTYdTzcTvyCqa3tMoqSw,143248
256
256
  sky/provision/kubernetes/volume.py,sha256=KaYls4QU_QNXoncAiySeUX479zuzeCeW2iB1tWtJe8w,8061
257
257
  sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml,sha256=S87GNAbDqgTrLuxF-afPAqQ0V-i41El4s_9KBZMuaag,1331
258
258
  sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
@@ -324,22 +324,22 @@ sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
324
324
  sky/server/common.py,sha256=u7hV5oGdCj5GfCxpNmLd6yl0B1mlh11FMFIR5ZoW5pA,34492
325
325
  sky/server/config.py,sha256=XWf5Kw4am6vMO5wcyWevbQAFH-dmKb7AMEgDzD083-M,8538
326
326
  sky/server/constants.py,sha256=v6RP8ZEwCNsxO2s2IukgOcEldZO5bvcQaxmOTA0Cf0g,2321
327
- sky/server/metrics.py,sha256=aVRaSwpBVXE9dXIVd9bNsSigKM4bkqNq0eTpP0Noyo8,3657
327
+ sky/server/metrics.py,sha256=6H6n6dq_C5HMaU97mJlRUB9bqOEA_k205PO15wE3AWk,3648
328
328
  sky/server/rest.py,sha256=elMpi-cS301OqTwmFZb7fWYXr1vdJ28YT1zIDH1IpBk,5968
329
- sky/server/server.py,sha256=iauONRTcoQ872zVnAq6xEChmEJP0-qVr3odlWqeIXF4,72855
329
+ sky/server/server.py,sha256=OLWzK9SBfPwaBIdbMPxtngMEXCDQQuRC7ooOpw6d9kE,73466
330
330
  sky/server/state.py,sha256=YbVOMJ1JipQQv17gLIGyiGN7MKfnP83qlUa5MB1z0Yk,747
331
331
  sky/server/stream_utils.py,sha256=RS4RuMxQqTGqp3uxzZVtmFWzos4d49P7hMX_VklzEVU,9189
332
- sky/server/uvicorn.py,sha256=s3PnFVCZh_6BB6Zw76K-jL-NmtDTEg8rlbuaRKbgVTQ,9125
332
+ sky/server/uvicorn.py,sha256=I-JUJwgUznt87hboDd66NTRaw0WtfFVzxxtoxowNqBg,9266
333
333
  sky/server/versions.py,sha256=3atZzUa7y1XeKNcrfVxKWAo_5ZyCOnbY7DKpIqed7Do,10011
334
334
  sky/server/html/log.html,sha256=TSGZktua9Ysl_ysg3w60rjxAxhH61AJnsYDHdtqrjmI,6929
335
335
  sky/server/html/token_page.html,sha256=eUndS5u1foL9vaWGPRTLMt7lCzD1g0wYJ2v_EeeFzlc,7046
336
336
  sky/server/requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
337
337
  sky/server/requests/event_loop.py,sha256=OhpPbuce65bbjpGRlcJa78AVnYSm08SzFKt70ypCUuQ,1211
338
- sky/server/requests/executor.py,sha256=jp2_ypDMiAmcb-2Ms06JnMhmEHnvWMLKQlVoaSptV8E,26614
339
- sky/server/requests/payloads.py,sha256=P4Qv8fWQD6Xz7hP-dMvsA63SpPbWjYespgO5-ch2wik,23334
338
+ sky/server/requests/executor.py,sha256=_wQSD_3qAmXup5eTHs_GUzTRYemModz1gECsDRQmxg4,26424
339
+ sky/server/requests/payloads.py,sha256=UXulzuo5dY1uQTemYhAhYR0AL92AW6vxCdpI6ZgsxXk,23374
340
340
  sky/server/requests/preconditions.py,sha256=uUQjzFFHf7O5-WvBypMzqViGmd1CXksbqrrDPmY_s_Y,7178
341
341
  sky/server/requests/process.py,sha256=I0ToOcF_cMJi5TfZMJOn9rDmJYewQOV07Pnetzqj2IU,10805
342
- sky/server/requests/requests.py,sha256=AT4nJKCa2I13rVhZq929hMtZF5-So7w-gp9E_Ld60Xk,25193
342
+ sky/server/requests/requests.py,sha256=jp81kMjXkBVqQK2v4GtLQstXvMR0EOPOOsn88kYJh5g,28670
343
343
  sky/server/requests/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
344
344
  sky/server/requests/queues/local_queue.py,sha256=X6VkBiUmgd_kfqIK1hCtMWG1b8GiZbY70TBiBR6c6GY,416
345
345
  sky/server/requests/queues/mp_queue.py,sha256=jDqP4Jd28U3ibSFyMR1DF9I2OWZrPZqFJrG5S6RFpyw,3403
@@ -440,7 +440,7 @@ sky/utils/resource_checker.py,sha256=N18XhoVIqjY1VzmKvxQxRchRgC2WIgcEQyHDkLvg4Y8
440
440
  sky/utils/resources_utils.py,sha256=zcJXHYQt6WtQHKuWEif1QP1NtSO7XQYJBaEs625yV1Y,15958
441
441
  sky/utils/rich_console_utils.py,sha256=wPvAlshaFHuMZSjiDnaK3OSBppZLBjAn-lj7AvxNBQk,553
442
442
  sky/utils/rich_utils.py,sha256=ZKztFc0D5q7ma_NE2p9UKjVS9zqcJ3L53FRw6SPoUvg,14707
443
- sky/utils/schemas.py,sha256=uThhjgjxtf_13SEcnKq9Mrdkr_8xMmyNaihnwNoMwsU,52241
443
+ sky/utils/schemas.py,sha256=hvLJn66ATm53t6Qcl4sAi56Zxf8UrKsWFpMZTy4weSY,52333
444
444
  sky/utils/status_lib.py,sha256=QGkd6COD1GX1h30Mk9RMUdyeUOMJs5971GkxTcFgdsU,1705
445
445
  sky/utils/subprocess_utils.py,sha256=tOpFY_1ml7JkVGAN1o473lcKPklGR95qBCW61eu8kEo,15773
446
446
  sky/utils/tempstore.py,sha256=TvCVXnPHzy_BLAXHhWvUcldqOY8iXh1vEWtBGHcpbmo,1725
@@ -480,9 +480,9 @@ sky/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
480
480
  sky/workspaces/core.py,sha256=MkQoVqWN67tf4VRq284U9vgAw4lwb_cpUfwHQT4V9Ow,16598
481
481
  sky/workspaces/server.py,sha256=Box45DS54xXGHy7I3tGKGy-JP0a8G_z6IhfvGlEXtsA,3439
482
482
  sky/workspaces/utils.py,sha256=IIAiFoS6sdb2t0X5YoX9AietpTanZUQNTK8cePun-sY,2143
483
- skypilot_nightly-1.0.0.dev20250708.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
484
- skypilot_nightly-1.0.0.dev20250708.dist-info/METADATA,sha256=FY6IE86BB5AzLYMUDpwVY_Y_TLxkSmUQ0wwHW3N9v8U,18864
485
- skypilot_nightly-1.0.0.dev20250708.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
486
- skypilot_nightly-1.0.0.dev20250708.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
487
- skypilot_nightly-1.0.0.dev20250708.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
488
- skypilot_nightly-1.0.0.dev20250708.dist-info/RECORD,,
483
+ skypilot_nightly-1.0.0.dev20250709.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
484
+ skypilot_nightly-1.0.0.dev20250709.dist-info/METADATA,sha256=pV9ebWXuewiUfQDPMA1niOTInKI3M7BNkMajzdiy3C4,18864
485
+ skypilot_nightly-1.0.0.dev20250709.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
486
+ skypilot_nightly-1.0.0.dev20250709.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
487
+ skypilot_nightly-1.0.0.dev20250709.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
488
+ skypilot_nightly-1.0.0.dev20250709.dist-info/RECORD,,