skypilot-nightly 1.0.0.dev20250724__py3-none-any.whl → 1.0.0.dev20250725__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.

Files changed (40) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +27 -1
  3. sky/client/cli/command.py +55 -16
  4. sky/dashboard/out/404.html +1 -1
  5. sky/dashboard/out/_next/static/chunks/{webpack-b6447da22305b14a.js → webpack-a305898dc479711e.js} +1 -1
  6. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  7. sky/dashboard/out/clusters/[cluster].html +1 -1
  8. sky/dashboard/out/clusters.html +1 -1
  9. sky/dashboard/out/config.html +1 -1
  10. sky/dashboard/out/index.html +1 -1
  11. sky/dashboard/out/infra/[context].html +1 -1
  12. sky/dashboard/out/infra.html +1 -1
  13. sky/dashboard/out/jobs/[job].html +1 -1
  14. sky/dashboard/out/jobs.html +1 -1
  15. sky/dashboard/out/users.html +1 -1
  16. sky/dashboard/out/volumes.html +1 -1
  17. sky/dashboard/out/workspace/new.html +1 -1
  18. sky/dashboard/out/workspaces/[name].html +1 -1
  19. sky/dashboard/out/workspaces.html +1 -1
  20. sky/global_user_state.py +12 -23
  21. sky/jobs/state.py +12 -24
  22. sky/server/common.py +9 -0
  23. sky/server/server.py +3 -0
  24. sky/templates/aws-ray.yml.j2 +7 -1
  25. sky/templates/azure-ray.yml.j2 +1 -1
  26. sky/templates/do-ray.yml.j2 +1 -1
  27. sky/templates/lambda-ray.yml.j2 +1 -1
  28. sky/templates/nebius-ray.yml.j2 +1 -1
  29. sky/templates/paperspace-ray.yml.j2 +1 -1
  30. sky/templates/runpod-ray.yml.j2 +1 -1
  31. sky/utils/db/migration_utils.py +60 -19
  32. sky/utils/schemas.py +13 -0
  33. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.dist-info}/METADATA +1 -1
  34. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.dist-info}/RECORD +40 -40
  35. /sky/dashboard/out/_next/static/{BURfWrKsQk9psMPv0OXrh → SiA7c33x_DqO42M373Okd}/_buildManifest.js +0 -0
  36. /sky/dashboard/out/_next/static/{BURfWrKsQk9psMPv0OXrh → SiA7c33x_DqO42M373Okd}/_ssgManifest.js +0 -0
  37. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.dist-info}/WHEEL +0 -0
  38. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.dist-info}/entry_points.txt +0 -0
  39. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.dist-info}/licenses/LICENSE +0 -0
  40. {skypilot_nightly-1.0.0.dev20250724.dist-info → skypilot_nightly-1.0.0.dev20250725.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 = '5b5dfe080437e0b2e58b1e7742c5864a1ebe9432'
8
+ _SKYPILOT_COMMIT_SHA = 'c8383b047969b0b18ca50a7ad02ea9d8cf77d236'
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.dev20250724'
38
+ __version__ = '1.0.0.dev20250725'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -35,6 +35,7 @@ from sky.adaptors import common as adaptors_common
35
35
  from sky.jobs import utils as managed_job_utils
36
36
  from sky.provision import instance_setup
37
37
  from sky.provision.kubernetes import utils as kubernetes_utils
38
+ from sky.server.requests import requests as requests_lib
38
39
  from sky.skylet import constants
39
40
  from sky.usage import usage_lib
40
41
  from sky.utils import cluster_utils
@@ -798,6 +799,12 @@ def write_cluster_config(
798
799
  'volume_name_on_cloud': vol.volume_config.name_on_cloud,
799
800
  })
800
801
 
802
+ runcmd = skypilot_config.get_effective_region_config(
803
+ cloud=str(to_provision.cloud).lower(),
804
+ region=to_provision.region,
805
+ keys=('post_provision_runcmd',),
806
+ default_value=None)
807
+
801
808
  # Use a tmp file path to avoid incomplete YAML file being re-used in the
802
809
  # future.
803
810
  tmp_yaml_path = yaml_path + '.tmp'
@@ -833,7 +840,7 @@ def write_cluster_config(
833
840
  # User-supplied remote_identity
834
841
  'remote_identity': remote_identity,
835
842
  # The reservation pools that specified by the user. This is
836
- # currently only used by GCP.
843
+ # currently only used by AWS and GCP.
837
844
  'specific_reservations': specific_reservations,
838
845
 
839
846
  # Conda setup
@@ -896,6 +903,10 @@ def write_cluster_config(
896
903
 
897
904
  # Volume mounts
898
905
  'volume_mounts': volume_mount_vars,
906
+
907
+ # runcmd to append to the cloud-init cloud config passed to the
908
+ # machine's UserData. This is currently only used by AWS.
909
+ 'runcmd': runcmd,
899
910
  }),
900
911
  output_path=tmp_yaml_path)
901
912
  config_dict['cluster_name'] = cluster_name
@@ -2831,6 +2842,21 @@ def get_clusters(
2831
2842
  force_refresh_statuses = None
2832
2843
 
2833
2844
  def _refresh_cluster(cluster_name):
2845
+ # TODO(syang): we should try not to leak
2846
+ # request info in backend_utils.py.
2847
+ # Refactor this to use some other info to
2848
+ # determine if a launch is in progress.
2849
+ request = requests_lib.get_request_tasks(
2850
+ status=[requests_lib.RequestStatus.RUNNING],
2851
+ cluster_names=[cluster_name],
2852
+ include_request_names=['sky.launch'])
2853
+ if len(request) > 0:
2854
+ # There is an active launch request on the cluster,
2855
+ # so we don't want to update the cluster status until
2856
+ # the request is completed.
2857
+ logger.debug(f'skipping refresh for cluster {cluster_name} '
2858
+ 'as there is an active launch request')
2859
+ return global_user_state.get_cluster_from_name(cluster_name)
2834
2860
  try:
2835
2861
  record = refresh_cluster_record(
2836
2862
  cluster_name,
sky/client/cli/command.py CHANGED
@@ -24,6 +24,7 @@ listed in "sky --help". Take care to put logically connected commands close to
24
24
  each other.
25
25
  """
26
26
  import collections
27
+ import concurrent.futures
27
28
  import fnmatch
28
29
  import os
29
30
  import pathlib
@@ -358,6 +359,9 @@ def _install_shell_completion(ctx: click.Context, param: click.Parameter,
358
359
  bashrc_diff = ('\n# For SkyPilot shell completion'
359
360
  '\n. ~/.sky/.sky-complete.bash')
360
361
 
362
+ cmd: Optional[str] = None
363
+ reload_cmd: Optional[str] = None
364
+
361
365
  if value == 'bash':
362
366
  install_cmd = f'_SKY_COMPLETE=bash_source sky > \
363
367
  ~/.sky/.sky-complete.bash && \
@@ -389,6 +393,7 @@ def _install_shell_completion(ctx: click.Context, param: click.Parameter,
389
393
  click.secho(f'Unsupported shell: {value}', fg='red')
390
394
  ctx.exit()
391
395
 
396
+ assert cmd is not None # This should never be None due to ctx.exit() above
392
397
  try:
393
398
  subprocess.run(cmd,
394
399
  shell=True,
@@ -420,6 +425,9 @@ def _uninstall_shell_completion(ctx: click.Context, param: click.Parameter,
420
425
  else:
421
426
  value = os.path.basename(os.environ['SHELL'])
422
427
 
428
+ cmd: Optional[str] = None
429
+ reload_cmd: Optional[str] = None
430
+
423
431
  if value == 'bash':
424
432
  cmd = 'sed -i"" -e "/# For SkyPilot shell completion/d" ~/.bashrc && \
425
433
  sed -i"" -e "/sky-complete.bash/d" ~/.bashrc && \
@@ -444,6 +452,7 @@ def _uninstall_shell_completion(ctx: click.Context, param: click.Parameter,
444
452
  click.secho(f'Unsupported shell: {value}', fg='red')
445
453
  ctx.exit()
446
454
 
455
+ assert cmd is not None # This should never be None due to ctx.exit() above
447
456
  try:
448
457
  subprocess.run(cmd, shell=True, check=True)
449
458
  click.secho(f'Shell completion uninstalled for {value}', fg='green')
@@ -1745,19 +1754,16 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1745
1754
  # Do not show job queue if user specifies clusters, and if user
1746
1755
  # specifies --ip or --endpoint(s).
1747
1756
  show_managed_jobs = show_managed_jobs and not any([clusters, ip, endpoints])
1748
- if show_managed_jobs:
1749
- managed_jobs_queue_request_id = managed_jobs.queue(refresh=False,
1750
- skip_finished=True,
1751
- all_users=all_users)
1752
1757
  show_endpoints = endpoints or endpoint is not None
1753
1758
  show_single_endpoint = endpoint is not None
1754
1759
  show_services = show_services and not any([clusters, ip, endpoints])
1755
- if show_services:
1756
- # Run the sky serve service query in parallel to speed up the
1757
- # status query.
1758
- service_status_request_id = serve_lib.status(service_names=None)
1759
1760
 
1760
- workspace_request_id = None
1761
+ query_clusters: Optional[List[str]] = None if not clusters else clusters
1762
+ refresh_mode = common.StatusRefreshMode.NONE
1763
+ if refresh:
1764
+ refresh_mode = common.StatusRefreshMode.FORCE
1765
+
1766
+ # Phase 1: Validate arguments for IP/endpoint queries
1761
1767
  if ip or show_endpoints:
1762
1768
  if refresh:
1763
1769
  raise click.UsageError(
@@ -1791,9 +1797,19 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1791
1797
  flag='ip' if ip else
1792
1798
  ('endpoint port'
1793
1799
  if show_single_endpoint else 'endpoints')))
1794
- else:
1800
+
1801
+ # Phase 2: Parallel submission of all API requests
1802
+ def submit_managed_jobs():
1803
+ return managed_jobs.queue(refresh=False,
1804
+ skip_finished=True,
1805
+ all_users=all_users)
1806
+
1807
+ def submit_services() -> Optional[str]:
1808
+ return serve_lib.status(service_names=None)
1809
+
1810
+ def submit_workspace() -> Optional[str]:
1795
1811
  try:
1796
- workspace_request_id = sdk.workspaces()
1812
+ return sdk.workspaces()
1797
1813
  except RuntimeError:
1798
1814
  # Backward compatibility for API server before #5660.
1799
1815
  # TODO(zhwu): remove this after 0.10.0.
@@ -1802,12 +1818,35 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1802
1818
  'workspaces. Update with: sky api stop; '
1803
1819
  'sky api start'
1804
1820
  f'{colorama.Style.RESET_ALL}')
1805
- workspace_request_id = None
1821
+ return None
1806
1822
 
1807
- query_clusters: Optional[List[str]] = None if not clusters else clusters
1808
- refresh_mode = common.StatusRefreshMode.NONE
1809
- if refresh:
1810
- refresh_mode = common.StatusRefreshMode.FORCE
1823
+ managed_jobs_queue_request_id = None
1824
+ service_status_request_id = None
1825
+ workspace_request_id = None
1826
+
1827
+ # Submit all requests in parallel
1828
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
1829
+ if show_managed_jobs:
1830
+ managed_jobs_request_future = executor.submit(submit_managed_jobs)
1831
+ if show_services:
1832
+ services_request_future = executor.submit(submit_services)
1833
+ if not (ip or show_endpoints):
1834
+ workspace_request_future = executor.submit(submit_workspace)
1835
+
1836
+ # Get the request IDs
1837
+ if show_managed_jobs:
1838
+ managed_jobs_queue_request_id = managed_jobs_request_future.result()
1839
+ if show_services:
1840
+ service_status_request_id = services_request_future.result()
1841
+ if not (ip or show_endpoints):
1842
+ workspace_request_id = workspace_request_future.result()
1843
+
1844
+ managed_jobs_queue_request_id = '' if not managed_jobs_queue_request_id \
1845
+ else managed_jobs_queue_request_id
1846
+ service_status_request_id = '' if not service_status_request_id \
1847
+ else service_status_request_id
1848
+
1849
+ # Phase 3: Get cluster records and handle special cases
1811
1850
  cluster_records = _get_cluster_records_and_set_ssh_config(
1812
1851
  query_clusters, refresh_mode, all_users)
1813
1852
 
@@ -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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_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":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_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":"SiA7c33x_DqO42M373Okd","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- !function(){"use strict";var e,t,n,r,c,o,f,u,i,a={},s={};function d(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}},r=!0;try{a[e](n,n.exports,d),r=!1}finally{r&&delete s[e]}return n.exports}d.m=a,e=[],d.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var f=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],u=!0,i=0;i<n.length;i++)f>=c&&Object.keys(d.O).every(function(e){return d.O[e](n[i])})?n.splice(i--,1):(u=!1,c<f&&(f=c));if(u){e.splice(o--,1);var a=r();void 0!==a&&(t=a)}}return t},d.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);d.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},d.d(c,o),c},d.d=function(e,t){for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce(function(t,n){return d.f[n](e,t),t},[]))},d.u=function(e){return 2350===e?"static/chunks/2350.23778a2b19aabd33.js":2369===e?"static/chunks/2369.2d6e4757f8dfc2b7.js":3937===e?"static/chunks/3937.d7f1c55d1916c7f2.js":9025===e?"static/chunks/9025.4a9099bdf3ed4875.js":4937===e?"static/chunks/4937.d75809403fc264ac.js":9984===e?"static/chunks/9984.0460de9d3adf5582.js":2003===e?"static/chunks/2003.b82e6db40ec4c463.js":9847===e?"static/chunks/9847.387abf8a14d722db.js":4725===e?"static/chunks/4725.66125dcd9832aa5d.js":691===e?"static/chunks/691.488b4aef97c28727.js":2641===e?"static/chunks/2641.74c19c4d45a2c034.js":3785===e?"static/chunks/3785.59705416215ff08b.js":4869===e?"static/chunks/4869.da729a7db3a31f43.js":"static/chunks/"+e+"-"+({616:"162f3033ffcd3d31",938:"7ee806653aef0609",1043:"869d9c78bf5dd3df",1141:"e49a159c30a6c4a7",1272:"1ef0bf0237faccdb",1559:"18717d96ef2fcbe9",1664:"d65361e92b85e786",1871:"ea0e7283886407ca",3698:"9fa11dafb5cad4a6",5230:"df791914b54d91d9",5739:"5ea3ffa10fc884f2",6135:"2abbd0352f8ee061",6601:"d4a381403a8bae91",6989:"eab0e9c16b64fd9f",6990:"f64e03df359e04f7",7411:"2cc31dc0fdf2a9ad",8969:"8e0b2055bf5dd499"})[e]+".js"},d.miniCssF=function(e){},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",d.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var f,u,i=document.getElementsByTagName("script"),a=0;a<i.length;a++){var s=i[a];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==c+n){f=s;break}}f||(u=!0,(f=document.createElement("script")).charset="utf-8",f.timeout=120,d.nc&&f.setAttribute("nonce",d.nc),f.setAttribute("data-webpack",c+n),f.src=d.tu(e)),r[e]=[t];var l=function(t,n){f.onerror=f.onload=null,clearTimeout(b);var c=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach(function(e){return e(n)}),t)return t(n)},b=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),u&&document.head.appendChild(f)},d.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},d.tu=function(e){return d.tt().createScriptURL(e)},d.p="/dashboard/_next/",f={2272:0},d.f.j=function(e,t){var n=d.o(f,e)?f[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(2272!=e){var r=new Promise(function(t,r){n=f[e]=[t,r]});t.push(n[2]=r);var c=d.p+d.u(e),o=Error();d.l(c,function(t){if(d.o(f,e)&&(0!==(n=f[e])&&(f[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else f[e]=0}},d.O.j=function(e){return 0===f[e]},u=function(e,t){var n,r,c=t[0],o=t[1],u=t[2],i=0;if(c.some(function(e){return 0!==f[e]})){for(n in o)d.o(o,n)&&(d.m[n]=o[n]);if(u)var a=u(d)}for(e&&e(t);i<c.length;i++)r=c[i],d.o(f,r)&&f[r]&&f[r][0](),f[r]=0;return d.O(a)},(i=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(u.bind(null,0)),i.push=u.bind(null,i.push.bind(i)),d.nc=void 0}();
1
+ !function(){"use strict";var e,t,n,r,c,o,f,u,i,a={},s={};function d(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}},r=!0;try{a[e](n,n.exports,d),r=!1}finally{r&&delete s[e]}return n.exports}d.m=a,e=[],d.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var f=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],u=!0,i=0;i<n.length;i++)f>=c&&Object.keys(d.O).every(function(e){return d.O[e](n[i])})?n.splice(i--,1):(u=!1,c<f&&(f=c));if(u){e.splice(o--,1);var a=r();void 0!==a&&(t=a)}}return t},d.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);d.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},d.d(c,o),c},d.d=function(e,t){for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce(function(t,n){return d.f[n](e,t),t},[]))},d.u=function(e){return 2350===e?"static/chunks/2350.23778a2b19aabd33.js":2369===e?"static/chunks/2369.2d6e4757f8dfc2b7.js":3937===e?"static/chunks/3937.d7f1c55d1916c7f2.js":9025===e?"static/chunks/9025.4a9099bdf3ed4875.js":4937===e?"static/chunks/4937.d75809403fc264ac.js":9984===e?"static/chunks/9984.0460de9d3adf5582.js":2003===e?"static/chunks/2003.b82e6db40ec4c463.js":691===e?"static/chunks/691.488b4aef97c28727.js":2641===e?"static/chunks/2641.74c19c4d45a2c034.js":9847===e?"static/chunks/9847.387abf8a14d722db.js":4725===e?"static/chunks/4725.66125dcd9832aa5d.js":3785===e?"static/chunks/3785.59705416215ff08b.js":4869===e?"static/chunks/4869.da729a7db3a31f43.js":"static/chunks/"+e+"-"+({616:"162f3033ffcd3d31",938:"7ee806653aef0609",1043:"869d9c78bf5dd3df",1141:"e49a159c30a6c4a7",1272:"1ef0bf0237faccdb",1559:"18717d96ef2fcbe9",1664:"d65361e92b85e786",1871:"ea0e7283886407ca",3698:"9fa11dafb5cad4a6",5230:"df791914b54d91d9",5739:"5ea3ffa10fc884f2",6135:"2abbd0352f8ee061",6601:"d4a381403a8bae91",6989:"eab0e9c16b64fd9f",6990:"f64e03df359e04f7",7411:"2cc31dc0fdf2a9ad",8969:"8e0b2055bf5dd499"})[e]+".js"},d.miniCssF=function(e){},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",d.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var f,u,i=document.getElementsByTagName("script"),a=0;a<i.length;a++){var s=i[a];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==c+n){f=s;break}}f||(u=!0,(f=document.createElement("script")).charset="utf-8",f.timeout=120,d.nc&&f.setAttribute("nonce",d.nc),f.setAttribute("data-webpack",c+n),f.src=d.tu(e)),r[e]=[t];var l=function(t,n){f.onerror=f.onload=null,clearTimeout(b);var c=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),c&&c.forEach(function(e){return e(n)}),t)return t(n)},b=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),u&&document.head.appendChild(f)},d.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},d.tu=function(e){return d.tt().createScriptURL(e)},d.p="/dashboard/_next/",f={2272:0},d.f.j=function(e,t){var n=d.o(f,e)?f[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(2272!=e){var r=new Promise(function(t,r){n=f[e]=[t,r]});t.push(n[2]=r);var c=d.p+d.u(e),o=Error();d.l(c,function(t){if(d.o(f,e)&&(0!==(n=f[e])&&(f[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else f[e]=0}},d.O.j=function(e){return 0===f[e]},u=function(e,t){var n,r,c=t[0],o=t[1],u=t[2],i=0;if(c.some(function(e){return 0!==f[e]})){for(n in o)d.o(o,n)&&(d.m[n]=o[n]);if(u)var a=u(d)}for(e&&e(t);i<c.length;i++)r=c[i],d.o(f,r)&&f[r]&&f[r][0](),f[r]=0;return d.O(a)},(i=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(u.bind(null,0)),i.push=u.bind(null,i.push.bind(i)),d.nc=void 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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-2186770cc2de1623.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_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":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-2186770cc2de1623.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_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":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-ea0e7283886407ca.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-95afb019ab85801c.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-ea0e7283886407ca.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-95afb019ab85801c.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-3d4be4961e1c94eb.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-3d4be4961e1c94eb.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-89e7daf7b7df02e0.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-89e7daf7b7df02e0.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-a90b4fe4616dc501.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-a90b4fe4616dc501.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-0d3d1f890c5d188a.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-0d3d1f890c5d188a.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dc0299ffefebcdbe.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dc0299ffefebcdbe.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-49f790d12a85027c.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-49f790d12a85027c.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-6790fcefd5487b13.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-6790fcefd5487b13.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-61ea7ba7e56f8d06.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-61ea7ba7e56f8d06.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-e49a159c30a6c4a7.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-6bcd4b20914d76c9.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.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/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-e49a159c30a6c4a7.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-6bcd4b20914d76c9.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"SiA7c33x_DqO42M373Okd","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-b6447da22305b14a.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-5f7fe4b7d55b8612.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"BURfWrKsQk9psMPv0OXrh","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.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-a305898dc479711e.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-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-5f7fe4b7d55b8612.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"SiA7c33x_DqO42M373Okd","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/global_user_state.py CHANGED
@@ -9,7 +9,6 @@ Concepts:
9
9
  import functools
10
10
  import json
11
11
  import os
12
- import pathlib
13
12
  import pickle
14
13
  import re
15
14
  import time
@@ -237,35 +236,25 @@ def create_table(engine: sqlalchemy.engine.Engine):
237
236
  # If the database is locked, it is OK to continue, as the WAL mode
238
237
  # is not critical and is likely to be enabled by other processes.
239
238
 
240
- # Get alembic config for state db and run migrations
241
- alembic_config = migration_utils.get_alembic_config(
242
- engine, migration_utils.GLOBAL_USER_STATE_DB_NAME)
243
- # pylint: disable=line-too-long
244
- alembic_config.config_ini_section = migration_utils.GLOBAL_USER_STATE_DB_NAME
245
239
  migration_utils.safe_alembic_upgrade(
246
- engine, alembic_config, migration_utils.GLOBAL_USER_STATE_VERSION)
240
+ engine, migration_utils.GLOBAL_USER_STATE_DB_NAME,
241
+ migration_utils.GLOBAL_USER_STATE_VERSION)
247
242
 
248
243
 
249
244
  def initialize_and_get_db() -> sqlalchemy.engine.Engine:
250
245
  global _SQLALCHEMY_ENGINE
246
+
251
247
  if _SQLALCHEMY_ENGINE is not None:
252
248
  return _SQLALCHEMY_ENGINE
253
- with migration_utils.db_lock(migration_utils.GLOBAL_USER_STATE_DB_NAME):
254
- if _SQLALCHEMY_ENGINE is None:
255
- conn_string = None
256
- if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
257
- conn_string = skypilot_config.get_nested(('db',), None)
258
- if conn_string:
259
- logger.debug(f'using db URI from {conn_string}')
260
- engine = sqlalchemy.create_engine(conn_string,
261
- poolclass=sqlalchemy.NullPool)
262
- else:
263
- db_path = os.path.expanduser('~/.sky/state.db')
264
- pathlib.Path(db_path).parents[0].mkdir(parents=True,
265
- exist_ok=True)
266
- engine = sqlalchemy.create_engine('sqlite:///' + db_path)
267
- create_table(engine)
268
- _SQLALCHEMY_ENGINE = engine
249
+
250
+ # get an engine to the db
251
+ engine = migration_utils.get_engine('state')
252
+
253
+ # run migrations if needed
254
+ create_table(engine)
255
+
256
+ # return engine
257
+ _SQLALCHEMY_ENGINE = engine
269
258
  return _SQLALCHEMY_ENGINE
270
259
 
271
260
 
sky/jobs/state.py CHANGED
@@ -4,8 +4,6 @@
4
4
  import enum
5
5
  import functools
6
6
  import json
7
- import os
8
- import pathlib
9
7
  import time
10
8
  import typing
11
9
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
@@ -20,7 +18,6 @@ from sqlalchemy.ext import declarative
20
18
 
21
19
  from sky import exceptions
22
20
  from sky import sky_logging
23
- from sky import skypilot_config
24
21
  from sky.skylet import constants
25
22
  from sky.utils import common_utils
26
23
  from sky.utils.db import db_utils
@@ -129,34 +126,25 @@ def create_table(engine: sqlalchemy.engine.Engine):
129
126
  # If the database is locked, it is OK to continue, as the WAL mode
130
127
  # is not critical and is likely to be enabled by other processes.
131
128
 
132
- # Get alembic config for spot jobs db and run migrations
133
- alembic_config = migration_utils.get_alembic_config(
134
- engine, migration_utils.SPOT_JOBS_DB_NAME)
135
- alembic_config.config_ini_section = migration_utils.SPOT_JOBS_DB_NAME
136
- migration_utils.safe_alembic_upgrade(engine, alembic_config,
129
+ migration_utils.safe_alembic_upgrade(engine,
130
+ migration_utils.SPOT_JOBS_DB_NAME,
137
131
  migration_utils.SPOT_JOBS_VERSION)
138
132
 
139
133
 
140
134
  def initialize_and_get_db() -> sqlalchemy.engine.Engine:
141
135
  global _SQLALCHEMY_ENGINE
136
+
142
137
  if _SQLALCHEMY_ENGINE is not None:
143
138
  return _SQLALCHEMY_ENGINE
144
- with migration_utils.db_lock(migration_utils.SPOT_JOBS_DB_NAME):
145
- if _SQLALCHEMY_ENGINE is None:
146
- conn_string = None
147
- if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
148
- conn_string = skypilot_config.get_nested(('db',), None)
149
- if conn_string:
150
- logger.debug(f'using db URI from {conn_string}')
151
- engine = sqlalchemy.create_engine(conn_string,
152
- poolclass=sqlalchemy.NullPool)
153
- else:
154
- db_path = os.path.expanduser('~/.sky/spot_jobs.db')
155
- pathlib.Path(db_path).parents[0].mkdir(parents=True,
156
- exist_ok=True)
157
- engine = sqlalchemy.create_engine('sqlite:///' + db_path)
158
- create_table(engine)
159
- _SQLALCHEMY_ENGINE = engine
139
+
140
+ # get an engine to the db
141
+ engine = migration_utils.get_engine('spot_jobs')
142
+
143
+ # run migrations if needed
144
+ create_table(engine)
145
+
146
+ # return engine
147
+ _SQLALCHEMY_ENGINE = engine
160
148
  return _SQLALCHEMY_ENGINE
161
149
 
162
150
 
sky/server/common.py CHANGED
@@ -13,12 +13,14 @@ import shutil
13
13
  import subprocess
14
14
  import sys
15
15
  import tempfile
16
+ import threading
16
17
  import time
17
18
  import typing
18
19
  from typing import Any, Dict, Literal, Optional, Tuple, Union
19
20
  from urllib import parse
20
21
  import uuid
21
22
 
23
+ import cachetools
22
24
  import colorama
23
25
  import filelock
24
26
 
@@ -276,6 +278,10 @@ def _handle_non_200_server_status(
276
278
  return ApiServerInfo(status=ApiServerStatus.UNHEALTHY)
277
279
 
278
280
 
281
+ @cachetools.cached(cache=cachetools.TTLCache(maxsize=10,
282
+ ttl=5.0,
283
+ timer=time.time),
284
+ lock=threading.RLock())
279
285
  def get_api_server_status(endpoint: Optional[str] = None) -> ApiServerInfo:
280
286
  """Retrieve the status of the API server.
281
287
 
@@ -413,6 +419,7 @@ def _start_api_server(deploy: bool = False,
413
419
  server_url = get_server_url(host)
414
420
  assert server_url in AVAILABLE_LOCAL_API_SERVER_URLS, (
415
421
  f'server url {server_url} is not a local url')
422
+
416
423
  with rich_utils.client_status('Starting SkyPilot API server, '
417
424
  f'view logs at {constants.API_SERVER_LOGS}'):
418
425
  logger.info(f'{colorama.Style.DIM}Failed to connect to '
@@ -488,6 +495,8 @@ def _start_api_server(deploy: bool = False,
488
495
  'SkyPilot API server process exited unexpectedly.\n'
489
496
  f'View logs at: {constants.API_SERVER_LOGS}')
490
497
  try:
498
+ # Clear the cache to ensure fresh checks during startup
499
+ get_api_server_status.cache_clear() # type: ignore
491
500
  check_server_healthy()
492
501
  except exceptions.APIVersionMismatchError:
493
502
  raise
sky/server/server.py CHANGED
@@ -1764,6 +1764,9 @@ if __name__ == '__main__':
1764
1764
 
1765
1765
  from sky.server import uvicorn as skyuvicorn
1766
1766
 
1767
+ # Initialize global user state db
1768
+ global_user_state.initialize_and_get_db()
1769
+ # Initialize request db
1767
1770
  requests_lib.reset_db_and_logs()
1768
1771
 
1769
1772
  parser = argparse.ArgumentParser()
@@ -19,7 +19,7 @@ docker:
19
19
  username: |-
20
20
  {{docker_login_config.username}}
21
21
  password: |-
22
- {{docker_login_config.password}}
22
+ {{docker_login_config.password | indent(6) }}
23
23
  server: |-
24
24
  {{docker_login_config.server}}
25
25
  {%- endif %}
@@ -131,6 +131,12 @@ available_node_types:
131
131
  - systemctl disable apt-daily.timer apt-daily-upgrade.timer unattended-upgrades.service
132
132
  - systemctl mask apt-daily.service apt-daily-upgrade.service unattended-upgrades.service
133
133
  - systemctl daemon-reload
134
+ {%- if runcmd %}
135
+ runcmd:
136
+ {%- for cmd in runcmd %}
137
+ - {{cmd}}
138
+ {%- endfor %}
139
+ {%- endif %}
134
140
  TagSpecifications:
135
141
  - ResourceType: instance
136
142
  Tags:
@@ -19,7 +19,7 @@ docker:
19
19
  username: |-
20
20
  {{docker_login_config.username}}
21
21
  password: |-
22
- {{docker_login_config.password}}
22
+ {{docker_login_config.password | indent(6) }}
23
23
  server: |-
24
24
  {{docker_login_config.server}}
25
25
  {%- endif %}
@@ -19,7 +19,7 @@ docker:
19
19
  username: |-
20
20
  {{docker_login_config.username}}
21
21
  password: |-
22
- {{docker_login_config.password}}
22
+ {{docker_login_config.password | indent(6) }}
23
23
  server: |-
24
24
  {{docker_login_config.server}}
25
25
  {%- endif %}
@@ -19,7 +19,7 @@ docker:
19
19
  username: |-
20
20
  {{docker_login_config.username}}
21
21
  password: |-
22
- {{docker_login_config.password}}
22
+ {{docker_login_config.password | indent(6) }}
23
23
  server: |-
24
24
  {{docker_login_config.server}}
25
25
  {%- endif %}
@@ -25,7 +25,7 @@ docker:
25
25
  username: |-
26
26
  {{docker_login_config.username}}
27
27
  password: |-
28
- {{docker_login_config.password}}
28
+ {{docker_login_config.password | indent(6) }}
29
29
  server: |-
30
30
  {{docker_login_config.server}}
31
31
  {%- endif %}
@@ -19,7 +19,7 @@ docker:
19
19
  username: |-
20
20
  {{docker_login_config.username}}
21
21
  password: |-
22
- {{docker_login_config.password}}
22
+ {{docker_login_config.password | indent(6) }}
23
23
  server: |-
24
24
  {{docker_login_config.server}}
25
25
  {%- endif %}
@@ -20,7 +20,7 @@ provider:
20
20
  username: |-
21
21
  {{docker_login_config.username}}
22
22
  password: |-
23
- {{docker_login_config.password}}
23
+ {{docker_login_config.password | indent(6) }}
24
24
  server: |-
25
25
  {{docker_login_config.server}}
26
26
  {%- endif %}
@@ -3,6 +3,7 @@
3
3
  import contextlib
4
4
  import logging
5
5
  import os
6
+ import pathlib
6
7
 
7
8
  from alembic import command as alembic_command
8
9
  from alembic.config import Config
@@ -10,6 +11,12 @@ from alembic.runtime import migration
10
11
  import filelock
11
12
  import sqlalchemy
12
13
 
14
+ from sky import sky_logging
15
+ from sky import skypilot_config
16
+ from sky.skylet import constants
17
+
18
+ logger = sky_logging.init_logger(__name__)
19
+
13
20
  DB_INIT_LOCK_TIMEOUT_SECONDS = 10
14
21
 
15
22
  GLOBAL_USER_STATE_DB_NAME = 'state_db'
@@ -21,6 +28,21 @@ SPOT_JOBS_VERSION = '001'
21
28
  SPOT_JOBS_LOCK_PATH = '~/.sky/locks/.spot_jobs_db.lock'
22
29
 
23
30
 
31
+ def get_engine(db_name: str):
32
+ conn_string = None
33
+ if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
34
+ conn_string = skypilot_config.get_nested(('db',), None)
35
+ if conn_string:
36
+ logger.debug(f'using db URI from {conn_string}')
37
+ engine = sqlalchemy.create_engine(conn_string,
38
+ poolclass=sqlalchemy.NullPool)
39
+ else:
40
+ db_path = os.path.expanduser(f'~/.sky/{db_name}.db')
41
+ pathlib.Path(db_path).parents[0].mkdir(parents=True, exist_ok=True)
42
+ engine = sqlalchemy.create_engine('sqlite:///' + db_path)
43
+ return engine
44
+
45
+
24
46
  @contextlib.contextmanager
25
47
  def db_lock(db_name: str):
26
48
  lock_path = os.path.expanduser(f'~/.sky/locks/.{db_name}.lock')
@@ -37,7 +59,6 @@ def db_lock(db_name: str):
37
59
 
38
60
  def get_alembic_config(engine: sqlalchemy.engine.Engine, section: str):
39
61
  """Get Alembic configuration for the given section"""
40
- # Use the alembic.ini file from setup_files (included in wheel)
41
62
  # From sky/utils/db/migration_utils.py -> sky/setup_files/alembic.ini
42
63
  alembic_ini_path = os.path.join(
43
64
  os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
@@ -47,31 +68,29 @@ def get_alembic_config(engine: sqlalchemy.engine.Engine, section: str):
47
68
  # Override the database URL to match SkyPilot's current connection
48
69
  # Use render_as_string to get the full URL with password
49
70
  url = engine.url.render_as_string(hide_password=False)
71
+ # Replace % with %% to escape the % character in the URL
72
+ # set_section_option uses variable interpolation, which treats % as a
73
+ # special character.
74
+ # any '%' symbol not used for interpolation needs to be escaped.
75
+ url = url.replace('%', '%%')
50
76
  alembic_cfg.set_section_option(section, 'sqlalchemy.url', url)
51
77
 
52
78
  return alembic_cfg
53
79
 
54
80
 
55
- def safe_alembic_upgrade(engine: sqlalchemy.engine.Engine,
56
- alembic_config: Config, target_revision: str):
57
- """Only upgrade if current version is older than target.
58
-
59
- This handles the case where a database was created with a newer version of
60
- the code and we're now running older code. Since our migrations are purely
61
- additive, it's safe to run a newer database with older code.
81
+ def needs_upgrade(engine: sqlalchemy.engine.Engine, section: str,
82
+ target_revision: str):
83
+ """Check if the database needs to be upgraded.
62
84
 
63
85
  Args:
64
86
  engine: SQLAlchemy engine for the database
65
- alembic_config: Alembic configuration object
87
+ section: Alembic section to upgrade (e.g., 'state_db' or 'spot_jobs_db')
66
88
  target_revision: Target revision to upgrade to (e.g., '001')
67
89
  """
68
- # set alembic logger to warning level
69
- alembic_logger = logging.getLogger('alembic')
70
- alembic_logger.setLevel(logging.WARNING)
71
-
72
90
  current_rev = None
73
91
 
74
- # Get the current revision from the database
92
+ # get alembic config for the given section
93
+ alembic_config = get_alembic_config(engine, section)
75
94
  version_table = alembic_config.get_section_option(
76
95
  alembic_config.config_ini_section, 'version_table', 'alembic_version')
77
96
 
@@ -81,13 +100,35 @@ def safe_alembic_upgrade(engine: sqlalchemy.engine.Engine,
81
100
  current_rev = context.get_current_revision()
82
101
 
83
102
  if current_rev is None:
84
- alembic_command.upgrade(alembic_config, target_revision)
85
- return
103
+ return True
86
104
 
87
105
  # Compare revisions - assuming they are numeric strings like '001', '002'
88
106
  current_rev_num = int(current_rev)
89
107
  target_rev_num = int(target_revision)
90
108
 
91
- # only upgrade if current revision is older than target revision
92
- if current_rev_num < target_rev_num:
93
- alembic_command.upgrade(alembic_config, target_revision)
109
+ return current_rev_num < target_rev_num
110
+
111
+
112
+ def safe_alembic_upgrade(engine: sqlalchemy.engine.Engine, section: str,
113
+ target_revision: str):
114
+ """Upgrade the database if needed. Uses a file lock to ensure
115
+ that only one process tries to upgrade the database at a time.
116
+
117
+ Args:
118
+ engine: SQLAlchemy engine for the database
119
+ section: Alembic section to upgrade (e.g., 'state_db' or 'spot_jobs_db')
120
+ target_revision: Target revision to upgrade to (e.g., '001')
121
+ """
122
+ # set alembic logger to warning level
123
+ alembic_logger = logging.getLogger('alembic')
124
+ alembic_logger.setLevel(logging.WARNING)
125
+
126
+ alembic_config = get_alembic_config(engine, section)
127
+
128
+ # only acquire lock if db needs upgrade
129
+ if needs_upgrade(engine, section, target_revision):
130
+ with db_lock(section):
131
+ # check again if db needs upgrade in case another
132
+ # process upgraded it while we were waiting for the lock
133
+ if needs_upgrade(engine, section, target_revision):
134
+ alembic_command.upgrade(alembic_config, target_revision)
sky/utils/schemas.py CHANGED
@@ -1198,6 +1198,19 @@ def get_config_schema():
1198
1198
  'type': 'null',
1199
1199
  }],
1200
1200
  },
1201
+ 'post_provision_runcmd': {
1202
+ 'type': 'array',
1203
+ 'items': {
1204
+ 'oneOf': [{
1205
+ 'type': 'string'
1206
+ }, {
1207
+ 'type': 'array',
1208
+ 'items': {
1209
+ 'type': 'string'
1210
+ }
1211
+ }]
1212
+ },
1213
+ },
1201
1214
  **_LABELS_SCHEMA,
1202
1215
  **_NETWORK_CONFIG_SCHEMA,
1203
1216
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250724
3
+ Version: 1.0.0.dev20250725
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=PkBsu78bRCZuyXh7zB8oioWmZjhhrAWuQBFQ0PX19iA,6535
1
+ sky/__init__.py,sha256=RLmXWpMwEZLLf88J7EGrn4NJx-vd_y6Uh_eefCwV3s8,6535
2
2
  sky/admin_policy.py,sha256=BeSowGnWfDj58ALiNf3cc2N4gMQWzjO6aXnX7vaqYhk,9782
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=k_3QkqJecFpwLSatM52lD-IitVdjUIXn33EPJWcQfWE,56628
8
8
  sky/dag.py,sha256=5MFXlP43y9U54zxfYGhVyBiWEInoFFlt_zJ7ASJntXw,3889
9
9
  sky/exceptions.py,sha256=0saA9jj5etJiHjaX6PDTdFj3E3JtC3Ue-irE9OlrrEg,19454
10
10
  sky/execution.py,sha256=sZf0306FCKAo1FS7Vg2yCADSr5XHsODYwESHhwdVTjo,33439
11
- sky/global_user_state.py,sha256=vsTFuWIHCVXYcb7CS1olz2n6Ik5shOF5_8OlZARzJv8,68564
11
+ sky/global_user_state.py,sha256=PpStfGwx02mwlPdwR55auB1Y-GfYKxun90YpzzQdH-c,67579
12
12
  sky/models.py,sha256=Eor-cT4D71QTimogcnJ5ey1G1PXK-OXN-snEtE8Uu_g,3152
13
13
  sky/optimizer.py,sha256=rcH6CVix1PJWWSwe1XWItfsmG8igwbKtRE5QVWRlpR4,63804
14
14
  sky/resources.py,sha256=8N32Kwlk3kEPaIE261Qa3hFFSWZYrVKeRRsc3Pfx1O8,105656
@@ -34,7 +34,7 @@ sky/adaptors/vast.py,sha256=tpvmHi7IkQNzbbHVkeo04kUSajoEpSzXr2XgeO_I1LU,695
34
34
  sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
35
35
  sky/backends/__init__.py,sha256=tpa9gAygQopsiBUUuy3wVmr4E05FoPTFHIWqEo4i-u0,627
36
36
  sky/backends/backend.py,sha256=6ltCouZhaXJqv2Zh9nP_YCdHf10_oIRNzAA-XDiMmI8,7969
37
- sky/backends/backend_utils.py,sha256=goPLfcnGF9K6XcoetrPrn4N3kqMVGXLc-G0yz4ZGBO4,145883
37
+ sky/backends/backend_utils.py,sha256=cxd1AJCrOxs_E72XoRgVuqJlr9WWXZ9wnoMs30qZhIY,147148
38
38
  sky/backends/cloud_vm_ray_backend.py,sha256=WjsWb1y9skkAhJCIuC9qDXwKA42PasoqmWCuKovJG8s,264077
39
39
  sky/backends/docker_utils.py,sha256=_EhM6NStZDAwcegppQqExaB5iuSn1qL4xFFUqXAz2Uk,8392
40
40
  sky/backends/local_docker_backend.py,sha256=r84uhXCk7NK9hGW840KPKnrADd7mCerMwncxOzckHg4,17126
@@ -81,7 +81,7 @@ sky/client/sdk.py,sha256=1KIBayflVwL0sVoCj8IP5W75cwT-YEEdpJnglYLaQ98,92749
81
81
  sky/client/sdk.pyi,sha256=Dyu9wBaCZmB3O_pg7q0pHe6i1aVrNFX73eGSdLAm_W8,8082
82
82
  sky/client/service_account_auth.py,sha256=5jXk0G6ufuW-SHCO7BEHQeTO0_2a8KfFmA63auXFRj4,1529
83
83
  sky/client/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- sky/client/cli/command.py,sha256=MfmL8YP6Dvhq_xD88fihsFmZmd43wQEGJ_mdEx7S9c0,222382
84
+ sky/client/cli/command.py,sha256=F6P8cHDkZ3vEs-BAf_NC_5UJai8yYW2yXImz3f7-Dg8,223812
85
85
  sky/client/cli/deprecation_utils.py,sha256=H_d5UyF2CekEoThduAzt5cihBO8hwKYMu0-Wqfbjv5E,3370
86
86
  sky/client/cli/flags.py,sha256=6IdS_G2lB1C6r8kJMzLVREY_qV50VHiSfWlmppVrWuc,11623
87
87
  sky/client/cli/git.py,sha256=dqSaJI1Ndv6RfKJa6HT6ednXr0j_pVlwSdh3XiQzB60,22018
@@ -111,19 +111,19 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
111
111
  sky/clouds/utils/gcp_utils.py,sha256=zpdibyvdROgDGqllcvQuST3pKqj6pzqX-gxCw-DsCfc,9873
112
112
  sky/clouds/utils/oci_utils.py,sha256=TFqAqRLggg4Z0bhxrrq8nouSSomZy-ub1frHXEkud2M,7302
113
113
  sky/clouds/utils/scp_utils.py,sha256=VGuccVO5uFGr8-yolWSoYrgr11z6cIeDBGcqkBzAyOs,18409
114
- sky/dashboard/out/404.html,sha256=p0x5-g-vv2eROgy4aMYoAyurY-16eHNiwnr9KktFNCc,1423
115
- sky/dashboard/out/clusters.html,sha256=-jUb0VgsJ1VJyWFNGB6pt4PgMkme-pYrjWWXhYQDH3w,1418
116
- sky/dashboard/out/config.html,sha256=WTgEcdoK5BrXEviYHZmLGqb6kTr2hSIpcTCyANM7308,1414
114
+ sky/dashboard/out/404.html,sha256=8t0jZbnXZUFlwXN5CiqzxcCEsdVZpbLOuGH4JoAoScQ,1423
115
+ sky/dashboard/out/clusters.html,sha256=HVuyoruUkxbS44wQLdP_ICVgDfOqru8exbImISdDDx0,1418
116
+ sky/dashboard/out/config.html,sha256=33i93jmCKYgM8sS5jBKaNp9niaqOaWg5nJkxTPkVKAU,1414
117
117
  sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
118
- sky/dashboard/out/index.html,sha256=rezlq2bBvM5DGx3spvKY1RwU6x8S2KFwiWDtBBuhibI,1407
119
- sky/dashboard/out/infra.html,sha256=PMLRN7KnCTyi7fi9nEyagq0E5mlLhvIZM6g3sHiNCao,1412
120
- sky/dashboard/out/jobs.html,sha256=QAx1nUDH2bUWxtPVK5Pr7jxlCtLwa9yupMrp-Yhkezs,1410
118
+ sky/dashboard/out/index.html,sha256=PuvqrqxVkGzTO_341nW8RsyOIUXXa2uNjoFH_LQrd-g,1407
119
+ sky/dashboard/out/infra.html,sha256=A_Ok_crm622ANbAKhAw5nOZhSZgsMUtWvoaFOC7GgZk,1412
120
+ sky/dashboard/out/jobs.html,sha256=0NPH--Wq-Gx4Od9lhuJVbfojW3ktrpvzle2oXkuHA48,1410
121
121
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
122
- sky/dashboard/out/users.html,sha256=2SrkAvPJjosPgpXm4BWsvspTCoKTd21jnZSo2AmBnEs,1412
123
- sky/dashboard/out/volumes.html,sha256=Th2LCuQwJsCTiHIWP8oCQwU4BxiwLqJbtgbRizPXtY4,1416
124
- sky/dashboard/out/workspaces.html,sha256=RCIy_sO1TWc66Ed5xU_UyKxHtP0sowGM2SCK4rAchGQ,1422
125
- sky/dashboard/out/_next/static/BURfWrKsQk9psMPv0OXrh/_buildManifest.js,sha256=mmxo6wQVKY20ZhMR66BRt5Wcei8mpj5spy7xJIR2Qy8,2236
126
- sky/dashboard/out/_next/static/BURfWrKsQk9psMPv0OXrh/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
122
+ sky/dashboard/out/users.html,sha256=LECfiJnCEuRrEcqlnb8hLEIFr854RdAjCBQGdjszQas,1412
123
+ sky/dashboard/out/volumes.html,sha256=ty1i_zKM2r50KsNj5y654j1JOE2UOn9OmA0rWT7aAqE,1416
124
+ sky/dashboard/out/workspaces.html,sha256=KY7AQy4XnURj7YvhPVi36HOIQTtw-_xDM_H45MeSEIY,1422
125
+ sky/dashboard/out/_next/static/SiA7c33x_DqO42M373Okd/_buildManifest.js,sha256=mmxo6wQVKY20ZhMR66BRt5Wcei8mpj5spy7xJIR2Qy8,2236
126
+ sky/dashboard/out/_next/static/SiA7c33x_DqO42M373Okd/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
127
127
  sky/dashboard/out/_next/static/chunks/1043-869d9c78bf5dd3df.js,sha256=bAxynBdZtwL6IUsmByq0m47nF_VnO1lsMN9Xjdrp1GI,18328
128
128
  sky/dashboard/out/_next/static/chunks/1141-e49a159c30a6c4a7.js,sha256=KK5G7lgpUnTVxW1tvREGo0rPqKfq8nDl6xx1T21fgCo,17818
129
129
  sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js,sha256=VJ6y-Z6Eg2T93hQIRfWAbjAkQ7nQhglmIaVbEpKSILY,38451
@@ -159,7 +159,7 @@ sky/dashboard/out/_next/static/chunks/framework-efc06c2733009cd3.js,sha256=XKYUV
159
159
  sky/dashboard/out/_next/static/chunks/main-app-68c028b1bc5e1b72.js,sha256=zSukg-WO1Xy-B2xEIIGHXYApy2KOY9xWHcLqAYQvF3A,115883
160
160
  sky/dashboard/out/_next/static/chunks/main-c0a4f1ea606d48d2.js,sha256=DPLM6ccDgTnITBgsqZPN3gmcI2szGCi9b_60PJZkTJQ,109885
161
161
  sky/dashboard/out/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js,sha256=6QPOwdWeAVe8x-SsiDrm-Ga6u2DkqgG5SFqglrlyIgA,91381
162
- sky/dashboard/out/_next/static/chunks/webpack-b6447da22305b14a.js,sha256=XEtasvjEBrvPb5_b59DWWPFOtjUR6oXlLAqTlHsDLLI,4817
162
+ sky/dashboard/out/_next/static/chunks/webpack-a305898dc479711e.js,sha256=gY1Zh71c62-i2vzQ1N9QlPV5Geb_hWNzq8GFoZAjEWs,4817
163
163
  sky/dashboard/out/_next/static/chunks/pages/_app-da491665d4289aae.js,sha256=lZkOnC3PzyWAlYFDLoz0JOHgbnpqDBpk-XOqyQnmghM,95489
164
164
  sky/dashboard/out/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js,sha256=D2OpMaqpdtCPyq6iPhZHuF2ekyMjleRchSNCLR6fqps,250
165
165
  sky/dashboard/out/_next/static/chunks/pages/clusters-3d4be4961e1c94eb.js,sha256=kZI6ZPQB7bzi9HtLRlGGRqr9G4NlGTLsLv6OdqYVgek,860
@@ -177,13 +177,13 @@ sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dc0299ffefebcdbe.js,sha25
177
177
  sky/dashboard/out/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js,sha256=K9tqKHcB2kiSHTAddLaM2oL1PzmqZNTdLDOuNzCaJNM,765
178
178
  sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-6bcd4b20914d76c9.js,sha256=wCk-0BTOhpwUb22meXUGhG7zX-retkF3aR7cuk4qbYQ,1492
179
179
  sky/dashboard/out/_next/static/css/b3227360726f12eb.css,sha256=H55rkeVIrdGOUAIPmLZ6C78aEgXb7fEPa9mT9BOuLBI,55358
180
- sky/dashboard/out/clusters/[cluster].html,sha256=qwMfhXpjeA4bS-0ktZFYTP11K4O25sVVG7-Zr4W_6Tc,2848
181
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=dqtv_VE_tD-rfWEJvQE-1pBK4w97mZzXZYSGH4rtiPM,2161
182
- sky/dashboard/out/infra/[context].html,sha256=LzSn3CJnsShkt6QI6P6XEjccEA-EGifEHDGdlI1yQN0,1436
183
- sky/dashboard/out/jobs/[job].html,sha256=5jCC9Gwf37GsR4-UeT1zs0EY1dUhBEw_e75u5Vw9ERs,2305
180
+ sky/dashboard/out/clusters/[cluster].html,sha256=fs5nad7MpUFKJEsGfxFXmIl31kCACC_Ib0ULNx_qwQg,2848
181
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=v8sfsqzqDs9bSn0W574ftrKchNCrxLgsetiQKNfmscA,2161
182
+ sky/dashboard/out/infra/[context].html,sha256=5glYBYxPu771gOu2v_7EVxjG5MbYJ1zuWBL3nLND6DA,1436
183
+ sky/dashboard/out/jobs/[job].html,sha256=hbzl5J8-YZcylVkyoZaPvfHR0OmTooSPP5zsFl-A5lQ,2305
184
184
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
185
- sky/dashboard/out/workspace/new.html,sha256=daD8SXIwAqkT_Fi7hcFUbuZ8UUmFaHYZcND83abF4rE,1428
186
- sky/dashboard/out/workspaces/[name].html,sha256=Rx76Z3sW1K2qCuAnLgwldEvYXyJZ2il_SBpWafCrMFE,2846
185
+ sky/dashboard/out/workspace/new.html,sha256=EyowwrCI3bj_a9Bqk7DdGhTM8zy4Xeq4bHXugwzX5Ts,1428
186
+ sky/dashboard/out/workspaces/[name].html,sha256=-UybY7XErrUgrE0gZ-S5ai05F5QyN34nFRVpcH6IA_0,2846
187
187
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
188
188
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
189
189
  sky/data/data_utils.py,sha256=CNYPM963qby5ddW0DZNbhiWXkqgB9MHh_jrC5DoBctM,33437
@@ -195,7 +195,7 @@ sky/jobs/constants.py,sha256=N7Bw_sSCL8cVd0NmKGXvAhyclR8Y-gJAair597umVo4,3305
195
195
  sky/jobs/controller.py,sha256=kKnBMQs2XRg1TN80ToVWFwVdwKTuFE4TjQapb3V0iUI,36073
196
196
  sky/jobs/recovery_strategy.py,sha256=a9A4W-6U3KU-pjkWiFpIdgTHC8W26-jYrmi4vzU9iOg,28818
197
197
  sky/jobs/scheduler.py,sha256=b3RAjEzCXyoikh_BcmmGjoZ9ZeXr-tBnXoLFctt95ko,14375
198
- sky/jobs/state.py,sha256=9nD4yTaumwp1x9bPnutftzOl9y0JqZFcnicKubxqik4,62601
198
+ sky/jobs/state.py,sha256=qo6Tc42ylrLJpVquLdKaD2zTUX8r-e5QknZClMaAlMI,61655
199
199
  sky/jobs/utils.py,sha256=bYBtRY8Tu60t0gH7Z0FK7yntXoEHQhsO6IdNr_FDAmA,73283
200
200
  sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  sky/jobs/client/sdk.py,sha256=SSdXVvaGCX5DjCfmMf6bSXOH1Dzk-a3bNhr7qNyHSuU,11335
@@ -331,12 +331,12 @@ sky/serve/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
331
331
  sky/serve/server/core.py,sha256=-djglmHVX-A3XTf0A-4pekoQ7-_Me7KzFnQjK8gaDDY,42080
332
332
  sky/serve/server/server.py,sha256=A9K37a0nQgZeN3eKWv62Oh2C5TSAReTZ9pHmztqlI-c,4396
333
333
  sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
334
- sky/server/common.py,sha256=PmVNQ0XRxeJoKhadxj9Zn8DETiGVGOO6AAMythScYs8,34991
334
+ sky/server/common.py,sha256=XRLjlT0zSivdLRukjAQyWrwCVC6Qo-GY3XUjJJRViYQ,35384
335
335
  sky/server/config.py,sha256=XWf5Kw4am6vMO5wcyWevbQAFH-dmKb7AMEgDzD083-M,8538
336
336
  sky/server/constants.py,sha256=v6RP8ZEwCNsxO2s2IukgOcEldZO5bvcQaxmOTA0Cf0g,2321
337
337
  sky/server/metrics.py,sha256=6H6n6dq_C5HMaU97mJlRUB9bqOEA_k205PO15wE3AWk,3648
338
338
  sky/server/rest.py,sha256=-oDsI8-NmIcb7aqy_8USB4lQbPWdQibST59GJVtFUi8,7983
339
- sky/server/server.py,sha256=gLCbU5ZB4mH8YFgu-70suOj58x7tpg_VGNzzqOfEf5U,73620
339
+ sky/server/server.py,sha256=AP2EyeL6N5V1VkRxwhLAOUYZdjkTCc8MYVtlhMoSSUc,73732
340
340
  sky/server/state.py,sha256=YbVOMJ1JipQQv17gLIGyiGN7MKfnP83qlUa5MB1z0Yk,747
341
341
  sky/server/stream_utils.py,sha256=RS4RuMxQqTGqp3uxzZVtmFWzos4d49P7hMX_VklzEVU,9189
342
342
  sky/server/uvicorn.py,sha256=I-JUJwgUznt87hboDd66NTRaw0WtfFVzxxtoxowNqBg,9266
@@ -389,10 +389,10 @@ sky/skylet/ray_patches/worker.py.patch,sha256=_OBhibdr3xOy5Qje6Tt8D1eQVm_msi50TJ
389
389
  sky/ssh_node_pools/__init__.py,sha256=phpYJAd7I0uO1-O87eb9PbetGbtMiKW5mI-NQCZlXPA,40
390
390
  sky/ssh_node_pools/core.py,sha256=NyT-9W94lnKT_I1mfa068t-pIB7xzZ1WBjKTUdZIDGI,4877
391
391
  sky/ssh_node_pools/server.py,sha256=Qb4Zu6DxqDQG8snUtvWLnUu40hqZEczdA1hVaP-h-y0,8351
392
- sky/templates/aws-ray.yml.j2,sha256=YuqG6KklTd2ry_fTK0hrqslkVM_zHCQWSiORmzUHbFo,9168
393
- sky/templates/azure-ray.yml.j2,sha256=2_WQ3x_LoraE3F12qc97DUXZvD9no0gs8jGRhvkV3No,6360
392
+ sky/templates/aws-ray.yml.j2,sha256=l2zEBjW1mDU8Ze4Llr3kYPeVqZtaXeBjohmyhhoB1rY,9318
393
+ sky/templates/azure-ray.yml.j2,sha256=cQfCDev0quaVfVst_ly3tA8XrGXuAmAhkRJuS7qxFhg,6373
394
394
  sky/templates/cudo-ray.yml.j2,sha256=9g0yFYUk6xPet-JNTPuVDZlVZ9oAcFPL1qaE6fyy-Xc,3797
395
- sky/templates/do-ray.yml.j2,sha256=7XZsM2H6RF2muHCm6xnqglnKhONXH8S3Y_mFiVxD558,4220
395
+ sky/templates/do-ray.yml.j2,sha256=xtTVOrJzxyQOBnFZdCLd2C5aYn3lnPQ0emBaP0P-SdQ,4233
396
396
  sky/templates/fluidstack-ray.yml.j2,sha256=dNr9svMNp0z6-PHyQeRa6Hl3SbgqMESgBdfpvtP3aH0,3789
397
397
  sky/templates/gcp-ray.yml.j2,sha256=WO07ZUGBS6mWCMcdrmcXNGKSNTxhmOb6lMqwycnEFc4,11860
398
398
  sky/templates/hyperbolic-ray.yml.j2,sha256=ThGcxd9m6RbgnZcT6imdikimwRhO5baYrP2h3Wx4HXM,2488
@@ -403,12 +403,12 @@ sky/templates/kubernetes-loadbalancer.yml.j2,sha256=IxrNYM366N01bbkJEbZ_UPYxUP8w
403
403
  sky/templates/kubernetes-port-forward-proxy-command.sh,sha256=iw7mypHszg6Ggq9MbyiYMFOkSlXaQZulaxqC5IWYGCc,3381
404
404
  sky/templates/kubernetes-ray.yml.j2,sha256=qPesN53KwvwnAQvBAyBgu5Eav8VNtBpiLIGHobLOfxw,57351
405
405
  sky/templates/kubernetes-ssh-jump.yml.j2,sha256=k5W5sOIMppU7dDkJMwPlqsUcb92y7L5_TVG3hkgMy8M,2747
406
- sky/templates/lambda-ray.yml.j2,sha256=AeFThho5hPQMncrOWQ6DhEWOsAuZtdxf1gjmp_6kPJA,4747
406
+ sky/templates/lambda-ray.yml.j2,sha256=PbUjxrGhyxhXxL2cmONAI_PRsua3I3Xr5V8yoEy7H6c,4760
407
407
  sky/templates/local-ray.yml.j2,sha256=FNHeyHF6nW9nU9QLIZceUWfvrFTTcO51KqhTnYCEFaA,1185
408
- sky/templates/nebius-ray.yml.j2,sha256=QnkaFzFqgeww8S0PsUia0GhGXv8aS_Lnfa-imBu2s0A,6839
408
+ sky/templates/nebius-ray.yml.j2,sha256=aEOPRUTJqeQIP_VINA7m2Zoq_e2BWkWWH8vr3uqdu34,6852
409
409
  sky/templates/oci-ray.yml.j2,sha256=TvB2at81DuXSG1QV4dxmqjjMdfDTsCU5T4JH01vI5DU,4810
410
- sky/templates/paperspace-ray.yml.j2,sha256=GrMfpUKgeZ76FoKsnqggBrOPkwiYqUw297npPMOcMFw,4270
411
- sky/templates/runpod-ray.yml.j2,sha256=Ch306rKPPScu8Q6A_IJID31hRa46xnuqu_r0ziWZWG8,4604
410
+ sky/templates/paperspace-ray.yml.j2,sha256=PcB21RMfxO5Gne1qT7J_JjnZENLVHrAwVegjIEb_F6E,4283
411
+ sky/templates/runpod-ray.yml.j2,sha256=By2b6BLyaon4dx0b3elXCyLN7Dk1lxvMkYikZgCxjG4,4617
412
412
  sky/templates/scp-ray.yml.j2,sha256=48b_mKtkx_fyEPQUQ_i6YMmylrtGbvIIUkQsuvgTU3I,3481
413
413
  sky/templates/sky-serve-controller.yaml.j2,sha256=W4i1-OGRU2WDvauLC4EDXcYrNxj7mzRFSvSqzAKfehc,2020
414
414
  sky/templates/skypilot-server-kubernetes-proxy.sh,sha256=n5swq5LauF9dnhDWMYqFFHkXeJ44Zjmg1RVbF60jNbE,1079
@@ -453,7 +453,7 @@ sky/utils/resource_checker.py,sha256=N18XhoVIqjY1VzmKvxQxRchRgC2WIgcEQyHDkLvg4Y8
453
453
  sky/utils/resources_utils.py,sha256=zcJXHYQt6WtQHKuWEif1QP1NtSO7XQYJBaEs625yV1Y,15958
454
454
  sky/utils/rich_console_utils.py,sha256=wPvAlshaFHuMZSjiDnaK3OSBppZLBjAn-lj7AvxNBQk,553
455
455
  sky/utils/rich_utils.py,sha256=iR6Gf8ZewE9sut4uhkmZwtEelzm3FvckM9K41meQnWM,14650
456
- sky/utils/schemas.py,sha256=xTTGEyV3YeMcDSeUxJWKcltI4kzBgFc5oUYT1C9-THg,54608
456
+ sky/utils/schemas.py,sha256=bepfJqottkzuonQAAOyd6Efivu8ltam3nqpF-ft_dgI,55061
457
457
  sky/utils/status_lib.py,sha256=QGkd6COD1GX1h30Mk9RMUdyeUOMJs5971GkxTcFgdsU,1705
458
458
  sky/utils/subprocess_utils.py,sha256=tOpFY_1ml7JkVGAN1o473lcKPklGR95qBCW61eu8kEo,15773
459
459
  sky/utils/tempstore.py,sha256=3S5fJ3UjnE12ve38c3MpTXpoRWfDSGndZpqNe7P_8aU,2148
@@ -466,7 +466,7 @@ sky/utils/cli_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
466
466
  sky/utils/cli_utils/status_utils.py,sha256=Lxf_dQu_VTKRWCI86fDi0NiLjUk7IUCEc4jMo0dKjQA,15733
467
467
  sky/utils/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
468
468
  sky/utils/db/db_utils.py,sha256=Mee-36jZbG0T4qeJrWu8mamJd8qGBC95dQ2AG6ejt_8,7968
469
- sky/utils/db/migration_utils.py,sha256=E3A3robAzQoqoWOMg2JbJ3vKQ0nGk-WywZp6-IPnBnA,3506
469
+ sky/utils/db/migration_utils.py,sha256=b8s6rNHKK29mhhYxWwSYfL_FgefFF2do2T7gR6nOZDI,5048
470
470
  sky/utils/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
471
471
  sky/utils/kubernetes/cleanup-tunnel.sh,sha256=rXMXuMfyB9bzKjLvXdMCjimDVvdjGPMXuqeo2ZNx9OA,2244
472
472
  sky/utils/kubernetes/config_map_utils.py,sha256=ucdQGp1XHliZxoCFWU8EMJ2NKfUEs7t-ygw-J61It_w,4760
@@ -496,9 +496,9 @@ sky/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
496
496
  sky/workspaces/core.py,sha256=MkQoVqWN67tf4VRq284U9vgAw4lwb_cpUfwHQT4V9Ow,16598
497
497
  sky/workspaces/server.py,sha256=Box45DS54xXGHy7I3tGKGy-JP0a8G_z6IhfvGlEXtsA,3439
498
498
  sky/workspaces/utils.py,sha256=IIAiFoS6sdb2t0X5YoX9AietpTanZUQNTK8cePun-sY,2143
499
- skypilot_nightly-1.0.0.dev20250724.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
500
- skypilot_nightly-1.0.0.dev20250724.dist-info/METADATA,sha256=gavcVehZ6DKbE96x5_lGsNikDqXqR2Ld-2Ff7elPhQo,19032
501
- skypilot_nightly-1.0.0.dev20250724.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
502
- skypilot_nightly-1.0.0.dev20250724.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
503
- skypilot_nightly-1.0.0.dev20250724.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
504
- skypilot_nightly-1.0.0.dev20250724.dist-info/RECORD,,
499
+ skypilot_nightly-1.0.0.dev20250725.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
500
+ skypilot_nightly-1.0.0.dev20250725.dist-info/METADATA,sha256=b41RTXYPRElmqIPQzjxEPVJ-1mBD46f-tqnt-Z-c5VU,19032
501
+ skypilot_nightly-1.0.0.dev20250725.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
502
+ skypilot_nightly-1.0.0.dev20250725.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
503
+ skypilot_nightly-1.0.0.dev20250725.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
504
+ skypilot_nightly-1.0.0.dev20250725.dist-info/RECORD,,