skypilot-nightly 1.0.0.dev20250821__py3-none-any.whl → 1.0.0.dev20250823__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 (41) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +33 -6
  3. sky/client/cli/command.py +4 -1
  4. sky/client/sdk.py +75 -21
  5. sky/client/sdk_async.py +1 -1
  6. sky/clouds/nebius.py +1 -0
  7. sky/core.py +3 -5
  8. sky/dashboard/out/404.html +1 -1
  9. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  10. sky/dashboard/out/clusters/[cluster].html +1 -1
  11. sky/dashboard/out/clusters.html +1 -1
  12. sky/dashboard/out/config.html +1 -1
  13. sky/dashboard/out/index.html +1 -1
  14. sky/dashboard/out/infra/[context].html +1 -1
  15. sky/dashboard/out/infra.html +1 -1
  16. sky/dashboard/out/jobs/[job].html +1 -1
  17. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  18. sky/dashboard/out/jobs.html +1 -1
  19. sky/dashboard/out/users.html +1 -1
  20. sky/dashboard/out/volumes.html +1 -1
  21. sky/dashboard/out/workspace/new.html +1 -1
  22. sky/dashboard/out/workspaces/[name].html +1 -1
  23. sky/dashboard/out/workspaces.html +1 -1
  24. sky/exceptions.py +8 -0
  25. sky/jobs/utils.py +10 -3
  26. sky/optimizer.py +14 -4
  27. sky/provision/kubernetes/instance.py +4 -1
  28. sky/server/requests/executor.py +2 -2
  29. sky/server/requests/serializers/decoders.py +7 -0
  30. sky/server/requests/serializers/encoders.py +5 -0
  31. sky/server/rest.py +48 -8
  32. sky/server/server.py +8 -6
  33. sky/users/permission.py +4 -6
  34. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/METADATA +3 -3
  35. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/RECORD +41 -41
  36. /sky/dashboard/out/_next/static/{wN25tc2rkvOkO-qkzIhcD → UQeqZCi6L_itwVPDcn3ba}/_buildManifest.js +0 -0
  37. /sky/dashboard/out/_next/static/{wN25tc2rkvOkO-qkzIhcD → UQeqZCi6L_itwVPDcn3ba}/_ssgManifest.js +0 -0
  38. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/WHEEL +0 -0
  39. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/entry_points.txt +0 -0
  40. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/licenses/LICENSE +0 -0
  41. {skypilot_nightly-1.0.0.dev20250821.dist-info → skypilot_nightly-1.0.0.dev20250823.dist-info}/top_level.txt +0 -0
sky/__init__.py CHANGED
@@ -7,7 +7,7 @@ import urllib.request
7
7
  from sky.utils import directory_utils
8
8
 
9
9
  # Replaced with the current commit when building the wheels.
10
- _SKYPILOT_COMMIT_SHA = '05eeefe2f30b1c333c96733989830045eee3fd28'
10
+ _SKYPILOT_COMMIT_SHA = 'e939c0d06e7bd2f973087a8c3005d357e1e29835'
11
11
 
12
12
 
13
13
  def _get_git_commit():
@@ -37,7 +37,7 @@ def _get_git_commit():
37
37
 
38
38
 
39
39
  __commit__ = _get_git_commit()
40
- __version__ = '1.0.0.dev20250821'
40
+ __version__ = '1.0.0.dev20250823'
41
41
  __root_dir__ = directory_utils.get_sky_dir()
42
42
 
43
43
 
@@ -106,6 +106,9 @@ _LAUNCHED_RESERVED_WORKER_PATTERN = re.compile(
106
106
  # 10.133.0.5: ray.worker.default,
107
107
  _LAUNCHING_IP_PATTERN = re.compile(
108
108
  r'({}): ray[._]worker[._](?:default|reserved)'.format(IP_ADDR_REGEX))
109
+ _SSH_CONNECTION_TIMED_OUT_PATTERN = re.compile(r'^ssh:.*timed out$',
110
+ re.IGNORECASE)
111
+ _RAY_CLUSTER_NOT_FOUND_MESSAGE = 'Ray cluster is not found'
109
112
  WAIT_HEAD_NODE_IP_MAX_ATTEMPTS = 3
110
113
 
111
114
  # We check network connection by going through _TEST_IP_LIST. We may need to
@@ -2047,11 +2050,11 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
2047
2050
  require_outputs=True,
2048
2051
  separate_stderr=True)
2049
2052
  if rc:
2050
- raise RuntimeError(
2051
- f'Refreshing status ({cluster_name!r}): Failed to check '
2052
- f'ray cluster\'s healthiness with '
2053
- f'{instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND}.\n'
2054
- f'-- stdout --\n{output}\n-- stderr --\n{stderr}')
2053
+ raise exceptions.CommandError(
2054
+ rc, instance_setup.RAY_STATUS_WITH_SKY_RAY_PORT_COMMAND,
2055
+ f'Failed to check ray cluster\'s healthiness.\n'
2056
+ '-- stdout --\n'
2057
+ f'{output}\n', stderr)
2055
2058
  return (*_count_healthy_nodes_from_ray(output), output, stderr)
2056
2059
 
2057
2060
  def run_ray_status_to_check_ray_cluster_healthy() -> bool:
@@ -2082,10 +2085,34 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
2082
2085
  try:
2083
2086
  ready_head, ready_workers, output, stderr = (
2084
2087
  get_node_counts_from_ray_status(head_runner))
2085
- except RuntimeError as e:
2088
+ except exceptions.CommandError as e:
2086
2089
  logger.debug(f'Refreshing status ({cluster_name!r}) attempt'
2087
2090
  f' {i}: {common_utils.format_exception(e)}')
2088
2091
  if cloud_name != 'kubernetes':
2092
+ # Non-k8s clusters can be manually restarted and:
2093
+ # 1. Get new IP addresses, or
2094
+ # 2. Not have the SkyPilot runtime setup
2095
+ #
2096
+ # So we should surface a message to the user to
2097
+ # help them recover from this inconsistent state.
2098
+ has_new_ip_addr = (
2099
+ e.detailed_reason is not None and
2100
+ _SSH_CONNECTION_TIMED_OUT_PATTERN.search(
2101
+ e.detailed_reason.strip()) is not None)
2102
+ runtime_not_setup = (_RAY_CLUSTER_NOT_FOUND_MESSAGE
2103
+ in e.error_msg)
2104
+ if has_new_ip_addr or runtime_not_setup:
2105
+ yellow = colorama.Fore.YELLOW
2106
+ bright = colorama.Style.BRIGHT
2107
+ reset = colorama.Style.RESET_ALL
2108
+ ux_utils.console_newline()
2109
+ logger.warning(
2110
+ f'{yellow}Failed getting cluster status despite all nodes '
2111
+ f'being up ({cluster_name!r}). '
2112
+ f'If the cluster was restarted manually, try running: '
2113
+ f'{reset}{bright}sky start {cluster_name}{reset} '
2114
+ f'{yellow}to recover from INIT status.{reset}')
2115
+ return False
2089
2116
  raise e
2090
2117
  # We retry for kubernetes because coreweave can have a
2091
2118
  # transient network issue.
sky/client/cli/command.py CHANGED
@@ -1611,7 +1611,7 @@ def _show_endpoint(query_clusters: Optional[List[str]],
1611
1611
  if endpoint:
1612
1612
  request_id = sdk.endpoints(cluster_record['name'], endpoint)
1613
1613
  cluster_endpoints = sdk.stream_and_get(request_id)
1614
- cluster_endpoint = cluster_endpoints.get(str(endpoint), None)
1614
+ cluster_endpoint = cluster_endpoints.get(endpoint, None)
1615
1615
  if not cluster_endpoint:
1616
1616
  raise click.Abort(f'Endpoint {endpoint} not found for cluster '
1617
1617
  f'{cluster_record["name"]!r}.')
@@ -6200,6 +6200,9 @@ def api_info():
6200
6200
  user = api_server_user
6201
6201
  else:
6202
6202
  user = models.User.get_current_user()
6203
+ # Print client version and commit.
6204
+ click.echo(f'SkyPilot client version: {sky.__version__}, '
6205
+ f'commit: {sky.__commit__}')
6203
6206
  click.echo(f'Using SkyPilot API server and dashboard: {url}\n'
6204
6207
  f'{ux_utils.INDENT_SYMBOL}Status: {api_server_info.status}, '
6205
6208
  f'commit: {api_server_info.commit}, '
sky/client/sdk.py CHANGED
@@ -16,7 +16,8 @@ import logging
16
16
  import os
17
17
  import subprocess
18
18
  import typing
19
- from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union
19
+ from typing import (Any, Dict, Iterator, List, Literal, Optional, Tuple,
20
+ TypeVar, Union)
20
21
  from urllib import parse as urlparse
21
22
 
22
23
  import click
@@ -794,17 +795,44 @@ def exec( # pylint: disable=redefined-builtin
794
795
  return server_common.get_request_id(response)
795
796
 
796
797
 
797
- # TODO(aylei): when retry logs request, there will be duplciated log entries.
798
+ @typing.overload
799
+ def tail_logs(
800
+ cluster_name: str,
801
+ job_id: Optional[int],
802
+ follow: bool,
803
+ tail: int = 0,
804
+ output_stream: Optional['io.TextIOBase'] = None,
805
+ *, # keyword only separator
806
+ preload_content: Literal[True] = True) -> int:
807
+ ...
808
+
809
+
810
+ @typing.overload
811
+ def tail_logs(cluster_name: str,
812
+ job_id: Optional[int],
813
+ follow: bool,
814
+ tail: int = 0,
815
+ output_stream: None = None,
816
+ *,
817
+ preload_content: Literal[False]) -> Iterator[Optional[str]]:
818
+ ...
819
+
820
+
821
+ # TODO(aylei): when retry logs request, there will be duplicated log entries.
798
822
  # We should fix this.
799
823
  @usage_lib.entrypoint
800
824
  @server_common.check_server_healthy_or_start
801
825
  @annotations.client_api
802
826
  @rest.retry_transient_errors()
803
- def tail_logs(cluster_name: str,
804
- job_id: Optional[int],
805
- follow: bool,
806
- tail: int = 0,
807
- output_stream: Optional['io.TextIOBase'] = None) -> int:
827
+ def tail_logs(
828
+ cluster_name: str,
829
+ job_id: Optional[int],
830
+ follow: bool,
831
+ tail: int = 0,
832
+ output_stream: Optional['io.TextIOBase'] = None,
833
+ *, # keyword only separator
834
+ preload_content: bool = True
835
+ ) -> Union[int, Iterator[Optional[str]]]:
808
836
  """Tails the logs of a job.
809
837
 
810
838
  Args:
@@ -814,12 +842,21 @@ def tail_logs(cluster_name: str,
814
842
  immediately.
815
843
  tail: if > 0, tail the last N lines of the logs.
816
844
  output_stream: the stream to write the logs to. If None, print to the
817
- console.
845
+ console. Cannot be used with preload_content=False.
846
+ preload_content: if False, returns an Iterator[str | None] containing
847
+ the logs without the function blocking on the retrieval of entire
848
+ log. Iterator returns None when the log has been completely
849
+ streamed. Default True. Cannot be used with output_stream.
818
850
 
819
851
  Returns:
820
- Exit code based on success or failure of the job. 0 if success,
821
- 100 if the job failed. See exceptions.JobExitCode for possible exit
822
- codes.
852
+ If preload_content is True:
853
+ Exit code based on success or failure of the job. 0 if success,
854
+ 100 if the job failed. See exceptions.JobExitCode for possible exit
855
+ codes.
856
+ If preload_content is False:
857
+ Iterator[str | None] containing the logs without the function
858
+ blocking on the retrieval of entire log. Iterator returns None
859
+ when the log has been completely streamed.
823
860
 
824
861
  Request Raises:
825
862
  ValueError: if arguments are invalid or the cluster is not supported.
@@ -832,6 +869,10 @@ def tail_logs(cluster_name: str,
832
869
  sky.exceptions.CloudUserIdentityError: if we fail to get the current
833
870
  user identity.
834
871
  """
872
+ if output_stream is not None and not preload_content:
873
+ raise ValueError(
874
+ 'output_stream cannot be specified when preload_content is False')
875
+
835
876
  body = payloads.ClusterJobBody(
836
877
  cluster_name=cluster_name,
837
878
  job_id=job_id,
@@ -847,12 +888,15 @@ def tail_logs(cluster_name: str,
847
888
  None))
848
889
  request_id: server_common.RequestId[int] = server_common.get_request_id(
849
890
  response)
850
- # Log request is idempotent when tail is 0, thus can resume previous
851
- # streaming point on retry.
852
- return stream_response(request_id=request_id,
853
- response=response,
854
- output_stream=output_stream,
855
- resumable=(tail == 0))
891
+ if preload_content:
892
+ # Log request is idempotent when tail is 0, thus can resume previous
893
+ # streaming point on retry.
894
+ return stream_response(request_id=request_id,
895
+ response=response,
896
+ output_stream=output_stream,
897
+ resumable=(tail == 0))
898
+ else:
899
+ return rich_utils.decode_rich_status(response)
856
900
 
857
901
 
858
902
  @usage_lib.entrypoint
@@ -1466,9 +1510,17 @@ def status(
1466
1510
  def endpoints(
1467
1511
  cluster: str,
1468
1512
  port: Optional[Union[int, str]] = None
1469
- ) -> server_common.RequestId[Dict[str, str]]:
1513
+ ) -> server_common.RequestId[Dict[int, str]]:
1470
1514
  """Gets the endpoint for a given cluster and port number (endpoint).
1471
1515
 
1516
+ Example:
1517
+ .. code-block:: python
1518
+
1519
+ import sky
1520
+ request_id = sky.endpoints('test-cluster')
1521
+ sky.get(request_id)
1522
+
1523
+
1472
1524
  Args:
1473
1525
  cluster: The name of the cluster.
1474
1526
  port: The port number to get the endpoint for. If None, endpoints
@@ -1478,8 +1530,9 @@ def endpoints(
1478
1530
  The request ID of the endpoints request.
1479
1531
 
1480
1532
  Request Returns:
1481
- A dictionary of port numbers to endpoints. If port is None,
1482
- the dictionary will contain all ports:endpoints exposed on the cluster.
1533
+ A dictionary of port numbers to endpoints.
1534
+ If port is None, the dictionary contains all
1535
+ ports:endpoints exposed on the cluster.
1483
1536
 
1484
1537
  Request Raises:
1485
1538
  ValueError: if the cluster is not UP or the endpoint is not exposed.
@@ -1944,6 +1997,7 @@ def stream_and_get(request_id: None = None,
1944
1997
  @usage_lib.entrypoint
1945
1998
  @server_common.check_server_healthy_or_start
1946
1999
  @annotations.client_api
2000
+ @rest.retry_transient_errors()
1947
2001
  def stream_and_get(
1948
2002
  request_id: Optional[server_common.RequestId[T]] = None,
1949
2003
  log_path: Optional[str] = None,
@@ -1995,7 +2049,7 @@ def stream_and_get(
1995
2049
  if response.status_code in [404, 400]:
1996
2050
  detail = response.json().get('detail')
1997
2051
  with ux_utils.print_exception_no_traceback():
1998
- raise RuntimeError(f'Failed to stream logs: {detail}')
2052
+ raise exceptions.ClientError(f'Failed to stream logs: {detail}')
1999
2053
  elif response.status_code != 200:
2000
2054
  # TODO(syang): handle the case where the requestID is not provided
2001
2055
  # see https://github.com/skypilot-org/skypilot/issues/6549
sky/client/sdk_async.py CHANGED
@@ -588,7 +588,7 @@ async def endpoints(
588
588
  cluster: str,
589
589
  port: Optional[Union[int, str]] = None,
590
590
  stream_logs: Optional[StreamConfig] = DEFAULT_STREAM_CONFIG
591
- ) -> Dict[str, str]:
591
+ ) -> Dict[int, str]:
592
592
  """Async version of endpoints() that gets the endpoint for a given cluster
593
593
  and port number."""
594
594
  request_id = await context_utils.to_thread(sdk.endpoints, cluster, port)
sky/clouds/nebius.py CHANGED
@@ -336,6 +336,7 @@ class Nebius(clouds.Cloud):
336
336
  acc_count,
337
337
  use_spot=resources.use_spot,
338
338
  cpus=resources.cpus,
339
+ memory=resources.memory,
339
340
  region=resources.region,
340
341
  zone=resources.zone,
341
342
  clouds='nebius')
sky/core.py CHANGED
@@ -259,7 +259,7 @@ all_clusters, unmanaged_clusters, all_jobs, context
259
259
 
260
260
 
261
261
  def endpoints(cluster: str,
262
- port: Optional[Union[int, str]] = None) -> Dict[str, str]:
262
+ port: Optional[Union[int, str]] = None) -> Dict[int, str]:
263
263
  """Gets the endpoint for a given cluster and port number (endpoint).
264
264
 
265
265
  Args:
@@ -267,7 +267,7 @@ def endpoints(cluster: str,
267
267
  port: The port number to get the endpoint for. If None, endpoints
268
268
  for all ports are returned..
269
269
 
270
- Returns: A dictionary of port numbers to endpoints. If endpoint is None,
270
+ Returns: A dictionary of port numbers to endpoints. If port is None,
271
271
  the dictionary will contain all ports:endpoints exposed on the cluster.
272
272
 
273
273
  Raises:
@@ -279,9 +279,7 @@ def endpoints(cluster: str,
279
279
  ux_utils.spinner_message(
280
280
  f'Fetching endpoints for cluster {cluster}')):
281
281
  result = backend_utils.get_endpoints(cluster=cluster, port=port)
282
- # Convert int keys to str keys.
283
- # In JSON serialization, each key must be a string.
284
- return {str(k): v for k, v in result.items()}
282
+ return result
285
283
 
286
284
 
287
285
  @usage_lib.entrypoint
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_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":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_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":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-06afb50d25f7c61f.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_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":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-06afb50d25f7c61f.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_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":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/4676-9da7fdbde90b5549.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-049014c6d43d127b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/9037-89a84fd7fa31362d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-a0527109c2fab467.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/4676-9da7fdbde90b5549.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-049014c6d43d127b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/9037-89a84fd7fa31362d.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-a0527109c2fab467.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-469814d711d63b1b.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-469814d711d63b1b.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-81351f95f3bec08e.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-81351f95f3bec08e.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-c320641c2bcbbea6.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-c320641c2bcbbea6.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dd64309c3fe67ed2.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/754-d0da8ab45f9509e9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-07349868f7905d37.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-7421e63ac35f8fce.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-7421e63ac35f8fce.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-018bf31cda52e11b.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-018bf31cda52e11b.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-739726d6b823f532.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-739726d6b823f532.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7205-88191679e7988c57.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-943efc7aff0f0c06.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-de06e613e20bc977.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7205-88191679e7988c57.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-4a6f1a928fb6d370.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-08b2a1cae076a943.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-8afcf719ea87debc.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-6c9c09593b1e67b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-943efc7aff0f0c06.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-de06e613e20bc977.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-be35b22e2046564c.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"wN25tc2rkvOkO-qkzIhcD","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/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-6e76f636a048e145.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-be35b22e2046564c.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"UQeqZCi6L_itwVPDcn3ba","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/exceptions.py CHANGED
@@ -661,3 +661,11 @@ class RequestInterruptedError(Exception):
661
661
  class SkyletInternalError(Exception):
662
662
  """Raised when a Skylet internal error occurs."""
663
663
  pass
664
+
665
+
666
+ class ClientError(Exception):
667
+ """Raised when a there is a client error occurs.
668
+
669
+ If a request encounters a ClientError, it will not be retried to the server.
670
+ """
671
+ pass
sky/jobs/utils.py CHANGED
@@ -1494,7 +1494,7 @@ def format_job_table(
1494
1494
  'JOB DURATION',
1495
1495
  '#RECOVERIES',
1496
1496
  'STATUS',
1497
- 'WORKER_POOL',
1497
+ 'POOL',
1498
1498
  ]
1499
1499
  if show_all:
1500
1500
  # TODO: move SCHED. STATE to a separate flag (e.g. --debug)
@@ -1597,6 +1597,10 @@ def format_job_table(
1597
1597
 
1598
1598
  user_values = get_user_column_values(job_tasks[0])
1599
1599
 
1600
+ pool = job_tasks[0].get('pool')
1601
+ if pool is None:
1602
+ pool = '-'
1603
+
1600
1604
  job_id = job_hash[1] if tasks_have_k8s_user else job_hash
1601
1605
  job_values = [
1602
1606
  job_id,
@@ -1610,7 +1614,7 @@ def format_job_table(
1610
1614
  job_duration,
1611
1615
  recovery_cnt,
1612
1616
  status_str,
1613
- job_tasks[0].get('pool', '-'),
1617
+ pool,
1614
1618
  ]
1615
1619
  if show_all:
1616
1620
  details = job_tasks[current_task_id].get('details')
@@ -1637,6 +1641,9 @@ def format_job_table(
1637
1641
  submitted = log_utils.readable_time_duration(task['submitted_at'])
1638
1642
  user_values = get_user_column_values(task)
1639
1643
  task_workspace = '-' if len(job_tasks) > 1 else workspace
1644
+ pool = task.get('pool')
1645
+ if pool is None:
1646
+ pool = '-'
1640
1647
  values = [
1641
1648
  task['job_id'] if len(job_tasks) == 1 else ' \u21B3',
1642
1649
  task['task_id'] if len(job_tasks) > 1 else '-',
@@ -1653,7 +1660,7 @@ def format_job_table(
1653
1660
  job_duration,
1654
1661
  task['recovery_count'],
1655
1662
  task['status'].colored_str(),
1656
- task.get('pool', '-'),
1663
+ pool,
1657
1664
  ]
1658
1665
  if show_all:
1659
1666
  # schedule_state is only set at the job level, so if we have
sky/optimizer.py CHANGED
@@ -1262,12 +1262,13 @@ def _check_specified_clouds(dag: 'dag_lib.Dag') -> None:
1262
1262
 
1263
1263
 
1264
1264
  def _check_specified_regions(task: task_lib.Task) -> None:
1265
- """Check if specified regions (Kubernetes contexts) are enabled.
1265
+ """Check if specified regions (Kubernetes/SSH contexts) are enabled.
1266
1266
 
1267
1267
  Args:
1268
1268
  task: The task to check.
1269
1269
  """
1270
- # Only check for Kubernetes now
1270
+ # Only check for Kubernetes/SSH for now
1271
+ # Below check works because SSH inherits Kubernetes cloud.
1271
1272
  if not all(
1272
1273
  isinstance(resources.cloud, clouds.Kubernetes)
1273
1274
  for resources in task.resources):
@@ -1276,12 +1277,21 @@ def _check_specified_regions(task: task_lib.Task) -> None:
1276
1277
  for resources in task.resources:
1277
1278
  if resources.region is None:
1278
1279
  continue
1279
- existing_contexts = clouds.Kubernetes.existing_allowed_contexts()
1280
+
1281
+ is_ssh = isinstance(resources.cloud, clouds.SSH)
1282
+ if is_ssh:
1283
+ existing_contexts = clouds.SSH.existing_allowed_contexts()
1284
+ else:
1285
+ existing_contexts = clouds.Kubernetes.existing_allowed_contexts()
1286
+
1280
1287
  region = resources.region
1281
1288
  task_name = f' {task.name!r}' if task.name is not None else ''
1282
1289
  msg = f'Task{task_name} requires '
1283
1290
  if region not in existing_contexts:
1284
- infra_str = f'Kubernetes/{region}'
1291
+ if is_ssh:
1292
+ infra_str = f'SSH/{region.lstrip("ssh-")}'
1293
+ else:
1294
+ infra_str = f'Kubernetes/{region}'
1285
1295
  logger.warning(f'{infra_str} is not enabled.')
1286
1296
  volume_mounts_str = ''
1287
1297
  if task.volume_mounts:
@@ -797,15 +797,18 @@ def _create_pods(region: str, cluster_name_on_cloud: str,
797
797
  'For more details, refer to https://docs.skypilot.co/en/latest/reference/config.html') # pylint: disable=line-too-long
798
798
 
799
799
  needs_gpus = False
800
+ needs_gpus_nvidia = False
800
801
  limits = pod_spec['spec']['containers'][0].get('resources',
801
802
  {}).get('limits')
802
803
  if limits is not None:
803
804
  needs_gpus = limits.get(kubernetes_utils.get_gpu_resource_key(context),
804
805
  0) > 0
806
+ needs_gpus_nvidia = limits.get(
807
+ kubernetes_utils.SUPPORTED_GPU_RESOURCE_KEYS['nvidia'], 0) > 0
805
808
 
806
809
  # TPU pods provisioned on GKE use the default containerd runtime.
807
810
  # Reference: https://cloud.google.com/kubernetes-engine/docs/how-to/migrate-containerd#overview # pylint: disable=line-too-long
808
- if nvidia_runtime_exists and needs_gpus:
811
+ if nvidia_runtime_exists and needs_gpus_nvidia:
809
812
  pod_spec['spec']['runtimeClassName'] = 'nvidia'
810
813
 
811
814
  logger.debug(f'run_instances: calling create_namespaced_pod '
@@ -427,9 +427,9 @@ async def execute_request_coroutine(request: api_requests.Request):
427
427
  event loop. This is designed for executing tasks that are not CPU
428
428
  intensive, e.g. sky logs.
429
429
  """
430
+ context.initialize()
430
431
  ctx = context.get()
431
- if ctx is None:
432
- raise ValueError('Context is not initialized')
432
+ assert ctx is not None, 'Context is not initialized'
433
433
  logger.info(f'Executing request {request.request_id} in coroutine')
434
434
  func = request.entrypoint
435
435
  request_body = request.request_body
@@ -60,6 +60,8 @@ def decode_status(
60
60
  cluster['status'] = status_lib.ClusterStatus(cluster['status'])
61
61
  cluster['storage_mounts_metadata'] = decode_and_unpickle(
62
62
  cluster['storage_mounts_metadata'])
63
+ if 'is_managed' not in cluster:
64
+ cluster['is_managed'] = False
63
65
  response.append(responses.StatusResponse.model_validate(cluster))
64
66
  return response
65
67
 
@@ -203,3 +205,8 @@ def decode_job_status(
203
205
  def decode_kubernetes_node_info(
204
206
  return_value: Dict[str, Any]) -> models.KubernetesNodesInfo:
205
207
  return models.KubernetesNodesInfo.from_dict(return_value)
208
+
209
+
210
+ @register_decoders('endpoints')
211
+ def decode_endpoints(return_value: Dict[int, str]) -> Dict[int, str]:
212
+ return {int(k): v for k, v in return_value.items()}
@@ -209,3 +209,8 @@ def encode_job_status(return_value: Dict[int, Any]) -> Dict[int, str]:
209
209
  def encode_kubernetes_node_info(
210
210
  return_value: 'models.KubernetesNodesInfo') -> Dict[str, Any]:
211
211
  return return_value.to_dict()
212
+
213
+
214
+ @register_encoder('endpoints')
215
+ def encode_endpoints(return_value: Dict[int, str]) -> Dict[str, str]:
216
+ return {str(k): v for k, v in return_value.items()}
sky/server/rest.py CHANGED
@@ -34,6 +34,16 @@ F = TypeVar('F', bound=Callable[..., Any])
34
34
  _RETRY_CONTEXT = contextvars.ContextVar('retry_context', default=None)
35
35
 
36
36
  _session = requests.Session()
37
+ # Tune connection pool size, otherwise the default max is just 10.
38
+ adapter = requests.adapters.HTTPAdapter(
39
+ pool_connections=50,
40
+ pool_maxsize=200,
41
+ # We handle retries by ourselves in SDK.
42
+ max_retries=0,
43
+ )
44
+ _session.mount('http://', adapter)
45
+ _session.mount('https://', adapter)
46
+
37
47
  _session.headers[constants.API_VERSION_HEADER] = str(constants.API_VERSION)
38
48
  _session.headers[constants.VERSION_HEADER] = (
39
49
  versions.get_local_readable_version())
@@ -47,9 +57,10 @@ class RetryContext:
47
57
 
48
58
  @contextlib.contextmanager
49
59
  def _retry_in_context():
50
- token = _RETRY_CONTEXT.set(RetryContext())
60
+ context = RetryContext()
61
+ token = _RETRY_CONTEXT.set(context)
51
62
  try:
52
- yield
63
+ yield context
53
64
  finally:
54
65
  _RETRY_CONTEXT.reset(token)
55
66
 
@@ -76,6 +87,8 @@ def retry_transient_errors(max_retries: int = 3,
76
87
  if isinstance(e, requests.exceptions.HTTPError):
77
88
  # Only server error is considered as transient.
78
89
  return e.response.status_code >= 500
90
+ if isinstance(e, exceptions.ClientError):
91
+ return False
79
92
  # It is hard to enumerate all other errors that are transient, e.g.
80
93
  # broken pipe, connection refused, etc. Instead, it is safer to assume
81
94
  # all other errors might be transient since we only retry for 3 times
@@ -88,26 +101,53 @@ def retry_transient_errors(max_retries: int = 3,
88
101
  @functools.wraps(func)
89
102
  def wrapper(*args, **kwargs):
90
103
  backoff = common_utils.Backoff(initial_backoff, max_backoff_factor)
91
- with _retry_in_context():
92
- for retry_cnt in range(max_retries):
104
+ consecutive_failed_count = 0
105
+
106
+ with _retry_in_context() as context:
107
+ previous_line_processed = context.line_processed # should be 0
108
+
109
+ def _handle_exception():
110
+ # If the function made progress on a retry,
111
+ # clears the backoff and resets the failed retry count.
112
+ # Otherwise, increments the failed retry count.
113
+ nonlocal backoff
114
+ nonlocal consecutive_failed_count
115
+ nonlocal previous_line_processed
116
+ if context.line_processed > previous_line_processed:
117
+ backoff = common_utils.Backoff(initial_backoff,
118
+ max_backoff_factor)
119
+ previous_line_processed = context.line_processed
120
+ consecutive_failed_count = 0
121
+ else:
122
+ consecutive_failed_count += 1
123
+
124
+ while consecutive_failed_count < max_retries:
93
125
  try:
94
126
  return func(*args, **kwargs)
95
127
  # Occurs when the server proactively interrupts the request
96
128
  # during rolling update, we can retry immediately on the
97
129
  # new replica.
98
130
  except exceptions.RequestInterruptedError:
131
+ _handle_exception()
99
132
  logger.debug('Request interrupted. Retry immediately.')
100
133
  continue
101
134
  except Exception as e: # pylint: disable=broad-except
102
- if retry_cnt >= max_retries - 1:
135
+ _handle_exception()
136
+ if consecutive_failed_count >= max_retries:
103
137
  # Retries exhausted.
104
138
  raise
105
139
  if not is_transient_error(e):
106
140
  # Permanent error, no need to retry.
107
141
  raise
108
- logger.debug(f'Retry {func.__name__} due to {e}, '
109
- f'attempt {retry_cnt + 1}/{max_retries}')
110
- time.sleep(backoff.current_backoff())
142
+ logger.debug(
143
+ f'Retry {func.__name__} due to {e}, '
144
+ f'attempt {consecutive_failed_count}/{max_retries}')
145
+ # Only sleep if this is not the first retry.
146
+ # The idea is that if the function made progress on a
147
+ # retry, we should try again immediately to reduce the
148
+ # waiting time.
149
+ if consecutive_failed_count > 0:
150
+ time.sleep(backoff.current_backoff())
111
151
 
112
152
  return cast(F, wrapper)
113
153
 
sky/server/server.py CHANGED
@@ -1185,10 +1185,6 @@ async def logs(
1185
1185
  # TODO(zhwu): This should wait for the request on the cluster, e.g., async
1186
1186
  # launch, to finish, so that a user does not need to manually pull the
1187
1187
  # request status.
1188
- # Only initialize the context in logs handler to limit the scope of this
1189
- # experimental change.
1190
- # TODO(aylei): init in lifespan() to enable SkyPilot context in all APIs.
1191
- context.initialize()
1192
1188
  request_task = executor.prepare_request(
1193
1189
  request_id=request.state.request_id,
1194
1190
  request_name='logs',
@@ -1198,8 +1194,14 @@ async def logs(
1198
1194
  )
1199
1195
  task = asyncio.create_task(executor.execute_request_coroutine(request_task))
1200
1196
 
1201
- def cancel_task():
1202
- task.cancel()
1197
+ async def cancel_task():
1198
+ try:
1199
+ logger.info('Client disconnected for request: '
1200
+ f'{request.state.request_id}')
1201
+ task.cancel()
1202
+ await task
1203
+ except asyncio.CancelledError:
1204
+ pass
1203
1205
 
1204
1206
  # Cancel the task after the request is done or client disconnects
1205
1207
  background_tasks.add_task(cancel_task)
sky/users/permission.py CHANGED
@@ -68,7 +68,7 @@ class PermissionService:
68
68
  username.encode()).hexdigest()[:common_utils.USER_HASH_LENGTH]
69
69
  user_info = global_user_state.get_user(user_hash)
70
70
  if user_info:
71
- logger.info(f'Basic auth user {username} already exists')
71
+ logger.debug(f'Basic auth user {username} already exists')
72
72
  return
73
73
  global_user_state.add_or_update_user(
74
74
  models.User(id=user_hash, name=username, password=password))
@@ -169,8 +169,6 @@ class PermissionService:
169
169
  """
170
170
  user_roles = self.enforcer.get_roles_for_user(user_id)
171
171
  if not user_roles:
172
- logger.info(f'User {user_id} has no roles, adding'
173
- f' default role {rbac.get_default_role()}')
174
172
  self.enforcer.add_grouping_policy(user_id, rbac.get_default_role())
175
173
  return True
176
174
  return False
@@ -184,7 +182,7 @@ class PermissionService:
184
182
  # Avoid calling get_user_roles, as it will require the lock.
185
183
  current_roles = self.enforcer.get_roles_for_user(user_id)
186
184
  if not current_roles:
187
- logger.warning(f'User {user_id} has no roles')
185
+ logger.debug(f'User {user_id} has no roles')
188
186
  return
189
187
  self.enforcer.remove_grouping_policy(user_id, current_roles[0])
190
188
  self.enforcer.save_policy()
@@ -198,12 +196,12 @@ class PermissionService:
198
196
  # Avoid calling get_user_roles, as it will require the lock.
199
197
  current_roles = self.enforcer.get_roles_for_user(user_id)
200
198
  if not current_roles:
201
- logger.warning(f'User {user_id} has no roles')
199
+ logger.debug(f'User {user_id} has no roles')
202
200
  else:
203
201
  # TODO(hailong): how to handle multiple roles?
204
202
  current_role = current_roles[0]
205
203
  if current_role == new_role:
206
- logger.info(f'User {user_id} already has role {new_role}')
204
+ logger.debug(f'User {user_id} already has role {new_role}')
207
205
  return
208
206
  self.enforcer.remove_grouping_policy(user_id, current_role)
209
207
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250821
3
+ Version: 1.0.0.dev20250823
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -253,12 +253,12 @@ Dynamic: summary
253
253
 
254
254
  ----
255
255
 
256
- SkyPilot is a system for running, managing, and scaling AI workloads on any AI infrastructure.
256
+ SkyPilot is a system to run, manage, and scale AI workloads on any AI infrastructure.
257
257
 
258
258
  SkyPilot gives **AI teams** a simple interface to run jobs on any infra.
259
259
  **Infra teams** get a unified control plane to manage any AI compute — with advanced scheduling, scaling, and orchestration.
260
260
 
261
- ![](./docs/source/images/skypilot-abstractions-long-2.png)
261
+ <img src="./docs/source/images/skypilot-abstractions-long-2.png" alt="SkyPilot Abstractions">
262
262
 
263
263
  ## Overview
264
264
 
@@ -1,16 +1,16 @@
1
- sky/__init__.py,sha256=ueD01v52YcUcIk7KZm0GYiBUHc5LGsIpzn7y4et7CMU,6615
1
+ sky/__init__.py,sha256=BwfFLYrGz9-n2GftMuLARfdizYy8-vvQj0fqK3_ZK5I,6615
2
2
  sky/admin_policy.py,sha256=BeSowGnWfDj58ALiNf3cc2N4gMQWzjO6aXnX7vaqYhk,9782
3
3
  sky/authentication.py,sha256=V7zGSV7bqcAKC_EGOOS0KhJ01ZFLnme0WnjLFO7zavs,25603
4
4
  sky/check.py,sha256=Z7D6txaOAEL7fyEQ8q-Zxk1aWaHpEcl412Rj2mThbQ0,31025
5
5
  sky/cli.py,sha256=VXIZryeTtJPYpPTBKymVPmuOCyh8knfWrq-qnkr6R-4,178
6
6
  sky/cloud_stores.py,sha256=Ln5GBpel-sEs7rVx7bBrMkfLwA_bctI05Rox2uoz7Lo,26388
7
- sky/core.py,sha256=TmgehnTSJhQYPvGfQfS10FWGl-jsCFioRgg7Uso6b68,57597
7
+ sky/core.py,sha256=w6v_T5BNynOgUCc8_85U61wRlxLuF91n0fe0aC6ZqPc,57461
8
8
  sky/dag.py,sha256=0ZpAEDXuIFo1SP7YJpF9vXiFxpRwqP8od-UXMg95td8,3929
9
- sky/exceptions.py,sha256=j9bYAH9VmvifRdQzd0_T9RmPWePL2wsTPyC6gcvYh4Q,19814
9
+ sky/exceptions.py,sha256=Ya-JUKByxUGmG03vX0A4laF7VWGUyj9pNxwkn603GUI,19998
10
10
  sky/execution.py,sha256=v1JNAjjQC1iOXjG8eba-zrMDVGrjZjx7Ys4f4ExwQp0,34674
11
11
  sky/global_user_state.py,sha256=-s-bJUxpEsUcdCT_U8r7mcb965Z44iUyNRNY27TpZs4,81455
12
12
  sky/models.py,sha256=C5vuymhZtQHxtzE7sM63VV-dKJ8Zo7U7cQWCZKb9q10,3196
13
- sky/optimizer.py,sha256=rcH6CVix1PJWWSwe1XWItfsmG8igwbKtRE5QVWRlpR4,63804
13
+ sky/optimizer.py,sha256=iR57bL_8BeG6bh1sH3J6n6i65EBFjmyftezYM4nnDZA,64150
14
14
  sky/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  sky/resources.py,sha256=TY-JVOOBexmLEbUj_8tYU8O_F9jKDpFkexcGUjl0XJk,107313
16
16
  sky/sky_logging.py,sha256=aFcwYKKlZG28q-bEsVzvmBEZ1WqHMMp1SwRGONLopDI,8512
@@ -35,7 +35,7 @@ sky/adaptors/vast.py,sha256=tpvmHi7IkQNzbbHVkeo04kUSajoEpSzXr2XgeO_I1LU,695
35
35
  sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
36
36
  sky/backends/__init__.py,sha256=tpa9gAygQopsiBUUuy3wVmr4E05FoPTFHIWqEo4i-u0,627
37
37
  sky/backends/backend.py,sha256=DcZZYgBvhghjLnD1C2TvgAisPpcqT0oYNJ3p_P-0UT4,8098
38
- sky/backends/backend_utils.py,sha256=gaWoIBnz-R0vzQfbrBIt0ktuY1YyQu8wb6jVMJiJaiY,156272
38
+ sky/backends/backend_utils.py,sha256=TTwnjhW7hVNnrVQe8dyVxHssSxL-_4mZiT-qaFQgur8,157967
39
39
  sky/backends/cloud_vm_ray_backend.py,sha256=X-FJiOX82-Z8Ut2zX7T6u3T9rN4gxD7huwqrjriIVI8,275131
40
40
  sky/backends/docker_utils.py,sha256=_EhM6NStZDAwcegppQqExaB5iuSn1qL4xFFUqXAz2Uk,8392
41
41
  sky/backends/local_docker_backend.py,sha256=i_Ff6MUNiIJKknTJw0YtQcvDlba2F7f44lx_eZKfP40,17409
@@ -78,11 +78,11 @@ sky/catalog/data_fetchers/fetch_vsphere.py,sha256=Yf7tKzwJsQ_4f64IT1EAP108C1D3Rg
78
78
  sky/client/__init__.py,sha256=pz6xvVSd9X-gwqbsDL0E9QOojYqM0KAD0j-NCyCIF1k,38
79
79
  sky/client/common.py,sha256=_sX88X8weo81sA2SFTaLuapSy4qzBz3KEtsf4kLTa80,15627
80
80
  sky/client/oauth.py,sha256=sNJ_DMsSTcxluj5FeNQ2IafZJLImRFmCAZ79bXeABn4,2871
81
- sky/client/sdk.py,sha256=vjf9JgBGJqxdUTxiNhoS5c15iRS09xpxhAlO9RwYqBU,102103
82
- sky/client/sdk_async.py,sha256=ZIcKzER6SAoVmK9Q2hQqKrmLEYWLLIzQnNgTBQlko5s,30425
81
+ sky/client/sdk.py,sha256=5KXbjRwgpQSQMUgbfTq-FEEhB3znySZ4RFhxpG62qDg,103905
82
+ sky/client/sdk_async.py,sha256=afuo3niHbLnSlvphiTWYtoKKkpzdOzzgWIkuwppAEao,30425
83
83
  sky/client/service_account_auth.py,sha256=5jXk0G6ufuW-SHCO7BEHQeTO0_2a8KfFmA63auXFRj4,1529
84
84
  sky/client/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- sky/client/cli/command.py,sha256=NOt6rOOkcvgjfa1XlAAMlzOjqslBN3r40vOz4OZNSlk,246736
85
+ sky/client/cli/command.py,sha256=n9Ri4IGzoPiQ6mFB_z7_-QHMjAWaNF6b3oNrJQPCaxw,246877
86
86
  sky/client/cli/deprecation_utils.py,sha256=H_d5UyF2CekEoThduAzt5cihBO8hwKYMu0-Wqfbjv5E,3370
87
87
  sky/client/cli/flags.py,sha256=lLXHooU4HEslbHJuGAiCrKYkJZx99hAKaJbstw7s1bc,12136
88
88
  sky/client/cli/git.py,sha256=dqSaJI1Ndv6RfKJa6HT6ednXr0j_pVlwSdh3XiQzB60,22018
@@ -98,7 +98,7 @@ sky/clouds/hyperbolic.py,sha256=bmV4NFpUPgzR0ownavHHVqyw26EtOgQ_ZB6SlxlgmJw,1199
98
98
  sky/clouds/ibm.py,sha256=qMbOkTMJzPn2HDH9cie9zERvukRZbZoueLIaufCECAw,22860
99
99
  sky/clouds/kubernetes.py,sha256=G_U7G04pJYU8xnvIP-48d4umKUbLGHc-5Vv1EHLbfF8,55446
100
100
  sky/clouds/lambda_cloud.py,sha256=aRW4GwLjaFFR6_bPbBr9o8z-SKHtuP18BAVwoPuDtBE,13553
101
- sky/clouds/nebius.py,sha256=rmWseRh7kmKGz7OavPm1aa05LDn8TF2fgZJfnqIqgzk,21310
101
+ sky/clouds/nebius.py,sha256=2CWWZsPJOSttYdyV4vlL5n2UqPmyJ2E9WAD_6s4_WC4,21348
102
102
  sky/clouds/oci.py,sha256=U5wtBx78RqCgCAqjlTTgSnRqWWa7D7LIvyoo8097Fno,28571
103
103
  sky/clouds/paperspace.py,sha256=-wvFUsUGaOlFYfe3jCdEB3_mwDmK4R66hJy8nX9822o,12010
104
104
  sky/clouds/runpod.py,sha256=6ziQZj1YS6QBT4ilYlg8Dg0w_AT1yL9hnvvl4mMssHg,13386
@@ -112,17 +112,19 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
112
112
  sky/clouds/utils/gcp_utils.py,sha256=09MF4Vx0EW7S-GXGpyxpl2aQlHrqeu9ioV0nyionAyk,9890
113
113
  sky/clouds/utils/oci_utils.py,sha256=TFqAqRLggg4Z0bhxrrq8nouSSomZy-ub1frHXEkud2M,7302
114
114
  sky/clouds/utils/scp_utils.py,sha256=VGuccVO5uFGr8-yolWSoYrgr11z6cIeDBGcqkBzAyOs,18409
115
- sky/dashboard/out/404.html,sha256=-hELfCLLcuSFx7o__q0YfAIoRF5PecsV19savabHJNY,1423
116
- sky/dashboard/out/clusters.html,sha256=s396ja86G1uR0-qcM0P5gzW37DRJwL5KzRXoUKoJRKM,1418
117
- sky/dashboard/out/config.html,sha256=nJPMD_1qievBhgcndW11q6ZswoXYpNZ_mfabNuVEwCI,1414
115
+ sky/dashboard/out/404.html,sha256=VU_KZz5OIw7leUmoss_lNfoHJEsfiNrIjNCzcQKGy0g,1423
116
+ sky/dashboard/out/clusters.html,sha256=nHqi0MlDKnZfbOZpmIcrg-bU7D_lbbFieY8IeJN4bpQ,1418
117
+ sky/dashboard/out/config.html,sha256=iOQgxHEa64juO_zt85_Utg4ze1gEMAD2XnUabCKn3as,1414
118
118
  sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
119
- sky/dashboard/out/index.html,sha256=sMJ3lK1KD8BMoeYfo_RcCDmngD4kUCCewyUkOmlIBVA,1407
120
- sky/dashboard/out/infra.html,sha256=X6Zty-z8IZ8uIeQwLqITvVsxEvhC_Koy6zihjPMM3Bg,1412
121
- sky/dashboard/out/jobs.html,sha256=IKDcyn2DYJeTlHvNZrNKQXOvpGnuJ1sf-ZVlV5ScCsA,1410
119
+ sky/dashboard/out/index.html,sha256=yqT1xuDX1otLbQt38aHKlsDS7e6dMs2mPGx7QrlhoPk,1407
120
+ sky/dashboard/out/infra.html,sha256=oAIWKfbPvfj90C2ut4g4M15cs_4RFsZg0IfxP2ggh5s,1412
121
+ sky/dashboard/out/jobs.html,sha256=WbydGtptBv6NNKJhkP8VpfqPpBopBvvhYNFt6a3MEUw,1410
122
122
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
123
- sky/dashboard/out/users.html,sha256=ZnRLmiPjCtlxKshkN4HFQ3REGd4tn2uIxjdmMr6nkdo,1412
124
- sky/dashboard/out/volumes.html,sha256=r3ed1FyZ9xxzrTPRuYa9Y6ujVpaPIEp7ta4OXeQRc7k,1416
125
- sky/dashboard/out/workspaces.html,sha256=8DSLzMZi9sE6559JFxuS7KQ0db8XQXkcHmnHOHMg4Ds,1422
123
+ sky/dashboard/out/users.html,sha256=yaBOpOlBQhBvgInM_VXLWTrWKAdH91Xt0kSCr9olUZY,1412
124
+ sky/dashboard/out/volumes.html,sha256=_rMiIdi161brkEbmJtybh_rTb8MsqI--9mj3X5dg58w,1416
125
+ sky/dashboard/out/workspaces.html,sha256=kwtmrpc0uOaZnNK-yyK3-cKvAUV0RfHlysFUlon7WvM,1422
126
+ sky/dashboard/out/_next/static/UQeqZCi6L_itwVPDcn3ba/_buildManifest.js,sha256=osxUordT3Fb32OsAF270nSx4GMgfsKF6Vc8OBBxtPgk,2428
127
+ sky/dashboard/out/_next/static/UQeqZCi6L_itwVPDcn3ba/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
126
128
  sky/dashboard/out/_next/static/chunks/1121-8afcf719ea87debc.js,sha256=fLXxFyYpxIIH-GAL9X9Ew3rc2f6zqOZqg6TjrapDZUM,8554
127
129
  sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js,sha256=tUOoU0nIEShZeD5pBiOWrl8-czHc6PpnxxJilnDplHM,17330
128
130
  sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js,sha256=VJ6y-Z6Eg2T93hQIRfWAbjAkQ7nQhglmIaVbEpKSILY,38451
@@ -177,16 +179,14 @@ sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.j
177
179
  sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js,sha256=83s5N5CZwIaRcmYMfqn2we60n2VRmgFw6Tbx18b8-e0,762
178
180
  sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-de06e613e20bc977.js,sha256=8d4XLtF8E3ahNnsbdNUQkJVbM1b9sIG9wRaoRjRwMhE,1495
179
181
  sky/dashboard/out/_next/static/css/4614e06482d7309e.css,sha256=nk6GriyGVd1aGXrLd7BcMibnN4v0z-Q_mXGxrHFWqrE,56126
180
- sky/dashboard/out/_next/static/wN25tc2rkvOkO-qkzIhcD/_buildManifest.js,sha256=osxUordT3Fb32OsAF270nSx4GMgfsKF6Vc8OBBxtPgk,2428
181
- sky/dashboard/out/_next/static/wN25tc2rkvOkO-qkzIhcD/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
182
- sky/dashboard/out/clusters/[cluster].html,sha256=iVENQ7BQVWQv3cbGqKeyrhmMcYFF-NOtCsXSPKfaLto,2936
183
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=FH2wDhw6sQkmTkEnCXMsCZZiCmjkpVnUNjtcOlodCj0,2073
184
- sky/dashboard/out/infra/[context].html,sha256=N9GD2b8COYVfx21rt6KJCUvNSlTIvURC9FfK-qBypEQ,1436
185
- sky/dashboard/out/jobs/[job].html,sha256=L7UjpbYhk7c5URohFsEqusd6PSgXOxxDufr5r9P4_ak,2304
186
- sky/dashboard/out/jobs/pools/[pool].html,sha256=VlS6EJXuH6HbE4boK7VSz6ngyKYQldIkxpIj8XvaQzg,2142
182
+ sky/dashboard/out/clusters/[cluster].html,sha256=c1rBhrN22oIja-YSb1d6PUvm7xaaHilO2PeAdOUUo94,2936
183
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=-aNwxL4-gTZcGn8emPiLsAB5U-3OyjXKhT6shV8dHK0,2073
184
+ sky/dashboard/out/infra/[context].html,sha256=m0bpCX5ian0OXD8sPh5rLFSvYhGZIN82tXFxZOjgf0Y,1436
185
+ sky/dashboard/out/jobs/[job].html,sha256=usSo_E_5QXWDaCRqULXLkti6Kk4sbH8n-j48Osi4p8U,2304
186
+ sky/dashboard/out/jobs/pools/[pool].html,sha256=bPSPpVw8meyHW6BOnW2GKjxROxaLN91YhO_9xQq4SZ4,2142
187
187
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
188
- sky/dashboard/out/workspace/new.html,sha256=501TvfqebnOxCAj2s-VWfNwcbVeovXJiju_UychtN7g,1428
189
- sky/dashboard/out/workspaces/[name].html,sha256=MLuZoBOHYSMszSTTFHO4u9ZOy2y0aUkji6f0ka3useU,2759
188
+ sky/dashboard/out/workspace/new.html,sha256=cZ1MQzT0HkMbEULkjtyx-mL9utFXqXU9E8PNUONxqDA,1428
189
+ sky/dashboard/out/workspaces/[name].html,sha256=mpjCuSB6Jw7ui6-P2apmIzPcyrSaXhgfV2iikVX20wU,2759
190
190
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
191
191
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
192
192
  sky/data/data_utils.py,sha256=AjEA_JRjo9NBMlv-Lq5iV4lBED_YZ1VqBR9pG6fGVWE,35179
@@ -199,7 +199,7 @@ sky/jobs/controller.py,sha256=e6a5-AnknM3IVslXtKFs70FQwxe5p1WiZm4mOgo7pmY,38671
199
199
  sky/jobs/recovery_strategy.py,sha256=6DcrbFLeNj322WI7-ldBoxiIMTJAHku4uIuzrgf3NhQ,31276
200
200
  sky/jobs/scheduler.py,sha256=iBcMy0SS60QxvwK93HAziFErt66t_66CckFP6i7pJDU,15265
201
201
  sky/jobs/state.py,sha256=eDlI8eB2RGR-B1UDYRfcBsAJOp_K9DZOl91tkUEYcAc,67404
202
- sky/jobs/utils.py,sha256=xlq0oftp7ZqSGvijyGOac45B9K6tsZhdlAGwg_lm720,85546
202
+ sky/jobs/utils.py,sha256=1FLCcD-RHyA9xZdHmZO2mlb-NVpMiyQ85oETx0wbApc,85690
203
203
  sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
204
204
  sky/jobs/client/sdk.py,sha256=MqaI2sotaQQWBFzawB5tnWNX_OcMLiO-Dsi5zcc8IeU,16405
205
205
  sky/jobs/client/sdk_async.py,sha256=qOI5TB5FDdX36R9rZ1lL9ouzQtJ6qnZxuK9uoKF86oU,4791
@@ -258,7 +258,7 @@ sky/provision/hyperbolic/utils.py,sha256=NCa3ULvIi64-YHYoOnPd3SShlJ6VuQsEwaTBqHF
258
258
  sky/provision/kubernetes/__init__.py,sha256=xzVA9OCga0pCdUAQ7zZiCZMdq-Y0182oHlIKWESA15A,896
259
259
  sky/provision/kubernetes/config.py,sha256=iuKFZdivSaEOZf6PWz3JLju3bqyIuO58jTb9fFUn8nE,29632
260
260
  sky/provision/kubernetes/constants.py,sha256=vZJQsAVjAgwsOskB48tIFSXtNw7IFnJOQE_H6N-vOYQ,1130
261
- sky/provision/kubernetes/instance.py,sha256=kAsQ_uVkX31Sm4aaPCo5IlT1nohaveIi98mHA921pE8,67181
261
+ sky/provision/kubernetes/instance.py,sha256=Z9c3nUIniijD9OMQ1PO4YyuiL4764w5P_3MzSWTL-Fg,67333
262
262
  sky/provision/kubernetes/network.py,sha256=Dgj8u7IQBHKHt-mSDhYzue1wfDk96FR_8fO89TwuZ2E,12846
263
263
  sky/provision/kubernetes/network_utils.py,sha256=EROwcgkdVawLQVkw6cpRaEg4k2pS0V8dEoO8vh9G9Kc,12273
264
264
  sky/provision/kubernetes/utils.py,sha256=8H9lTtLCOCQ4k-85dieIzDfY6ylbv16hPei7oZuRDys,153609
@@ -358,8 +358,8 @@ sky/server/config.py,sha256=XWf5Kw4am6vMO5wcyWevbQAFH-dmKb7AMEgDzD083-M,8538
358
358
  sky/server/constants.py,sha256=yjX8t73w6gj3_SDSP4vBFdNdiOqq7dnlXT2pw3yo0jM,2321
359
359
  sky/server/daemons.py,sha256=3cwp-Os2StWLaOF21Sv4jzJ1zkEYpKuiKF5HFkg86WA,8700
360
360
  sky/server/metrics.py,sha256=6H6n6dq_C5HMaU97mJlRUB9bqOEA_k205PO15wE3AWk,3648
361
- sky/server/rest.py,sha256=XExs_gWGnHQCgXcxdSW7MRr9iJ66b1WDMpkkYWa_LNc,12684
362
- sky/server/server.py,sha256=Efz0FCC_oYWLFyuUbRnJoz1rrtc6-nBvjnZE_MGN6jY,78401
361
+ sky/server/rest.py,sha256=GAT1uS5tacRqBbbECbVxMsnEIdEFjjuqAryNgz0IiYA,14502
362
+ sky/server/server.py,sha256=YTFhgaAKMIYvxwKdgPoAc0CP7TlVEm6AvEmrMEB8uqY,78411
363
363
  sky/server/state.py,sha256=YbVOMJ1JipQQv17gLIGyiGN7MKfnP83qlUa5MB1z0Yk,747
364
364
  sky/server/stream_utils.py,sha256=RS4RuMxQqTGqp3uxzZVtmFWzos4d49P7hMX_VklzEVU,9189
365
365
  sky/server/uvicorn.py,sha256=7K-_Xge8EDWGqunqzSqPzGVBo5X1F8snKzWmzE2FdrY,9292
@@ -371,7 +371,7 @@ sky/server/html/log.html,sha256=TSGZktua9Ysl_ysg3w60rjxAxhH61AJnsYDHdtqrjmI,6929
371
371
  sky/server/html/token_page.html,sha256=eUndS5u1foL9vaWGPRTLMt7lCzD1g0wYJ2v_EeeFzlc,7046
372
372
  sky/server/requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
373
  sky/server/requests/event_loop.py,sha256=OhpPbuce65bbjpGRlcJa78AVnYSm08SzFKt70ypCUuQ,1211
374
- sky/server/requests/executor.py,sha256=1TFMCK2-VyyxhkPitOyUk-3Eutozw_H9ncs-9OBrekc,27168
374
+ sky/server/requests/executor.py,sha256=QPF53TTi3j_rw1pd6hYAJunVy3sCkHwBMQQB3MKRZ8I,27175
375
375
  sky/server/requests/payloads.py,sha256=H7XgGTTBcL6qey2NvzYIek7nGxA_V-qyfYMRkj72KTc,26229
376
376
  sky/server/requests/preconditions.py,sha256=uUQjzFFHf7O5-WvBypMzqViGmd1CXksbqrrDPmY_s_Y,7178
377
377
  sky/server/requests/process.py,sha256=UpJp5rZizNMFRCNRtudFSjbcJhFarFbtAGDWI9x_ZyE,13197
@@ -380,8 +380,8 @@ sky/server/requests/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
380
380
  sky/server/requests/queues/local_queue.py,sha256=X6VkBiUmgd_kfqIK1hCtMWG1b8GiZbY70TBiBR6c6GY,416
381
381
  sky/server/requests/queues/mp_queue.py,sha256=jDqP4Jd28U3ibSFyMR1DF9I2OWZrPZqFJrG5S6RFpyw,3403
382
382
  sky/server/requests/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
383
- sky/server/requests/serializers/decoders.py,sha256=KSOy147DLT05RBEHpnFyY0Pi3hxMWl_y-dWGfTDCMeU,7175
384
- sky/server/requests/serializers/encoders.py,sha256=b0RmAqAkKYoetw_qyGkSN-Y-kab9pN1a38kBzu-zj8c,7425
383
+ sky/server/requests/serializers/decoders.py,sha256=zE2BeTYVcBAK6a_V9YmMPRBQ9xos5tjdkrR7TH2VLGc,7417
384
+ sky/server/requests/serializers/encoders.py,sha256=EsKpscRTjxLRgDDw4DgJNjmRu1q-5bvj6zBe-tebaLc,7584
385
385
  sky/setup_files/MANIFEST.in,sha256=4gbgHHwSdP6BbMJv5XOt-2K6wUVWF_T9CGsdESvh918,776
386
386
  sky/setup_files/alembic.ini,sha256=854_UKvCaFmZ8vI16tSHbGgP9IMFQ42Td6c9Zmn2Oxs,5079
387
387
  sky/setup_files/dependencies.py,sha256=wvF2ZpKeQ0_Gs-Y2GVtbLoINKaRQGZ0SCkiQ70yff3U,7241
@@ -454,7 +454,7 @@ sky/usage/constants.py,sha256=mFrTgrFIfFf4kpcl-M1VDU7_moD5_mJazUJTUDrybms,1102
454
454
  sky/usage/usage_lib.py,sha256=JlKupp72xYGDbk9UbfTq_tPBoJ2CxZyjeIvajgYdU7I,21470
455
455
  sky/users/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
456
456
  sky/users/model.conf,sha256=nPAaMai2fc-nlnEDTfW5Lyw6vgCcOS32BSms4aFOHoY,259
457
- sky/users/permission.py,sha256=EL-a1yrZXqC_KLZcDY5yfBtcKvZj2KP3CYYJoZop6SY,15696
457
+ sky/users/permission.py,sha256=ttqU5aVH9gNTIkO8vGeURTwC8eB5yYSFVGUbgNNbzpo,15563
458
458
  sky/users/rbac.py,sha256=3ZWukXo85u6zWbPmHcPsF9EtZ3cd_51PLZYf2h-7uAM,3636
459
459
  sky/users/server.py,sha256=RyxxbjHkL3bIQMqzOkwBnPp05lVdKWabu8inshLfOcI,27921
460
460
  sky/users/token_service.py,sha256=78Xgm6rkd5M6IMMUekAp2YNLms4teNNvVDPfHh_5jts,7804
@@ -533,9 +533,9 @@ sky/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
533
533
  sky/workspaces/core.py,sha256=AjwbbRwk0glzCnqICJk4sQzMoUcawixbXoQWKLB3-aQ,25372
534
534
  sky/workspaces/server.py,sha256=Box45DS54xXGHy7I3tGKGy-JP0a8G_z6IhfvGlEXtsA,3439
535
535
  sky/workspaces/utils.py,sha256=IIAiFoS6sdb2t0X5YoX9AietpTanZUQNTK8cePun-sY,2143
536
- skypilot_nightly-1.0.0.dev20250821.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
537
- skypilot_nightly-1.0.0.dev20250821.dist-info/METADATA,sha256=Ehg2NgMdI9qWbtiqNMNEeT4zd5h2d5jMHvQr1QD6LIk,20089
538
- skypilot_nightly-1.0.0.dev20250821.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
539
- skypilot_nightly-1.0.0.dev20250821.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
540
- skypilot_nightly-1.0.0.dev20250821.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
541
- skypilot_nightly-1.0.0.dev20250821.dist-info/RECORD,,
536
+ skypilot_nightly-1.0.0.dev20250823.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
537
+ skypilot_nightly-1.0.0.dev20250823.dist-info/METADATA,sha256=mBLKdqZYDR4ZN5cDcDEvIo0_LAibuMi5EJvBHCW_gfI,20115
538
+ skypilot_nightly-1.0.0.dev20250823.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
539
+ skypilot_nightly-1.0.0.dev20250823.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
540
+ skypilot_nightly-1.0.0.dev20250823.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
541
+ skypilot_nightly-1.0.0.dev20250823.dist-info/RECORD,,