skypilot-nightly 1.0.0.dev20250829__py3-none-any.whl → 1.0.0.dev20250901__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 (49) hide show
  1. sky/__init__.py +2 -2
  2. sky/adaptors/nebius.py +24 -2
  3. sky/backends/backend_utils.py +39 -36
  4. sky/backends/cloud_vm_ray_backend.py +37 -0
  5. sky/client/cli/command.py +17 -6
  6. sky/client/common.py +5 -4
  7. sky/client/sdk.py +5 -0
  8. sky/client/sdk_async.py +8 -2
  9. sky/core.py +8 -3
  10. sky/dashboard/out/404.html +1 -1
  11. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  12. sky/dashboard/out/clusters/[cluster].html +1 -1
  13. sky/dashboard/out/clusters.html +1 -1
  14. sky/dashboard/out/config.html +1 -1
  15. sky/dashboard/out/index.html +1 -1
  16. sky/dashboard/out/infra/[context].html +1 -1
  17. sky/dashboard/out/infra.html +1 -1
  18. sky/dashboard/out/jobs/[job].html +1 -1
  19. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  20. sky/dashboard/out/jobs.html +1 -1
  21. sky/dashboard/out/users.html +1 -1
  22. sky/dashboard/out/volumes.html +1 -1
  23. sky/dashboard/out/workspace/new.html +1 -1
  24. sky/dashboard/out/workspaces/[name].html +1 -1
  25. sky/dashboard/out/workspaces.html +1 -1
  26. sky/global_user_state.py +67 -0
  27. sky/provision/docker_utils.py +1 -1
  28. sky/provision/kubernetes/utils.py +39 -26
  29. sky/server/common.py +8 -6
  30. sky/server/metrics.py +82 -6
  31. sky/server/requests/executor.py +5 -1
  32. sky/server/requests/payloads.py +1 -0
  33. sky/server/requests/requests.py +19 -11
  34. sky/server/server.py +46 -14
  35. sky/server/uvicorn.py +7 -0
  36. sky/setup_files/dependencies.py +23 -8
  37. sky/setup_files/setup.py +2 -0
  38. sky/skylet/constants.py +3 -0
  39. sky/utils/db/db_utils.py +56 -4
  40. sky/utils/perf_utils.py +22 -0
  41. sky/utils/schemas.py +6 -0
  42. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.dist-info}/METADATA +35 -50
  43. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.dist-info}/RECORD +49 -48
  44. /sky/dashboard/out/_next/static/{hYJYFIxp_ZFONR4wTIJqZ → EqPZ0ygxa__3XPBVJ9dpy}/_buildManifest.js +0 -0
  45. /sky/dashboard/out/_next/static/{hYJYFIxp_ZFONR4wTIJqZ → EqPZ0ygxa__3XPBVJ9dpy}/_ssgManifest.js +0 -0
  46. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.dist-info}/WHEEL +0 -0
  47. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.dist-info}/entry_points.txt +0 -0
  48. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.dist-info}/licenses/LICENSE +0 -0
  49. {skypilot_nightly-1.0.0.dev20250829.dist-info → skypilot_nightly-1.0.0.dev20250901.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 = '27f74c78af59ef98180b59a30c43410e46e3ce37'
10
+ _SKYPILOT_COMMIT_SHA = 'cf5b530d1a29931fb96476da3cecb7c1d03e5f6e'
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.dev20250829'
40
+ __version__ = '1.0.0.dev20250901'
41
41
  __root_dir__ = directory_utils.get_sky_dir()
42
42
 
43
43
 
sky/adaptors/nebius.py CHANGED
@@ -62,6 +62,10 @@ def iam_token_path() -> str:
62
62
  return '~/.nebius/NEBIUS_IAM_TOKEN.txt'
63
63
 
64
64
 
65
+ def domain_path() -> str:
66
+ return '~/.nebius/NEBIUS_DOMAIN.txt'
67
+
68
+
65
69
  def credentials_path() -> str:
66
70
  workspace_path = skypilot_config.get_workspace_cloud('nebius').get(
67
71
  'credentials_file_path', None)
@@ -82,6 +86,22 @@ def _get_default_credentials_path() -> str:
82
86
  return '~/.nebius/credentials.json'
83
87
 
84
88
 
89
+ def api_domain() -> Optional[str]:
90
+ domain_in_ws_config = skypilot_config.get_workspace_cloud('nebius').get(
91
+ 'domain', None)
92
+ if domain_in_ws_config is not None:
93
+ return domain_in_ws_config
94
+ domain_in_config = skypilot_config.get_effective_region_config(
95
+ cloud='nebius', region=None, keys=('domain',), default_value=None)
96
+ if domain_in_config is not None:
97
+ return domain_in_config
98
+ try:
99
+ with open(os.path.expanduser(domain_path()), encoding='utf-8') as file:
100
+ return file.read().strip()
101
+ except FileNotFoundError:
102
+ return None
103
+
104
+
85
105
  DEFAULT_REGION = 'eu-north1'
86
106
 
87
107
  NEBIUS_PROFILE_NAME = 'nebius'
@@ -215,10 +235,12 @@ def _sdk(token: Optional[str], cred_path: Optional[str]):
215
235
  # Exactly one of token or cred_path must be provided
216
236
  assert (token is None) != (cred_path is None), (token, cred_path)
217
237
  if token is not None:
218
- return nebius.sdk.SDK(credentials=token)
238
+ return nebius.sdk.SDK(credentials=token, domain=api_domain())
219
239
  if cred_path is not None:
220
240
  return nebius.sdk.SDK(
221
- credentials_file_name=os.path.expanduser(cred_path))
241
+ credentials_file_name=os.path.expanduser(cred_path),
242
+ domain=api_domain(),
243
+ )
222
244
  raise ValueError('Either token or credentials file path must be provided')
223
245
 
224
246
 
@@ -928,19 +928,19 @@ def write_cluster_config(
928
928
  # Add kubernetes config fields from ~/.sky/config
929
929
  if isinstance(cloud, clouds.Kubernetes):
930
930
  cluster_config_overrides = to_provision.cluster_config_overrides
931
- kubernetes_utils.combine_pod_config_fields(
932
- tmp_yaml_path,
931
+ with open(tmp_yaml_path, 'r', encoding='utf-8') as f:
932
+ tmp_yaml_str = f.read()
933
+ cluster_yaml_obj = yaml_utils.safe_load(tmp_yaml_str)
934
+ combined_yaml_obj = kubernetes_utils.combine_pod_config_fields_and_metadata(
935
+ cluster_yaml_obj,
933
936
  cluster_config_overrides=cluster_config_overrides,
934
937
  cloud=cloud,
935
938
  context=region.name)
936
- kubernetes_utils.combine_metadata_fields(
937
- tmp_yaml_path,
938
- cluster_config_overrides=cluster_config_overrides,
939
- context=region.name)
940
- yaml_obj = yaml_utils.read_yaml(tmp_yaml_path)
941
- pod_config: Dict[str, Any] = yaml_obj['available_node_types'][
942
- 'ray_head_default']['node_config']
939
+ # Write the updated YAML back to the file
940
+ yaml_utils.dump_yaml(tmp_yaml_path, combined_yaml_obj)
943
941
 
942
+ pod_config: Dict[str, Any] = combined_yaml_obj['available_node_types'][
943
+ 'ray_head_default']['node_config']
944
944
  # Check pod spec only. For high availability controllers, we deploy pvc & deployment for the controller. Read kubernetes-ray.yml.j2 for more details.
945
945
  pod_config.pop('deployment_spec', None)
946
946
  pod_config.pop('pvc_spec', None)
@@ -2929,6 +2929,7 @@ def get_clusters(
2929
2929
  refresh: common.StatusRefreshMode,
2930
2930
  cluster_names: Optional[Union[str, List[str]]] = None,
2931
2931
  all_users: bool = True,
2932
+ include_credentials: bool = False,
2932
2933
  # Internal only:
2933
2934
  # pylint: disable=invalid-name
2934
2935
  _include_is_managed: bool = False,
@@ -2941,17 +2942,14 @@ def get_clusters(
2941
2942
  of the clusters.
2942
2943
 
2943
2944
  Args:
2944
- include_controller: Whether to include controllers, e.g. jobs controller
2945
- or sky serve controller.
2946
2945
  refresh: Whether to refresh the status of the clusters. (Refreshing will
2947
2946
  set the status to STOPPED if the cluster cannot be pinged.)
2948
- cloud_filter: Sets which clouds to filer through from the global user
2949
- state. Supports three values, 'all' for all clouds, 'public' for
2950
- public clouds only, and 'local' for only local clouds.
2951
2947
  cluster_names: If provided, only return records for the given cluster
2952
2948
  names.
2953
2949
  all_users: If True, return clusters from all users. If False, only
2954
2950
  return clusters from the current user.
2951
+ include_credentials: If True, include cluster ssh credentials in the
2952
+ return value.
2955
2953
  _include_is_managed: Whether to force include clusters created by the
2956
2954
  controller.
2957
2955
 
@@ -2995,29 +2993,34 @@ def get_clusters(
2995
2993
  logger.info(f'Cluster(s) not found: {bright}{clusters_str}{reset}.')
2996
2994
  records = new_records
2997
2995
 
2998
- def _update_records_with_credentials_and_resources_str(
2999
- records: List[Optional[Dict[str, Any]]]) -> None:
3000
- """Add the credentials to the record.
3001
-
3002
- This is useful for the client side to setup the ssh config of the
3003
- cluster.
3004
- """
3005
- records_with_handle = []
2996
+ def _get_records_with_handle(
2997
+ records: List[Optional[Dict[str, Any]]]) -> List[Dict[str, Any]]:
2998
+ """Filter for records that have a handle"""
2999
+ return [
3000
+ record for record in records
3001
+ if record is not None and record['handle'] is not None
3002
+ ]
3006
3003
 
3007
- # only act on records that have a handle
3008
- for record in records:
3009
- if record is None:
3010
- continue
3004
+ def _update_records_with_resources_str(
3005
+ records: List[Optional[Dict[str, Any]]]) -> None:
3006
+ """Add resource str to record"""
3007
+ for record in _get_records_with_handle(records):
3011
3008
  handle = record['handle']
3012
- if handle is None:
3013
- continue
3014
3009
  record[
3015
3010
  'resources_str'] = resources_utils.get_readable_resources_repr(
3016
3011
  handle, simplify=True)
3017
3012
  record[
3018
3013
  'resources_str_full'] = resources_utils.get_readable_resources_repr(
3019
3014
  handle, simplify=False)
3020
- records_with_handle.append(record)
3015
+
3016
+ def _update_records_with_credentials(
3017
+ records: List[Optional[Dict[str, Any]]]) -> None:
3018
+ """Add the credentials to the record.
3019
+
3020
+ This is useful for the client side to setup the ssh config of the
3021
+ cluster.
3022
+ """
3023
+ records_with_handle = _get_records_with_handle(records)
3021
3024
  if len(records_with_handle) == 0:
3022
3025
  return
3023
3026
 
@@ -3050,12 +3053,8 @@ def get_clusters(
3050
3053
  def _update_records_with_resources(
3051
3054
  records: List[Optional[Dict[str, Any]]]) -> None:
3052
3055
  """Add the resources to the record."""
3053
- for record in records:
3054
- if record is None:
3055
- continue
3056
+ for record in _get_records_with_handle(records):
3056
3057
  handle = record['handle']
3057
- if handle is None:
3058
- continue
3059
3058
  record['nodes'] = handle.launched_nodes
3060
3059
  if handle.launched_resources is None:
3061
3060
  continue
@@ -3072,7 +3071,9 @@ def get_clusters(
3072
3071
  if handle.launched_resources.accelerators else None)
3073
3072
 
3074
3073
  # Add auth_config to the records
3075
- _update_records_with_credentials_and_resources_str(records)
3074
+ _update_records_with_resources_str(records)
3075
+ if include_credentials:
3076
+ _update_records_with_credentials(records)
3076
3077
  if refresh == common.StatusRefreshMode.NONE:
3077
3078
  # Add resources to the records
3078
3079
  _update_records_with_resources(records)
@@ -3112,7 +3113,9 @@ def get_clusters(
3112
3113
  cluster_name,
3113
3114
  force_refresh_statuses=force_refresh_statuses,
3114
3115
  acquire_per_cluster_status_lock=True)
3115
- _update_records_with_credentials_and_resources_str([record])
3116
+ _update_records_with_resources_str([record])
3117
+ if include_credentials:
3118
+ _update_records_with_credentials([record])
3116
3119
  except (exceptions.ClusterStatusFetchingError,
3117
3120
  exceptions.CloudUserIdentityError,
3118
3121
  exceptions.ClusterOwnerIdentityMismatchError) as e:
@@ -5157,6 +5157,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5157
5157
  # Take a random resource in order to get resource info that applies
5158
5158
  # to all resources.
5159
5159
  one_task_resource = list(task.resources)[0]
5160
+
5160
5161
  # Assume resources share the same ports.
5161
5162
  for resource in task.resources:
5162
5163
  assert resource.ports == one_task_resource.ports
@@ -5197,6 +5198,42 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5197
5198
  if one_task_resource.docker_login_config is not None:
5198
5199
  to_provision = to_provision.copy(
5199
5200
  _docker_login_config=one_task_resource.docker_login_config)
5201
+
5202
+ # cluster_config_overrides should be the same for all resources.
5203
+ for resource in task.resources:
5204
+ assert (resource.cluster_config_overrides ==
5205
+ one_task_resource.cluster_config_overrides)
5206
+ if isinstance(to_provision.cloud, clouds.Kubernetes):
5207
+ # Warn users if the Kubernetes pod config is different
5208
+ # from the existing cluster.
5209
+ cluster_yaml_str = global_user_state.get_cluster_yaml_str(
5210
+ cluster_name)
5211
+ actual_cluster_yaml_obj = yaml_utils.safe_load(cluster_yaml_str)
5212
+ desired_cluster_yaml_obj = (
5213
+ kubernetes_utils.combine_pod_config_fields_and_metadata(
5214
+ actual_cluster_yaml_obj,
5215
+ cluster_config_overrides=one_task_resource.
5216
+ cluster_config_overrides,
5217
+ cloud=to_provision.cloud,
5218
+ context=to_provision.region))
5219
+
5220
+ def _get_pod_config(yaml_obj: Dict[str, Any]) -> Dict[str, Any]:
5221
+ return (yaml_obj.get('available_node_types',
5222
+ {}).get('ray_head_default',
5223
+ {}).get('node_config', {}))
5224
+
5225
+ if _get_pod_config(desired_cluster_yaml_obj) != _get_pod_config(
5226
+ actual_cluster_yaml_obj):
5227
+ # pylint: disable=line-too-long
5228
+ logger.warning(
5229
+ f'{colorama.Fore.YELLOW}WARNING: Kubernetes pod config mismatch detected. Task requires different '
5230
+ f'pod config than the existing cluster. The existing '
5231
+ f'cluster will be used with its current pod config.'
5232
+ f'To apply use your task\'s new pod config:\n'
5233
+ f' • Use a new cluster'
5234
+ f' • Or restart this cluster: sky down {cluster_name}; sky launch -c {cluster_name} ...'
5235
+ f'{colorama.Style.RESET_ALL}')
5236
+
5200
5237
  return RetryingVmProvisioner.ToProvisionConfig(
5201
5238
  cluster_name,
5202
5239
  to_provision,
sky/client/cli/command.py CHANGED
@@ -143,7 +143,10 @@ def _get_cluster_records_and_set_ssh_config(
143
143
  # TODO(zhwu): this additional RTT makes CLIs slow. We should optimize this.
144
144
  if clusters is not None:
145
145
  all_users = True
146
- request_id = sdk.status(clusters, refresh=refresh, all_users=all_users)
146
+ request_id = sdk.status(clusters,
147
+ refresh=refresh,
148
+ all_users=all_users,
149
+ _include_credentials=True)
147
150
  cluster_records = sdk.stream_and_get(request_id)
148
151
  # Update the SSH config for all clusters
149
152
  for record in cluster_records:
@@ -1655,7 +1658,9 @@ def _show_endpoint(query_clusters: Optional[List[str]],
1655
1658
  return
1656
1659
 
1657
1660
 
1658
- def _show_enabled_infra(active_workspace: str, show_workspace: bool):
1661
+ def _show_enabled_infra(
1662
+ active_workspace: str, show_workspace: bool,
1663
+ enabled_clouds_request_id: server_common.RequestId[List[str]]):
1659
1664
  """Show the enabled infrastructure."""
1660
1665
  workspace_str = ''
1661
1666
  if show_workspace:
@@ -1663,8 +1668,7 @@ def _show_enabled_infra(active_workspace: str, show_workspace: bool):
1663
1668
  title = (f'{colorama.Fore.CYAN}{colorama.Style.BRIGHT}Enabled Infra'
1664
1669
  f'{workspace_str}:'
1665
1670
  f'{colorama.Style.RESET_ALL} ')
1666
- all_infras = sdk.get(
1667
- sdk.enabled_clouds(workspace=active_workspace, expand=True))
1671
+ all_infras = sdk.get(enabled_clouds_request_id)
1668
1672
  click.echo(f'{title}{", ".join(all_infras)}\n')
1669
1673
 
1670
1674
 
@@ -1878,6 +1882,11 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1878
1882
  f'{colorama.Style.RESET_ALL}')
1879
1883
  return None
1880
1884
 
1885
+ active_workspace = skypilot_config.get_active_workspace()
1886
+
1887
+ def submit_enabled_clouds():
1888
+ return sdk.enabled_clouds(workspace=active_workspace, expand=True)
1889
+
1881
1890
  managed_jobs_queue_request_id = None
1882
1891
  service_status_request_id = None
1883
1892
  workspace_request_id = None
@@ -1893,6 +1902,7 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1893
1902
  pools_request_future = executor.submit(submit_pools)
1894
1903
  if not (ip or show_endpoints):
1895
1904
  workspace_request_future = executor.submit(submit_workspace)
1905
+ enabled_clouds_request_future = executor.submit(submit_enabled_clouds)
1896
1906
 
1897
1907
  # Get the request IDs
1898
1908
  if show_managed_jobs:
@@ -1903,6 +1913,7 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1903
1913
  pool_status_request_id = pools_request_future.result()
1904
1914
  if not (ip or show_endpoints):
1905
1915
  workspace_request_id = workspace_request_future.result()
1916
+ enabled_clouds_request_id = enabled_clouds_request_future.result()
1906
1917
 
1907
1918
  managed_jobs_queue_request_id = (server_common.RequestId()
1908
1919
  if not managed_jobs_queue_request_id else
@@ -1937,9 +1948,9 @@ def status(verbose: bool, refresh: bool, ip: bool, endpoints: bool,
1937
1948
  all_workspaces = sdk.get(workspace_request_id)
1938
1949
  else:
1939
1950
  all_workspaces = {constants.SKYPILOT_DEFAULT_WORKSPACE: {}}
1940
- active_workspace = skypilot_config.get_active_workspace()
1941
1951
  show_workspace = len(all_workspaces) > 1
1942
- _show_enabled_infra(active_workspace, show_workspace)
1952
+ _show_enabled_infra(active_workspace, show_workspace,
1953
+ enabled_clouds_request_id)
1943
1954
  click.echo(f'{colorama.Fore.CYAN}{colorama.Style.BRIGHT}Clusters'
1944
1955
  f'{colorama.Style.RESET_ALL}')
1945
1956
 
sky/client/common.py CHANGED
@@ -82,10 +82,11 @@ def download_logs_from_api_server(
82
82
  local_machine_prefix) for remote_path in paths_on_api_server
83
83
  }
84
84
  body = payloads.DownloadBody(folder_paths=list(paths_on_api_server),)
85
- response = requests.post(f'{server_common.get_server_url()}/download',
86
- json=json.loads(body.model_dump_json()),
87
- stream=True,
88
- cookies=server_common.get_api_cookie_jar())
85
+ response = server_common.make_authenticated_request(
86
+ 'POST',
87
+ '/download',
88
+ json=json.loads(body.model_dump_json()),
89
+ stream=True)
89
90
  if response.status_code == 200:
90
91
  remote_home_path = response.headers.get('X-Home-Path')
91
92
  assert remote_home_path is not None, response.headers
sky/client/sdk.py CHANGED
@@ -1426,6 +1426,8 @@ def status(
1426
1426
  cluster_names: Optional[List[str]] = None,
1427
1427
  refresh: common.StatusRefreshMode = common.StatusRefreshMode.NONE,
1428
1428
  all_users: bool = False,
1429
+ *,
1430
+ _include_credentials: bool = False,
1429
1431
  ) -> server_common.RequestId[List[responses.StatusResponse]]:
1430
1432
  """Gets cluster statuses.
1431
1433
 
@@ -1474,6 +1476,8 @@ def status(
1474
1476
  provider(s).
1475
1477
  all_users: whether to include all users' clusters. By default, only
1476
1478
  the current user's clusters are included.
1479
+ _include_credentials: (internal) whether to include cluster ssh
1480
+ credentials in the response (default: False).
1477
1481
 
1478
1482
  Returns:
1479
1483
  The request ID of the status request.
@@ -1508,6 +1512,7 @@ def status(
1508
1512
  cluster_names=cluster_names,
1509
1513
  refresh=refresh,
1510
1514
  all_users=all_users,
1515
+ include_credentials=_include_credentials,
1511
1516
  )
1512
1517
  response = server_common.make_authenticated_request(
1513
1518
  'POST', '/status', json=json.loads(body.model_dump_json()))
sky/client/sdk_async.py CHANGED
@@ -576,10 +576,16 @@ async def status(
576
576
  refresh: common.StatusRefreshMode = common.StatusRefreshMode.NONE,
577
577
  all_users: bool = False,
578
578
  stream_logs: Optional[StreamConfig] = DEFAULT_STREAM_CONFIG,
579
+ *,
580
+ _include_credentials: bool = False,
579
581
  ) -> List[Dict[str, Any]]:
580
582
  """Async version of status() that gets cluster statuses."""
581
- request_id = await context_utils.to_thread(sdk.status, cluster_names,
582
- refresh, all_users)
583
+ request_id = await context_utils.to_thread(
584
+ sdk.status,
585
+ cluster_names,
586
+ refresh,
587
+ all_users,
588
+ _include_credentials=_include_credentials)
583
589
  if stream_logs is not None:
584
590
  return await _stream_and_get(request_id, stream_logs)
585
591
  else:
sky/core.py CHANGED
@@ -96,6 +96,7 @@ def status(
96
96
  cluster_names: Optional[Union[str, List[str]]] = None,
97
97
  refresh: common.StatusRefreshMode = common.StatusRefreshMode.NONE,
98
98
  all_users: bool = False,
99
+ include_credentials: bool = False,
99
100
  ) -> List[responses.StatusResponse]:
100
101
  # NOTE(dev): Keep the docstring consistent between the Python API and CLI.
101
102
  """Gets cluster statuses.
@@ -163,15 +164,19 @@ def status(
163
164
  provided, all clusters will be queried.
164
165
  refresh: whether to query the latest cluster statuses from the cloud
165
166
  provider(s).
167
+ include_credentials: whether to fetch ssh credentials for cluster
168
+ (credentials field in responses.StatusResponse)
166
169
 
167
170
  Returns:
168
171
  A list of dicts, with each dict containing the information of a
169
172
  cluster. If a cluster is found to be terminated or not found, it will
170
173
  be omitted from the returned list.
171
174
  """
172
- clusters = backend_utils.get_clusters(refresh=refresh,
173
- cluster_names=cluster_names,
174
- all_users=all_users)
175
+ clusters = backend_utils.get_clusters(
176
+ refresh=refresh,
177
+ cluster_names=cluster_names,
178
+ all_users=all_users,
179
+ include_credentials=include_credentials)
175
180
  return [
176
181
  responses.StatusResponse.model_validate(cluster) for cluster in clusters
177
182
  ]
@@ -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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_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":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_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":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_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":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_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":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_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":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_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":"EqPZ0ygxa__3XPBVJ9dpy","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/hYJYFIxp_ZFONR4wTIJqZ/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/hYJYFIxp_ZFONR4wTIJqZ/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"hYJYFIxp_ZFONR4wTIJqZ","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/EqPZ0ygxa__3XPBVJ9dpy/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/EqPZ0ygxa__3XPBVJ9dpy/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"EqPZ0ygxa__3XPBVJ9dpy","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>