skypilot-nightly 1.0.0.dev20250726__py3-none-any.whl → 1.0.0.dev20250729__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 (39) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +116 -55
  3. sky/catalog/kubernetes_catalog.py +2 -2
  4. sky/clouds/kubernetes.py +2 -1
  5. sky/dashboard/out/404.html +1 -1
  6. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  7. sky/dashboard/out/clusters/[cluster].html +1 -1
  8. sky/dashboard/out/clusters.html +1 -1
  9. sky/dashboard/out/config.html +1 -1
  10. sky/dashboard/out/index.html +1 -1
  11. sky/dashboard/out/infra/[context].html +1 -1
  12. sky/dashboard/out/infra.html +1 -1
  13. sky/dashboard/out/jobs/[job].html +1 -1
  14. sky/dashboard/out/jobs.html +1 -1
  15. sky/dashboard/out/users.html +1 -1
  16. sky/dashboard/out/volumes.html +1 -1
  17. sky/dashboard/out/workspace/new.html +1 -1
  18. sky/dashboard/out/workspaces/[name].html +1 -1
  19. sky/dashboard/out/workspaces.html +1 -1
  20. sky/exceptions.py +1 -0
  21. sky/jobs/server/core.py +4 -1
  22. sky/logs/agent.py +0 -14
  23. sky/logs/aws.py +0 -28
  24. sky/provision/kubernetes/instance.py +4 -3
  25. sky/provision/kubernetes/utils.py +51 -28
  26. sky/serve/server/core.py +21 -2
  27. sky/serve/service.py +22 -2
  28. sky/server/server.py +1 -1
  29. sky/templates/sky-serve-controller.yaml.j2 +3 -0
  30. sky/utils/kubernetes/gpu_labeler.py +2 -2
  31. sky/utils/schemas.py +5 -1
  32. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/METADATA +1 -1
  33. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/RECORD +39 -39
  34. /sky/dashboard/out/_next/static/{lVqpIJvikPZAX3dgsm6_q → Q2sVXboB_t7cgvntL-6nD}/_buildManifest.js +0 -0
  35. /sky/dashboard/out/_next/static/{lVqpIJvikPZAX3dgsm6_q → Q2sVXboB_t7cgvntL-6nD}/_ssgManifest.js +0 -0
  36. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/WHEEL +0 -0
  37. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/entry_points.txt +0 -0
  38. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/licenses/LICENSE +0 -0
  39. {skypilot_nightly-1.0.0.dev20250726.dist-info → skypilot_nightly-1.0.0.dev20250729.dist-info}/top_level.txt +0 -0
sky/__init__.py CHANGED
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = 'dfa392a8416b3aa6c1e2a88c0d19d954408ca4ea'
8
+ _SKYPILOT_COMMIT_SHA = '1e4f892c08e19e9ca7651d3a114a71d954dcd915'
9
9
 
10
10
 
11
11
  def _get_git_commit():
@@ -35,7 +35,7 @@ def _get_git_commit():
35
35
 
36
36
 
37
37
  __commit__ = _get_git_commit()
38
- __version__ = '1.0.0.dev20250726'
38
+ __version__ = '1.0.0.dev20250729'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -33,6 +33,7 @@ from sky import sky_logging
33
33
  from sky import skypilot_config
34
34
  from sky.adaptors import common as adaptors_common
35
35
  from sky.jobs import utils as managed_job_utils
36
+ from sky.provision import common as provision_common
36
37
  from sky.provision import instance_setup
37
38
  from sky.provision.kubernetes import utils as kubernetes_utils
38
39
  from sky.server.requests import requests as requests_lib
@@ -1812,6 +1813,45 @@ def _query_cluster_status_via_cloud_api(
1812
1813
  return node_statuses
1813
1814
 
1814
1815
 
1816
+ def _query_cluster_info_via_cloud_api(
1817
+ handle: 'cloud_vm_ray_backend.CloudVmRayResourceHandle'
1818
+ ) -> provision_common.ClusterInfo:
1819
+ """Returns the cluster info.
1820
+
1821
+ Raises:
1822
+ exceptions.NotSupportedError: the cloud does not support the new provisioner.
1823
+ exceptions.FetchClusterInfoError: the cluster info cannot be
1824
+ fetched from the cloud provider.
1825
+ """
1826
+ cloud = handle.launched_resources.cloud
1827
+ assert cloud is not None, handle
1828
+ if cloud.STATUS_VERSION >= clouds.StatusVersion.SKYPILOT:
1829
+ try:
1830
+ cloud_name = repr(cloud)
1831
+ ray_config = global_user_state.get_cluster_yaml_dict(
1832
+ handle.cluster_yaml)
1833
+ provider_config = ray_config['provider']
1834
+ region = provider_config.get('region') or provider_config.get(
1835
+ 'location')
1836
+ cluster_info = provision_lib.get_cluster_info(
1837
+ cloud_name, region, handle.cluster_name_on_cloud,
1838
+ provider_config)
1839
+ logger.debug(
1840
+ f'Querying {cloud_name} cluster '
1841
+ f'{handle.cluster_name_on_cloud} '
1842
+ f'head instance:\n{cluster_info.get_head_instance()}\n'
1843
+ f'worker instances:\n{cluster_info.get_worker_instances()}')
1844
+ return cluster_info
1845
+ except Exception as e: # pylint: disable=broad-except
1846
+ with ux_utils.print_exception_no_traceback():
1847
+ raise exceptions.FetchClusterInfoError(
1848
+ reason=exceptions.FetchClusterInfoError.Reason.UNKNOWN
1849
+ ) from e
1850
+ else:
1851
+ raise exceptions.NotSupportedError(
1852
+ f'The cloud {cloud} does not support the SkyPilot provisioner.')
1853
+
1854
+
1815
1855
  def check_can_clone_disk_and_override_task(
1816
1856
  cluster_name: str, target_cluster_name: Optional[str], task: 'task_lib.Task'
1817
1857
  ) -> Tuple['task_lib.Task', 'cloud_vm_ray_backend.CloudVmRayResourceHandle']:
@@ -2152,68 +2192,89 @@ def _update_cluster_status(cluster_name: str) -> Optional[Dict[str, Any]]:
2152
2192
  # * The cluster is partially or completely in the INIT state, which means
2153
2193
  # that provisioning was interrupted. This is considered abnormal.
2154
2194
  #
2155
- # An abnormal cluster will transition to INIT and have any autostop setting
2156
- # reset (unless it's autostopping/autodowning).
2195
+ # An abnormal cluster will transition to INIT, and one of the following will happen:
2196
+ # (1) If the SkyPilot provisioner is used AND the head node is alive, we
2197
+ # will not reset the autostop setting. Because autostop is handled by
2198
+ # the skylet through the cloud APIs, and will continue to function
2199
+ # regardless of the ray cluster's health.
2200
+ # (2) Otherwise, we will reset the autostop setting, unless the cluster is
2201
+ # autostopping/autodowning.
2157
2202
  is_abnormal = ((0 < len(node_statuses) < handle.launched_nodes) or any(
2158
2203
  status != status_lib.ClusterStatus.STOPPED for status in node_statuses))
2159
2204
  if is_abnormal:
2160
2205
  logger.debug('The cluster is abnormal. Setting to INIT status. '
2161
2206
  f'node_statuses: {node_statuses}')
2162
- backend = get_backend_from_handle(handle)
2163
- if isinstance(backend,
2164
- backends.CloudVmRayBackend) and record['autostop'] >= 0:
2165
- if not backend.is_definitely_autostopping(handle,
2166
- stream_logs=False):
2167
- # Friendly hint.
2168
- autostop = record['autostop']
2169
- maybe_down_str = ' --down' if record['to_down'] else ''
2170
- noun = 'autodown' if record['to_down'] else 'autostop'
2171
-
2172
- # Reset the autostopping as the cluster is abnormal, and may
2173
- # not correctly autostop. Resetting the autostop will let
2174
- # the user know that the autostop may not happen to avoid
2175
- # leakages from the assumption that the cluster will autostop.
2176
- success = True
2177
- reset_local_autostop = True
2207
+ if record['autostop'] >= 0:
2208
+ is_head_node_alive = False
2209
+ if launched_resources.cloud.PROVISIONER_VERSION >= clouds.ProvisionerVersion.SKYPILOT:
2210
+ # Check if the head node is alive
2178
2211
  try:
2179
- backend.set_autostop(handle, -1, stream_logs=False)
2180
- except exceptions.CommandError as e:
2181
- success = False
2182
- if e.returncode == 255:
2183
- word = 'autostopped' if noun == 'autostop' else 'autodowned'
2184
- logger.debug(f'The cluster is likely {word}.')
2185
- reset_local_autostop = False
2186
- except (Exception, SystemExit) as e: # pylint: disable=broad-except
2187
- success = False
2188
- logger.debug(f'Failed to reset autostop. Due to '
2189
- f'{common_utils.format_exception(e)}')
2190
- if reset_local_autostop:
2191
- global_user_state.set_cluster_autostop_value(
2192
- handle.cluster_name, -1, to_down=False)
2193
-
2194
- if success:
2195
- operation_str = (f'Canceled {noun} on the cluster '
2196
- f'{cluster_name!r}')
2212
+ cluster_info = _query_cluster_info_via_cloud_api(handle)
2213
+ is_head_node_alive = cluster_info.get_head_instance(
2214
+ ) is not None
2215
+ except Exception as e: # pylint: disable=broad-except
2216
+ logger.debug(
2217
+ f'Failed to get cluster info for {cluster_name!r}: '
2218
+ f'{common_utils.format_exception(e)}')
2219
+
2220
+ backend = get_backend_from_handle(handle)
2221
+ if isinstance(backend, backends.CloudVmRayBackend):
2222
+ if is_head_node_alive:
2223
+ logger.debug(
2224
+ f'Skipping autostop reset for cluster {cluster_name!r} '
2225
+ 'because the head node is alive.')
2226
+ elif not backend.is_definitely_autostopping(handle,
2227
+ stream_logs=False):
2228
+ # Friendly hint.
2229
+ autostop = record['autostop']
2230
+ maybe_down_str = ' --down' if record['to_down'] else ''
2231
+ noun = 'autodown' if record['to_down'] else 'autostop'
2232
+
2233
+ # Reset the autostopping as the cluster is abnormal, and may
2234
+ # not correctly autostop. Resetting the autostop will let
2235
+ # the user know that the autostop may not happen to avoid
2236
+ # leakages from the assumption that the cluster will autostop.
2237
+ success = True
2238
+ reset_local_autostop = True
2239
+ try:
2240
+ backend.set_autostop(handle, -1, stream_logs=False)
2241
+ except exceptions.CommandError as e:
2242
+ success = False
2243
+ if e.returncode == 255:
2244
+ word = 'autostopped' if noun == 'autostop' else 'autodowned'
2245
+ logger.debug(f'The cluster is likely {word}.')
2246
+ reset_local_autostop = False
2247
+ except (Exception, SystemExit) as e: # pylint: disable=broad-except
2248
+ success = False
2249
+ logger.debug(f'Failed to reset autostop. Due to '
2250
+ f'{common_utils.format_exception(e)}')
2251
+ if reset_local_autostop:
2252
+ global_user_state.set_cluster_autostop_value(
2253
+ handle.cluster_name, -1, to_down=False)
2254
+
2255
+ if success:
2256
+ operation_str = (f'Canceled {noun} on the cluster '
2257
+ f'{cluster_name!r}')
2258
+ else:
2259
+ operation_str = (
2260
+ f'Attempted to cancel {noun} on the '
2261
+ f'cluster {cluster_name!r} with best effort')
2262
+ yellow = colorama.Fore.YELLOW
2263
+ bright = colorama.Style.BRIGHT
2264
+ reset = colorama.Style.RESET_ALL
2265
+ ux_utils.console_newline()
2266
+ logger.warning(
2267
+ f'{yellow}{operation_str}, since it is found to be in an '
2268
+ f'abnormal state. To fix, try running: {reset}{bright}sky '
2269
+ f'start -f -i {autostop}{maybe_down_str} {cluster_name}'
2270
+ f'{reset}')
2197
2271
  else:
2198
- operation_str = (
2199
- f'Attempted to cancel {noun} on the '
2200
- f'cluster {cluster_name!r} with best effort')
2201
- yellow = colorama.Fore.YELLOW
2202
- bright = colorama.Style.BRIGHT
2203
- reset = colorama.Style.RESET_ALL
2204
- ux_utils.console_newline()
2205
- logger.warning(
2206
- f'{yellow}{operation_str}, since it is found to be in an '
2207
- f'abnormal state. To fix, try running: {reset}{bright}sky '
2208
- f'start -f -i {autostop}{maybe_down_str} {cluster_name}'
2209
- f'{reset}')
2210
- else:
2211
- ux_utils.console_newline()
2212
- operation_str = 'autodowning' if record[
2213
- 'to_down'] else 'autostopping'
2214
- logger.info(
2215
- f'Cluster {cluster_name!r} is {operation_str}. Setting to '
2216
- 'INIT status; try refresh again in a while.')
2272
+ ux_utils.console_newline()
2273
+ operation_str = 'autodowning' if record[
2274
+ 'to_down'] else 'autostopping'
2275
+ logger.info(
2276
+ f'Cluster {cluster_name!r} is {operation_str}. Setting to '
2277
+ 'INIT status; try refresh again in a while.')
2217
2278
 
2218
2279
  # If the user starts part of a STOPPED cluster, we still need a status
2219
2280
  # to represent the abnormal status. For spot cluster, it can also
@@ -214,7 +214,7 @@ def _list_accelerators(
214
214
  # Generate the accelerator quantities
215
215
  accelerator_count = (
216
216
  kubernetes_utils.get_node_accelerator_count(
217
- node.status.allocatable))
217
+ context, node.status.allocatable))
218
218
 
219
219
  if accelerator_count > 0:
220
220
  # TPUs are counted in a different way compared to GPUs.
@@ -261,7 +261,7 @@ def _list_accelerators(
261
261
  if container.resources.requests:
262
262
  allocated_qty += (
263
263
  kubernetes_utils.get_node_accelerator_count(
264
- container.resources.requests))
264
+ context, container.resources.requests))
265
265
 
266
266
  accelerators_available = accelerator_count - allocated_qty
267
267
  # Initialize the total_accelerators_available to make sure the
sky/clouds/kubernetes.py CHANGED
@@ -547,7 +547,8 @@ class Kubernetes(clouds.Cloud):
547
547
  tpu_requested = True
548
548
  k8s_resource_key = kubernetes_utils.TPU_RESOURCE_KEY
549
549
  else:
550
- k8s_resource_key = kubernetes_utils.get_gpu_resource_key()
550
+ k8s_resource_key = kubernetes_utils.get_gpu_resource_key(
551
+ context)
551
552
  else:
552
553
  # If no GPUs are requested, we set NVIDIA_VISIBLE_DEVICES=none to
553
554
  # maintain GPU isolation. This is to override the default behavior
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_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":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c72a1f77a3c0be1b.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_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":"Q2sVXboB_t7cgvntL-6nD","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/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-2186770cc2de1623.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_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":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-2186770cc2de1623.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_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":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-ea0e7283886407ca.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-95afb019ab85801c.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-ea0e7283886407ca.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-95afb019ab85801c.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-3d4be4961e1c94eb.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-3d4be4961e1c94eb.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-a2673b256b6d416f.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-89e7daf7b7df02e0.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-89e7daf7b7df02e0.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-a90b4fe4616dc501.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-a90b4fe4616dc501.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-0d3d1f890c5d188a.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-0d3d1f890c5d188a.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dc0299ffefebcdbe.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-dc0299ffefebcdbe.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-49f790d12a85027c.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-49f790d12a85027c.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-6790fcefd5487b13.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-6790fcefd5487b13.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-61ea7ba7e56f8d06.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-61ea7ba7e56f8d06.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-e49a159c30a6c4a7.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-6bcd4b20914d76c9.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-162f3033ffcd3d31.js" defer=""></script><script src="/dashboard/_next/static/chunks/5230-df791914b54d91d9.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-5ea3ffa10fc884f2.js" defer=""></script><script src="/dashboard/_next/static/chunks/1664-d65361e92b85e786.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-2cc31dc0fdf2a9ad.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1559-18717d96ef2fcbe9.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-eab0e9c16b64fd9f.js" defer=""></script><script src="/dashboard/_next/static/chunks/3698-9fa11dafb5cad4a6.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-2abbd0352f8ee061.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f64e03df359e04f7.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-8e0b2055bf5dd499.js" defer=""></script><script src="/dashboard/_next/static/chunks/1043-869d9c78bf5dd3df.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-d4a381403a8bae91.js" defer=""></script><script src="/dashboard/_next/static/chunks/938-7ee806653aef0609.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-e49a159c30a6c4a7.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-6bcd4b20914d76c9.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-5f7fe4b7d55b8612.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"lVqpIJvikPZAX3dgsm6_q","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/b3227360726f12eb.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/b3227360726f12eb.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-a305898dc479711e.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-efc06c2733009cd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-c0a4f1ea606d48d2.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-da491665d4289aae.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-5f7fe4b7d55b8612.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"Q2sVXboB_t7cgvntL-6nD","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/exceptions.py CHANGED
@@ -387,6 +387,7 @@ class FetchClusterInfoError(Exception):
387
387
  class Reason(enum.Enum):
388
388
  HEAD = 'HEAD'
389
389
  WORKER = 'WORKER'
390
+ UNKNOWN = 'UNKNOWN'
390
391
 
391
392
  def __init__(self, reason: Reason) -> None:
392
393
  super().__init__()
sky/jobs/server/core.py CHANGED
@@ -59,7 +59,10 @@ def _upload_files_to_controller(dag: 'sky.Dag') -> Dict[str, str]:
59
59
  # as uploading to the controller is only a local copy.
60
60
  storage_clouds = (
61
61
  storage_lib.get_cached_enabled_storage_cloud_names_or_refresh())
62
- if not managed_job_utils.is_consolidation_mode() and storage_clouds:
62
+ force_disable_cloud_bucket = skypilot_config.get_nested(
63
+ ('jobs', 'force_disable_cloud_bucket'), False)
64
+ if (not managed_job_utils.is_consolidation_mode() and storage_clouds and
65
+ not force_disable_cloud_bucket):
63
66
  for task_ in dag.tasks:
64
67
  controller_utils.maybe_translate_local_file_mounts_and_sync_up(
65
68
  task_, task_type='jobs')
sky/logs/agent.py CHANGED
@@ -67,20 +67,6 @@ class FluentbitAgent(LoggingAgent):
67
67
  }
68
68
  return common_utils.dump_yaml_str(cfg_dict)
69
69
 
70
- def add_fallback_outputs(self, cfg_dict: Dict[str, Any]) -> Dict[str, Any]:
71
- """Add fallback outputs to the Fluent Bit configuration.
72
-
73
- This method can be overridden by subclasses to add fallback outputs
74
- in case the primary output fails.
75
-
76
- Args:
77
- cfg_dict: The Fluent Bit configuration dictionary.
78
-
79
- Returns:
80
- The updated configuration dictionary.
81
- """
82
- return cfg_dict
83
-
84
70
  @abc.abstractmethod
85
71
  def fluentbit_output_config(
86
72
  self, cluster_name: resources_utils.ClusterName) -> Dict[str, Any]:
sky/logs/aws.py CHANGED
@@ -211,36 +211,8 @@ class CloudwatchLoggingAgent(FluentbitAgent):
211
211
  }
212
212
  }
213
213
 
214
- # Add fallback outputs for graceful failure handling
215
- cfg_dict = self.add_fallback_outputs(cfg_dict)
216
-
217
214
  return common_utils.dump_yaml_str(cfg_dict)
218
215
 
219
- def add_fallback_outputs(self, cfg_dict: Dict[str, Any]) -> Dict[str, Any]:
220
- """Add fallback outputs to the Fluent Bit configuration.
221
-
222
- This adds a local file output as a fallback in case
223
- CloudWatch logging fails.
224
-
225
- Args:
226
- cfg_dict: The Fluent Bit configuration dictionary.
227
-
228
- Returns:
229
- The updated configuration dictionary.
230
- """
231
- # Add a local file output as a fallback
232
- fallback_output = {
233
- 'name': 'file',
234
- 'match': '*',
235
- 'path': '/tmp/skypilot_logs_fallback.log',
236
- 'format': 'out_file',
237
- }
238
-
239
- # Add the fallback output to the configuration
240
- cfg_dict['pipeline']['outputs'].append(fallback_output)
241
-
242
- return cfg_dict
243
-
244
216
  def fluentbit_output_config(
245
217
  self, cluster_name: resources_utils.ClusterName) -> Dict[str, Any]:
246
218
  """Get the Fluent Bit output configuration for CloudWatch.
@@ -210,7 +210,7 @@ def _raise_pod_scheduling_errors(namespace, context, new_nodes):
210
210
  # case we will need to update this logic.
211
211
  # TODO(Doyoung): Update the error message raised
212
212
  # with the multi-host TPU support.
213
- gpu_resource_key = kubernetes_utils.get_gpu_resource_key() # pylint: disable=line-too-long
213
+ gpu_resource_key = kubernetes_utils.get_gpu_resource_key(context) # pylint: disable=line-too-long
214
214
  if 'Insufficient google.com/tpu' in event_message:
215
215
  extra_msg = (
216
216
  f'Verify if '
@@ -797,7 +797,8 @@ def _create_pods(region: str, cluster_name_on_cloud: str,
797
797
  limits = pod_spec['spec']['containers'][0].get('resources',
798
798
  {}).get('limits')
799
799
  if limits is not None:
800
- needs_gpus = limits.get(kubernetes_utils.get_gpu_resource_key(), 0) > 0
800
+ needs_gpus = limits.get(kubernetes_utils.get_gpu_resource_key(context),
801
+ 0) > 0
801
802
 
802
803
  # TPU pods provisioned on GKE use the default containerd runtime.
803
804
  # Reference: https://cloud.google.com/kubernetes-engine/docs/how-to/migrate-containerd#overview # pylint: disable=line-too-long
@@ -900,7 +901,7 @@ def _create_pods(region: str, cluster_name_on_cloud: str,
900
901
  # to the non-DWS case.
901
902
  if needs_gpus:
902
903
  gpu_toleration = {
903
- 'key': kubernetes_utils.get_gpu_resource_key(),
904
+ 'key': kubernetes_utils.get_gpu_resource_key(context),
904
905
  'operator': 'Exists',
905
906
  'effect': 'NoSchedule'
906
907
  }
@@ -147,12 +147,14 @@ MEMORY_SIZE_UNITS = {
147
147
  # The resource keys used by Kubernetes to track NVIDIA GPUs and Google TPUs on
148
148
  # nodes. These keys are typically used in the node's status.allocatable
149
149
  # or status.capacity fields to indicate the available resources on the node.
150
- GPU_RESOURCE_KEY = 'nvidia.com/gpu'
150
+ SUPPORTED_GPU_RESOURCE_KEYS = {'amd': 'amd.com/gpu', 'nvidia': 'nvidia.com/gpu'}
151
151
  TPU_RESOURCE_KEY = 'google.com/tpu'
152
152
 
153
153
  NO_ACCELERATOR_HELP_MESSAGE = (
154
154
  'If your cluster contains GPUs or TPUs, make sure '
155
- f'{GPU_RESOURCE_KEY} or {TPU_RESOURCE_KEY} resource is available '
155
+ f'one of {SUPPORTED_GPU_RESOURCE_KEYS["amd"]}, '
156
+ f'{SUPPORTED_GPU_RESOURCE_KEYS["nvidia"]} or '
157
+ f'{TPU_RESOURCE_KEY} resource is available '
156
158
  'on the nodes and the node labels for identifying GPUs/TPUs '
157
159
  '(e.g., skypilot.co/accelerator) are setup correctly. ')
158
160
 
@@ -391,6 +393,8 @@ def get_gke_accelerator_name(accelerator: str) -> str:
391
393
  return 'nvidia-h200-141gb'
392
394
  elif accelerator.startswith('tpu-'):
393
395
  return accelerator
396
+ elif accelerator.startswith('amd-'):
397
+ return accelerator
394
398
  else:
395
399
  return 'nvidia-tesla-{}'.format(accelerator.lower())
396
400
 
@@ -1098,10 +1102,10 @@ def detect_accelerator_resource(
1098
1102
  context: Optional[str]) -> Tuple[bool, Set[str]]:
1099
1103
  """Checks if the Kubernetes cluster has GPU/TPU resource.
1100
1104
 
1101
- Two types of accelerator resources are available which are each checked
1102
- with nvidia.com/gpu and google.com/tpu. If nvidia.com/gpu resource is
1105
+ Three types of accelerator resources are available which are each checked
1106
+ with amd.com/gpu, nvidia.com/gpu and google.com/tpu. If amd.com/gpu or nvidia.com/gpu resource is
1103
1107
  missing, that typically means that the Kubernetes cluster does not have
1104
- GPUs or the nvidia GPU operator and/or device drivers are not installed.
1108
+ GPUs or the amd/nvidia GPU operator and/or device drivers are not installed.
1105
1109
 
1106
1110
  Returns:
1107
1111
  bool: True if the cluster has GPU_RESOURCE_KEY or TPU_RESOURCE_KEY
@@ -1112,7 +1116,7 @@ def detect_accelerator_resource(
1112
1116
  nodes = get_kubernetes_nodes(context=context)
1113
1117
  for node in nodes:
1114
1118
  cluster_resources.update(node.status.allocatable.keys())
1115
- has_accelerator = (get_gpu_resource_key() in cluster_resources or
1119
+ has_accelerator = (get_gpu_resource_key(context) in cluster_resources or
1116
1120
  TPU_RESOURCE_KEY in cluster_resources)
1117
1121
 
1118
1122
  return has_accelerator, cluster_resources
@@ -1262,8 +1266,8 @@ def check_instance_fits(context: Optional[str],
1262
1266
  else:
1263
1267
  # Check if any of the GPU nodes have sufficient number of GPUs.
1264
1268
  gpu_nodes = [
1265
- node for node in gpu_nodes if
1266
- get_node_accelerator_count(node.status.allocatable) >= acc_count
1269
+ node for node in gpu_nodes if get_node_accelerator_count(
1270
+ context, node.status.allocatable) >= acc_count
1267
1271
  ]
1268
1272
  if not gpu_nodes:
1269
1273
  return False, (
@@ -1325,14 +1329,14 @@ def get_accelerator_label_key_values(
1325
1329
  Raises:
1326
1330
  ResourcesUnavailableError: Can be raised from the following conditions:
1327
1331
  - The cluster does not have GPU/TPU resources
1328
- (nvidia.com/gpu, google.com/tpu)
1332
+ (amd.com/gpu, nvidia.com/gpu, google.com/tpu)
1329
1333
  - The cluster has GPU/TPU resources, but no node in the cluster has
1330
1334
  an accelerator label.
1331
1335
  - The cluster has a node with an invalid accelerator label value.
1332
1336
  - The cluster doesn't have any nodes with acc_type GPU/TPU
1333
1337
  """
1334
1338
  # Check if the cluster has GPU resources
1335
- # TODO(romilb): This assumes the accelerator is a nvidia GPU. We
1339
+ # TODO(romilb): This assumes the accelerator is a amd/nvidia GPU. We
1336
1340
  # need to support TPUs and other accelerators as well.
1337
1341
  # TODO(romilb): Currently, we broadly disable all GPU checks if autoscaling
1338
1342
  # is configured in config.yaml since the cluster may be scaling up from
@@ -1496,12 +1500,15 @@ def get_accelerator_label_key_values(
1496
1500
  f'`sky ssh up --infra {context_display_name}`. {suffix}')
1497
1501
  else:
1498
1502
  msg = (
1499
- f'Could not detect GPU/TPU resources ({GPU_RESOURCE_KEY!r} or '
1503
+ f'Could not detect GPU/TPU resources ({SUPPORTED_GPU_RESOURCE_KEYS["amd"]!r}, '
1504
+ f'{SUPPORTED_GPU_RESOURCE_KEYS["nvidia"]!r} or '
1500
1505
  f'{TPU_RESOURCE_KEY!r}) in Kubernetes cluster. If this cluster'
1501
1506
  ' contains GPUs, please ensure GPU drivers are installed on '
1502
1507
  'the node. Check if the GPUs are setup correctly by running '
1503
1508
  '`kubectl describe nodes` and looking for the '
1504
- f'{GPU_RESOURCE_KEY!r} or {TPU_RESOURCE_KEY!r} resource. '
1509
+ f'{SUPPORTED_GPU_RESOURCE_KEYS["amd"]!r}, '
1510
+ f'{SUPPORTED_GPU_RESOURCE_KEYS["nvidia"]!r} or '
1511
+ f'{TPU_RESOURCE_KEY!r} resource. '
1505
1512
  'Please refer to the documentation on how to set up GPUs.'
1506
1513
  f'{suffix}')
1507
1514
  raise exceptions.ResourcesUnavailableError(msg)
@@ -2861,7 +2868,7 @@ def get_unlabeled_accelerator_nodes(context: Optional[str] = None) -> List[Any]:
2861
2868
  nodes = get_kubernetes_nodes(context=context)
2862
2869
  nodes_with_accelerator = []
2863
2870
  for node in nodes:
2864
- if get_gpu_resource_key() in node.status.capacity:
2871
+ if get_gpu_resource_key(context) in node.status.capacity:
2865
2872
  nodes_with_accelerator.append(node)
2866
2873
 
2867
2874
  label_formatter, _ = detect_gpu_label_formatter(context)
@@ -2950,7 +2957,8 @@ def get_kubernetes_node_info(
2950
2957
  break
2951
2958
 
2952
2959
  allocated_qty = 0
2953
- accelerator_count = get_node_accelerator_count(node.status.allocatable)
2960
+ accelerator_count = get_node_accelerator_count(context,
2961
+ node.status.allocatable)
2954
2962
 
2955
2963
  if pods is None:
2956
2964
  accelerators_available = -1
@@ -2965,7 +2973,7 @@ def get_kubernetes_node_info(
2965
2973
  for container in pod.spec.containers:
2966
2974
  if container.resources.requests:
2967
2975
  allocated_qty += get_node_accelerator_count(
2968
- container.resources.requests)
2976
+ context, container.resources.requests)
2969
2977
 
2970
2978
  accelerators_available = accelerator_count - allocated_qty
2971
2979
 
@@ -3177,7 +3185,8 @@ def is_tpu_on_gke(accelerator: str) -> bool:
3177
3185
  return normalized in GKE_TPU_ACCELERATOR_TO_GENERATION
3178
3186
 
3179
3187
 
3180
- def get_node_accelerator_count(attribute_dict: dict) -> int:
3188
+ def get_node_accelerator_count(context: Optional[str],
3189
+ attribute_dict: dict) -> int:
3181
3190
  """Retrieves the count of accelerators from a node's resource dictionary.
3182
3191
 
3183
3192
  This method checks the node's allocatable resources or the accelerators
@@ -3192,7 +3201,7 @@ def get_node_accelerator_count(attribute_dict: dict) -> int:
3192
3201
  Number of accelerators allocated or available from the node. If no
3193
3202
  resource is found, it returns 0.
3194
3203
  """
3195
- gpu_resource_name = get_gpu_resource_key()
3204
+ gpu_resource_name = get_gpu_resource_key(context)
3196
3205
  assert not (gpu_resource_name in attribute_dict and
3197
3206
  TPU_RESOURCE_KEY in attribute_dict)
3198
3207
  if gpu_resource_name in attribute_dict:
@@ -3318,7 +3327,7 @@ def process_skypilot_pods(
3318
3327
  unit='G')
3319
3328
  gpu_count = parse_cpu_or_gpu_resource(
3320
3329
  pod.spec.containers[0].resources.requests.get(
3321
- 'nvidia.com/gpu', '0'))
3330
+ get_gpu_resource_key(context), '0'))
3322
3331
  gpu_name = None
3323
3332
  if gpu_count > 0:
3324
3333
  label_formatter, _ = (detect_gpu_label_formatter(context))
@@ -3373,19 +3382,33 @@ def process_skypilot_pods(
3373
3382
  return list(clusters.values()), jobs_controllers, serve_controllers
3374
3383
 
3375
3384
 
3376
- def get_gpu_resource_key():
3377
- """Get the GPU resource name to use in kubernetes.
3378
- The function first checks for an environment variable.
3379
- If defined, it uses its value; otherwise, it returns the default value.
3380
- Args:
3381
- name (str): Default GPU resource name, default is "nvidia.com/gpu".
3385
+ def _gpu_resource_key_helper(context: Optional[str]) -> str:
3386
+ """Helper function to get the GPU resource key."""
3387
+ gpu_resource_key = SUPPORTED_GPU_RESOURCE_KEYS['amd']
3388
+ try:
3389
+ nodes = kubernetes.core_api(context).list_node().items
3390
+ for gpu_key in SUPPORTED_GPU_RESOURCE_KEYS.values():
3391
+ if any(gpu_key in node.status.capacity for node in nodes):
3392
+ return gpu_key
3393
+ except Exception as e: # pylint: disable=broad-except
3394
+ logger.warning(f'Failed to load kube config or query nodes: {e}. '
3395
+ 'Falling back to default GPU resource key.')
3396
+ return gpu_resource_key
3397
+
3398
+
3399
+ @annotations.lru_cache(scope='request')
3400
+ def get_gpu_resource_key(context: Optional[str] = None) -> str:
3401
+ """Get the GPU resource name to use in Kubernetes.
3402
+
3403
+ The function auto-detects the GPU resource key by querying the Kubernetes node API.
3404
+ If detection fails, it falls back to a default value.
3405
+ An environment variable can override the detected or default value.
3406
+
3382
3407
  Returns:
3383
3408
  str: The selected GPU resource name.
3384
3409
  """
3385
- # Retrieve GPU resource name from environment variable, if set.
3386
- # Else use default.
3387
- # E.g., can be nvidia.com/gpu-h100, amd.com/gpu etc.
3388
- return os.getenv('CUSTOM_GPU_RESOURCE_KEY', default=GPU_RESOURCE_KEY)
3410
+ gpu_resource_key = _gpu_resource_key_helper(context)
3411
+ return os.getenv('CUSTOM_GPU_RESOURCE_KEY', default=gpu_resource_key)
3389
3412
 
3390
3413
 
3391
3414
  def get_kubeconfig_paths() -> List[str]:
sky/serve/server/core.py CHANGED
@@ -18,6 +18,7 @@ from sky import skypilot_config
18
18
  from sky import task as task_lib
19
19
  from sky.backends import backend_utils
20
20
  from sky.catalog import common as service_catalog_common
21
+ from sky.data import storage as storage_lib
21
22
  from sky.serve import constants as serve_constants
22
23
  from sky.serve import serve_state
23
24
  from sky.serve import serve_utils
@@ -151,8 +152,25 @@ def up(
151
152
 
152
153
  with rich_utils.safe_status(
153
154
  ux_utils.spinner_message('Initializing service')):
154
- controller_utils.maybe_translate_local_file_mounts_and_sync_up(
155
- task, task_type='serve')
155
+ # Handle file mounts using two-hop approach when cloud storage
156
+ # unavailable
157
+ storage_clouds = (
158
+ storage_lib.get_cached_enabled_storage_cloud_names_or_refresh())
159
+ force_disable_cloud_bucket = skypilot_config.get_nested(
160
+ ('serve', 'force_disable_cloud_bucket'), False)
161
+ if storage_clouds and not force_disable_cloud_bucket:
162
+ controller_utils.maybe_translate_local_file_mounts_and_sync_up(
163
+ task, task_type='serve')
164
+ local_to_controller_file_mounts = {}
165
+ else:
166
+ # Fall back to two-hop file_mount uploading when no cloud storage
167
+ if task.storage_mounts:
168
+ raise exceptions.NotSupportedError(
169
+ 'Cloud-based file_mounts are specified, but no cloud '
170
+ 'storage is available. Please specify local '
171
+ 'file_mounts only.')
172
+ local_to_controller_file_mounts = (
173
+ controller_utils.translate_local_file_mounts_to_two_hop(task))
156
174
 
157
175
  tls_template_vars = _rewrite_tls_credential_paths_and_get_tls_env_vars(
158
176
  service_name, task)
@@ -183,6 +201,7 @@ def up(
183
201
  'service_name': service_name,
184
202
  'controller_log_file': controller_log_file,
185
203
  'remote_user_config_path': remote_config_yaml_path,
204
+ 'local_to_controller_file_mounts': local_to_controller_file_mounts,
186
205
  'modified_catalogs':
187
206
  service_catalog_common.get_modified_catalog_file_mounts(),
188
207
  **tls_template_vars,
sky/serve/service.py CHANGED
@@ -19,6 +19,7 @@ from sky import sky_logging
19
19
  from sky import task as task_lib
20
20
  from sky.backends import backend_utils
21
21
  from sky.backends import cloud_vm_ray_backend
22
+ from sky.data import data_utils
22
23
  from sky.serve import constants
23
24
  from sky.serve import controller
24
25
  from sky.serve import load_balancer
@@ -71,6 +72,8 @@ def cleanup_storage(task_yaml: str) -> bool:
71
72
  Returns:
72
73
  True if the storage is cleaned up successfully, False otherwise.
73
74
  """
75
+ failed = False
76
+
74
77
  try:
75
78
  task = task_lib.Task.from_yaml(task_yaml)
76
79
  backend = cloud_vm_ray_backend.CloudVmRayBackend()
@@ -86,8 +89,25 @@ def cleanup_storage(task_yaml: str) -> bool:
86
89
  f'{common_utils.format_exception(e)}')
87
90
  with ux_utils.enable_traceback():
88
91
  logger.error(f' Traceback: {traceback.format_exc()}')
89
- return False
90
- return True
92
+ failed = True
93
+
94
+ # Clean up any files mounted from the local disk, such as two-hop file
95
+ # mounts.
96
+ for file_mount in (task.file_mounts or {}).values():
97
+ try:
98
+ if not data_utils.is_cloud_store_url(file_mount):
99
+ path = os.path.expanduser(file_mount)
100
+ if os.path.isdir(path):
101
+ shutil.rmtree(path)
102
+ else:
103
+ os.remove(path)
104
+ except Exception as e: # pylint: disable=broad-except
105
+ logger.error(f'Failed to clean up file mount {file_mount}: {e}')
106
+ with ux_utils.enable_traceback():
107
+ logger.error(f' Traceback: {traceback.format_exc()}')
108
+ failed = True
109
+
110
+ return not failed
91
111
 
92
112
 
93
113
  def _cleanup(service_name: str) -> bool:
sky/server/server.py CHANGED
@@ -245,7 +245,7 @@ class BasicAuthMiddleware(starlette.middleware.base.BaseHTTPMiddleware):
245
245
  """Middleware to handle HTTP Basic Auth."""
246
246
 
247
247
  async def dispatch(self, request: fastapi.Request, call_next):
248
- if request.url.path.startswith('/api/'):
248
+ if request.url.path.startswith('/api/health'):
249
249
  # Try to set the auth user from basic auth
250
250
  _try_set_basic_auth_user(request)
251
251
  return await call_next(request)
@@ -34,6 +34,9 @@ file_mounts:
34
34
  {%- for remote_catalog_path, local_catalog_path in modified_catalogs.items() %}
35
35
  {{remote_catalog_path}}: {{local_catalog_path}}
36
36
  {%- endfor %}
37
+ {%- for controller_file_mount_path, local_file_mount_path in local_to_controller_file_mounts.items() %}
38
+ {{controller_file_mount_path}}: {{local_file_mount_path}}
39
+ {%- endfor %}
37
40
  {%- if use_tls %}
38
41
  {{remote_tls_keyfile}}: {{local_tls_keyfile}}
39
42
  {{remote_tls_certfile}}: {{local_tls_certfile}}
@@ -62,8 +62,8 @@ def label(context: Optional[str] = None, wait_for_completion: bool = True):
62
62
  if not unlabeled_gpu_nodes:
63
63
  print('No unlabeled GPU nodes found in the cluster. If you have '
64
64
  'unlabeled GPU nodes, please ensure that they have the resource '
65
- f'`{kubernetes_utils.get_gpu_resource_key()}: <number of GPUs>` '
66
- 'in their capacity.')
65
+ f'`{kubernetes_utils.get_gpu_resource_key(context)}: '
66
+ '<number of GPUs>` in their capacity.')
67
67
  return
68
68
 
69
69
  print(
sky/utils/schemas.py CHANGED
@@ -1167,7 +1167,11 @@ def get_config_schema():
1167
1167
  'type': 'string',
1168
1168
  'pattern': '^(https|s3|gs|r2|cos)://.+',
1169
1169
  'required': [],
1170
- }
1170
+ },
1171
+ 'force_disable_cloud_bucket': {
1172
+ 'type': 'boolean',
1173
+ 'default': False,
1174
+ },
1171
1175
  }
1172
1176
  }
1173
1177
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250726
3
+ Version: 1.0.0.dev20250729
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,4 +1,4 @@
1
- sky/__init__.py,sha256=2_b1_zmWfNPg0DA9xG4tmYmVWF0gDTb_LPw1Rl1AWEY,6535
1
+ sky/__init__.py,sha256=c8GJ3hR0luiVb2XYWqXOjYkQ0kwh3nrWD87g6X9LGwY,6535
2
2
  sky/admin_policy.py,sha256=BeSowGnWfDj58ALiNf3cc2N4gMQWzjO6aXnX7vaqYhk,9782
3
3
  sky/authentication.py,sha256=V7zGSV7bqcAKC_EGOOS0KhJ01ZFLnme0WnjLFO7zavs,25603
4
4
  sky/check.py,sha256=R0pFsTq2v-wr3NFePlX9DmDhsbvWEoFJAXsys3pUmT4,30338
@@ -6,7 +6,7 @@ sky/cli.py,sha256=VXIZryeTtJPYpPTBKymVPmuOCyh8knfWrq-qnkr6R-4,178
6
6
  sky/cloud_stores.py,sha256=Ln5GBpel-sEs7rVx7bBrMkfLwA_bctI05Rox2uoz7Lo,26388
7
7
  sky/core.py,sha256=k_3QkqJecFpwLSatM52lD-IitVdjUIXn33EPJWcQfWE,56628
8
8
  sky/dag.py,sha256=5MFXlP43y9U54zxfYGhVyBiWEInoFFlt_zJ7ASJntXw,3889
9
- sky/exceptions.py,sha256=0saA9jj5etJiHjaX6PDTdFj3E3JtC3Ue-irE9OlrrEg,19454
9
+ sky/exceptions.py,sha256=U9s7ty5eyTdpOeteVxh7qOKmkYhyRVQmHXQXyREnMyk,19482
10
10
  sky/execution.py,sha256=sZf0306FCKAo1FS7Vg2yCADSr5XHsODYwESHhwdVTjo,33439
11
11
  sky/global_user_state.py,sha256=PpStfGwx02mwlPdwR55auB1Y-GfYKxun90YpzzQdH-c,67579
12
12
  sky/models.py,sha256=Eor-cT4D71QTimogcnJ5ey1G1PXK-OXN-snEtE8Uu_g,3152
@@ -34,7 +34,7 @@ sky/adaptors/vast.py,sha256=tpvmHi7IkQNzbbHVkeo04kUSajoEpSzXr2XgeO_I1LU,695
34
34
  sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
35
35
  sky/backends/__init__.py,sha256=tpa9gAygQopsiBUUuy3wVmr4E05FoPTFHIWqEo4i-u0,627
36
36
  sky/backends/backend.py,sha256=6ltCouZhaXJqv2Zh9nP_YCdHf10_oIRNzAA-XDiMmI8,7969
37
- sky/backends/backend_utils.py,sha256=bWcPa7jeSrLsH2p41onaOEHPmP9B-iuduIDf9v6gxSw,147146
37
+ sky/backends/backend_utils.py,sha256=ykbCKTPdG3T6Zd4Fq8hqpk-EZ2TtYxSW3c1yEymtizE,150321
38
38
  sky/backends/cloud_vm_ray_backend.py,sha256=akHVi9HTY3ypr8YHLllyj9JJ7z3-JK9k91Pbr-vjg3c,264075
39
39
  sky/backends/docker_utils.py,sha256=_EhM6NStZDAwcegppQqExaB5iuSn1qL4xFFUqXAz2Uk,8392
40
40
  sky/backends/local_docker_backend.py,sha256=r84uhXCk7NK9hGW840KPKnrADd7mCerMwncxOzckHg4,17126
@@ -51,7 +51,7 @@ sky/catalog/fluidstack_catalog.py,sha256=387bOTlR3Bzj07uT1wvw3VSw3fVACQUi1hFoz4A
51
51
  sky/catalog/gcp_catalog.py,sha256=6LfpdBGMutc9lDfmpoKMCB8YaYy3KKcWOm7Xg4bkAkk,26514
52
52
  sky/catalog/hyperbolic_catalog.py,sha256=vMs0HcTyFLBNpuDNdWYFwAIfnKh5TT34mY6CRRPHTFc,4946
53
53
  sky/catalog/ibm_catalog.py,sha256=cU-PmiKyJY3ZCVKJzCaT_ClxJx785yZEg9JlK8vlWfc,4734
54
- sky/catalog/kubernetes_catalog.py,sha256=GpzLt2Y9a1DUo57Jkn-rcneIJPd38W3REZRxQHhfDSk,14100
54
+ sky/catalog/kubernetes_catalog.py,sha256=YYx92uv5r0B62q8ExcetvbMNNPtJ4yQzAxtGEkEqubI,14118
55
55
  sky/catalog/lambda_catalog.py,sha256=M5g23ILZo55CzSdNbEfB4AzAwvs6bPaJPEsMDGuGoqI,5543
56
56
  sky/catalog/nebius_catalog.py,sha256=9TQ309xqe8svquwgNFPht6PHrQc_bMUVhVaEjllGjYk,4748
57
57
  sky/catalog/oci_catalog.py,sha256=5SzhG7umqlWpBoEOYNDBhQFgLIF0H4gtoDwfZo7MkTI,8821
@@ -95,7 +95,7 @@ sky/clouds/fluidstack.py,sha256=AbVYW2iwVVebIn0dWdSSsdItILHRLG3VVU3N2-n1I9c,1360
95
95
  sky/clouds/gcp.py,sha256=LteGFf8kxmVoWyzM1YTNDh3xOrsuVJFB2-E7KNJ_Yz8,68861
96
96
  sky/clouds/hyperbolic.py,sha256=bmV4NFpUPgzR0ownavHHVqyw26EtOgQ_ZB6SlxlgmJw,11999
97
97
  sky/clouds/ibm.py,sha256=qMbOkTMJzPn2HDH9cie9zERvukRZbZoueLIaufCECAw,22860
98
- sky/clouds/kubernetes.py,sha256=DV3v6rlE0S4uKbzCGrWlDZbZyswm38whk32p9zQ07Uk,54489
98
+ sky/clouds/kubernetes.py,sha256=s0IA3dSfW4KdxmdjRP-a1ZSw-tWgwNjwLMpb0qJReBk,54517
99
99
  sky/clouds/lambda_cloud.py,sha256=aRW4GwLjaFFR6_bPbBr9o8z-SKHtuP18BAVwoPuDtBE,13553
100
100
  sky/clouds/nebius.py,sha256=4b7UhtKR8uS-imBJYMMY7p0RX8H1W121MkLRJ07RP-I,21361
101
101
  sky/clouds/oci.py,sha256=U5wtBx78RqCgCAqjlTTgSnRqWWa7D7LIvyoo8097Fno,28571
@@ -111,17 +111,19 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
111
111
  sky/clouds/utils/gcp_utils.py,sha256=zpdibyvdROgDGqllcvQuST3pKqj6pzqX-gxCw-DsCfc,9873
112
112
  sky/clouds/utils/oci_utils.py,sha256=TFqAqRLggg4Z0bhxrrq8nouSSomZy-ub1frHXEkud2M,7302
113
113
  sky/clouds/utils/scp_utils.py,sha256=VGuccVO5uFGr8-yolWSoYrgr11z6cIeDBGcqkBzAyOs,18409
114
- sky/dashboard/out/404.html,sha256=MITjw6ORl4B2Ovkz06zKd6ba2bA1nhp6sidjE5sgEl8,1423
115
- sky/dashboard/out/clusters.html,sha256=QDDg6f0WocSB55f-k3Uzj3eZ9-vzqlZMPN28u2IvKGQ,1418
116
- sky/dashboard/out/config.html,sha256=wbNBh2U9zUzn2mswvPTpXkNibjxr5Ps9awy8Q-JC8sA,1414
114
+ sky/dashboard/out/404.html,sha256=dPR26LZaznGWG1SD-Fy3XTPR2B80vo3eflX1BOQORvc,1423
115
+ sky/dashboard/out/clusters.html,sha256=0zoXFg4aUddIDE8iec5KIV9rREv0hgv73th6MCvnTv4,1418
116
+ sky/dashboard/out/config.html,sha256=gm3fvWI0faMkuTtd4LcsdwuDu6eFQZnMuNJVWLnClR0,1414
117
117
  sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
118
- sky/dashboard/out/index.html,sha256=LvKJcGDqPsSeFCgWF-TFNdLpM0DfwZlrPahIs1yRpTo,1407
119
- sky/dashboard/out/infra.html,sha256=D3Ggak6ome4RwWR_fFLpOghmtblZ0kxu5E8nBniBXC4,1412
120
- sky/dashboard/out/jobs.html,sha256=9jtXWlT5zn-dHq_tjHc1bju8saQEUsngRWGqI0A8zE4,1410
118
+ sky/dashboard/out/index.html,sha256=lnSsxkId-tPl1E-X5Xq3ta1PLOK-8xDwYFzhgsUyFuA,1407
119
+ sky/dashboard/out/infra.html,sha256=ANIyd2pK0q-269gq_H-Mvnl0wPRzoxeRfkAhKzDhUak,1412
120
+ sky/dashboard/out/jobs.html,sha256=JH01qlUHBTVgGXQG0-K9EiEQap1J7J0Wu-hvDFLFXI8,1410
121
121
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
122
- sky/dashboard/out/users.html,sha256=UlI78pCI5kGby1isnWxFgqHzroWQ9NSJB4O_1y40g60,1412
123
- sky/dashboard/out/volumes.html,sha256=rb020WkxcYb_eDxCjMUB3p3KaRPclG6fEy7SXboZeQc,1416
124
- sky/dashboard/out/workspaces.html,sha256=HqewcP20bsRAWG6rRPjiT9ibO0eMK8w67JsyLHq0-OI,1422
122
+ sky/dashboard/out/users.html,sha256=5scHKkPCxQlCsFOEXUeH7F7YAcutc0IVgQKR747exA4,1412
123
+ sky/dashboard/out/volumes.html,sha256=Z-_49l_Z3vpy0ShXZgfxroCEMOtvO2IrrE_B7_Ue6gw,1416
124
+ sky/dashboard/out/workspaces.html,sha256=H2p72PxAtHr5nKH0_RNRGUiZK95D1bJRweHtrr78p_M,1422
125
+ sky/dashboard/out/_next/static/Q2sVXboB_t7cgvntL-6nD/_buildManifest.js,sha256=mmxo6wQVKY20ZhMR66BRt5Wcei8mpj5spy7xJIR2Qy8,2236
126
+ sky/dashboard/out/_next/static/Q2sVXboB_t7cgvntL-6nD/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
125
127
  sky/dashboard/out/_next/static/chunks/1043-869d9c78bf5dd3df.js,sha256=bAxynBdZtwL6IUsmByq0m47nF_VnO1lsMN9Xjdrp1GI,18328
126
128
  sky/dashboard/out/_next/static/chunks/1141-e49a159c30a6c4a7.js,sha256=KK5G7lgpUnTVxW1tvREGo0rPqKfq8nDl6xx1T21fgCo,17818
127
129
  sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js,sha256=VJ6y-Z6Eg2T93hQIRfWAbjAkQ7nQhglmIaVbEpKSILY,38451
@@ -175,15 +177,13 @@ sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dc0299ffefebcdbe.js,sha25
175
177
  sky/dashboard/out/_next/static/chunks/pages/workspace/new-5629d4e551dba1ee.js,sha256=K9tqKHcB2kiSHTAddLaM2oL1PzmqZNTdLDOuNzCaJNM,765
176
178
  sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-6bcd4b20914d76c9.js,sha256=wCk-0BTOhpwUb22meXUGhG7zX-retkF3aR7cuk4qbYQ,1492
177
179
  sky/dashboard/out/_next/static/css/b3227360726f12eb.css,sha256=H55rkeVIrdGOUAIPmLZ6C78aEgXb7fEPa9mT9BOuLBI,55358
178
- sky/dashboard/out/_next/static/lVqpIJvikPZAX3dgsm6_q/_buildManifest.js,sha256=mmxo6wQVKY20ZhMR66BRt5Wcei8mpj5spy7xJIR2Qy8,2236
179
- sky/dashboard/out/_next/static/lVqpIJvikPZAX3dgsm6_q/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
180
- sky/dashboard/out/clusters/[cluster].html,sha256=Gf3g6dC5lWRFcngVDBjuXbkJEXENJJ10_HnLAOxId8Q,2848
181
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=hGfSXnZHWbXyUukwTyx-AmCT4g8MkQLkslgqe2iXU6o,2161
182
- sky/dashboard/out/infra/[context].html,sha256=IeGOmOQRUfxdcMcZymlGfvs_DwKw6Qti46r3T34hcN4,1436
183
- sky/dashboard/out/jobs/[job].html,sha256=Dha_F-I1V-bpwKmtykc9tGQAEBgA5LXODfCrUdJuqn8,2305
180
+ sky/dashboard/out/clusters/[cluster].html,sha256=3ZHYa6fY-r-B6xg-J7NQ9ioJHnA20kw-9phMLff6V6Y,2848
181
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=PuFjhgi6kliWm7V9teCVp5IdXGXrSjfCNL3XMjFj4ow,2161
182
+ sky/dashboard/out/infra/[context].html,sha256=hRORJKeU63X5gUEg20gCHgj3LxntTxCBq5cvsI0Oe38,1436
183
+ sky/dashboard/out/jobs/[job].html,sha256=7jiPEQlLEXcJ2Akb-UZov-azriC4aaHYZmoX1CfuY8w,2305
184
184
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
185
- sky/dashboard/out/workspace/new.html,sha256=eTh24Ghx6krvN4lEtTAMddcJHCXL6B6hp3mJ44tFQBE,1428
186
- sky/dashboard/out/workspaces/[name].html,sha256=E6ahdKgCrz-Do0Rqyr5ny95rq-y_n0Zvk9OmL9C4Ois,2846
185
+ sky/dashboard/out/workspace/new.html,sha256=OlfNa3tmNL_KVwSPXOBMc2Lyz4tUGVWjfEQzCO5bYcg,1428
186
+ sky/dashboard/out/workspaces/[name].html,sha256=HfHLBQtSbXgvLFTo3ET6PYqPJ39tEqjLnShBwjoNkH4,2846
187
187
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
188
188
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
189
189
  sky/data/data_utils.py,sha256=CNYPM963qby5ddW0DZNbhiWXkqgB9MHh_jrC5DoBctM,33437
@@ -200,12 +200,12 @@ sky/jobs/utils.py,sha256=B3MtsAn8ODXRC1eqrE5cQ7XuUkDuBaUgFkCU4vadOJI,73577
200
200
  sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  sky/jobs/client/sdk.py,sha256=SSdXVvaGCX5DjCfmMf6bSXOH1Dzk-a3bNhr7qNyHSuU,11335
202
202
  sky/jobs/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
203
- sky/jobs/server/core.py,sha256=e6kcXYvlCs6ncX3g5rvBqTd0SIwxomLi-9v8MMltx0Q,32558
203
+ sky/jobs/server/core.py,sha256=TEzLeNJVnqO05n0DKaOWjCHs-TPX7H28b6Kzv7iq3Eo,32723
204
204
  sky/jobs/server/server.py,sha256=ae8JAs-2ipWqL_GsA3x8T2mY-OJLc3ioWg_CfRzCUIY,4011
205
205
  sky/jobs/server/utils.py,sha256=q9KL1VGJ8TBIypzt3U9ozHd90QwRib7CBPrXZypMQ98,3496
206
206
  sky/logs/__init__.py,sha256=zW4gAEvWDz5S53FlLp3krAuKrmTSJ0e3kZDnhxSbW4E,722
207
- sky/logs/agent.py,sha256=TOFzB4rlJF3tNHsluyXLtyE0wAcAUcMaViwksmLTGFw,3218
208
- sky/logs/aws.py,sha256=XVXegScCfItKbTmT-L6YS96zk-jOfBE4g58J6tPYCdA,10560
207
+ sky/logs/agent.py,sha256=tv0C40_FauZpvU93Ro_mC23LnaXWhSTjqch1JQMXiqw,2771
208
+ sky/logs/aws.py,sha256=wj4HiruQ_qG5Lq_it_MNKYa9Bnt6NYq09823hOLLS8o,9670
209
209
  sky/logs/gcp.py,sha256=eKVEcHO3FJRg_YTcE9omE8uAIF6AdBWWpkEPqWFAqXg,3857
210
210
  sky/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
211
  sky/metrics/utils.py,sha256=Cww3yNG4HyW4DEdLOFUayFgMZ16t2JFSvvhuTTV7Vio,7654
@@ -254,10 +254,10 @@ sky/provision/hyperbolic/utils.py,sha256=NCa3ULvIi64-YHYoOnPd3SShlJ6VuQsEwaTBqHF
254
254
  sky/provision/kubernetes/__init__.py,sha256=xzVA9OCga0pCdUAQ7zZiCZMdq-Y0182oHlIKWESA15A,896
255
255
  sky/provision/kubernetes/config.py,sha256=iuKFZdivSaEOZf6PWz3JLju3bqyIuO58jTb9fFUn8nE,29632
256
256
  sky/provision/kubernetes/constants.py,sha256=vZJQsAVjAgwsOskB48tIFSXtNw7IFnJOQE_H6N-vOYQ,1130
257
- sky/provision/kubernetes/instance.py,sha256=oQ_-QD6uAv4b32Q5kB_fRRE3iO_3xmVqPLbYBA0Wd08,59861
257
+ sky/provision/kubernetes/instance.py,sha256=T1ac7efRMF6L5SrH51NNVxGeXmKlUC-tthWhOfchJTI,59914
258
258
  sky/provision/kubernetes/network.py,sha256=Dgj8u7IQBHKHt-mSDhYzue1wfDk96FR_8fO89TwuZ2E,12846
259
259
  sky/provision/kubernetes/network_utils.py,sha256=eEbt8acJW3Ohe6qHZNZ9GAQ29kIZEQX7Q5S08yOuvhA,12220
260
- sky/provision/kubernetes/utils.py,sha256=_RAGGy5etW1Ev-nAb7wZ3tSHVgJqqiMztdQNog9F-5o,150035
260
+ sky/provision/kubernetes/utils.py,sha256=xynvD6qmxaHPTMzw0AD3S6vO-INtFK2JDfaWB30p6CU,151275
261
261
  sky/provision/kubernetes/volume.py,sha256=9u7kDnQxNKvic4ZKJFxGE7fHcMo5N18VQmkVjseRFjU,8059
262
262
  sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml,sha256=S87GNAbDqgTrLuxF-afPAqQ0V-i41El4s_9KBZMuaag,1331
263
263
  sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
@@ -322,13 +322,13 @@ sky/serve/load_balancing_policies.py,sha256=Ssr0GtHKyzzAIEOUAMCLvND5rapmrpxI-OQe
322
322
  sky/serve/replica_managers.py,sha256=x8c1tRIQMN4dVzVUHJpZYSEBtEjOCbcwmqZ_GkVzpnc,64785
323
323
  sky/serve/serve_state.py,sha256=_VinToQp_E0a48qnBvQm5BBlqGlAvuylsGMhxYoKp-w,22590
324
324
  sky/serve/serve_utils.py,sha256=EZ5BlkoNDrAsvNY7njlUnLAuncEhkBUJUxwR1gmCuR8,50443
325
- sky/serve/service.py,sha256=f-Lpxl9YtIprcE3Wr0JUslSvEDylNFe-fyaKIJeKb2c,14315
325
+ sky/serve/service.py,sha256=yQst8qtedLQy1h9F4v2UFumZvHBGn2rOXW3HjUzN8Z4,15072
326
326
  sky/serve/service_spec.py,sha256=t7wh7sx68DKjPyrk1Ub-c1ZjkWD8ehG-YOj9CNdC9qQ,18552
327
327
  sky/serve/spot_placer.py,sha256=auRlYZNg8uIW-lxiirxpDP-iIaJtkrhesm6OGMgwPq4,11288
328
328
  sky/serve/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  sky/serve/client/sdk.py,sha256=PB3U8SgUukBJ3BramFbxeJHHWdjyysqG9V9hIMW9bRE,15184
330
330
  sky/serve/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
331
- sky/serve/server/core.py,sha256=-djglmHVX-A3XTf0A-4pekoQ7-_Me7KzFnQjK8gaDDY,42080
331
+ sky/serve/server/core.py,sha256=6kYcTh_GdIO1QOxL6ONl1BX8nH4qk8E5npDhqMObsPU,43134
332
332
  sky/serve/server/server.py,sha256=A9K37a0nQgZeN3eKWv62Oh2C5TSAReTZ9pHmztqlI-c,4396
333
333
  sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
334
334
  sky/server/common.py,sha256=XRLjlT0zSivdLRukjAQyWrwCVC6Qo-GY3XUjJJRViYQ,35384
@@ -336,7 +336,7 @@ sky/server/config.py,sha256=XWf5Kw4am6vMO5wcyWevbQAFH-dmKb7AMEgDzD083-M,8538
336
336
  sky/server/constants.py,sha256=v6RP8ZEwCNsxO2s2IukgOcEldZO5bvcQaxmOTA0Cf0g,2321
337
337
  sky/server/metrics.py,sha256=6H6n6dq_C5HMaU97mJlRUB9bqOEA_k205PO15wE3AWk,3648
338
338
  sky/server/rest.py,sha256=-oDsI8-NmIcb7aqy_8USB4lQbPWdQibST59GJVtFUi8,7983
339
- sky/server/server.py,sha256=AP2EyeL6N5V1VkRxwhLAOUYZdjkTCc8MYVtlhMoSSUc,73732
339
+ sky/server/server.py,sha256=yBHi0S_zlXlpcjHpWQ05Uf1wturTdZboaQdZ1D-vZe4,73738
340
340
  sky/server/state.py,sha256=YbVOMJ1JipQQv17gLIGyiGN7MKfnP83qlUa5MB1z0Yk,747
341
341
  sky/server/stream_utils.py,sha256=RS4RuMxQqTGqp3uxzZVtmFWzos4d49P7hMX_VklzEVU,9189
342
342
  sky/server/uvicorn.py,sha256=I-JUJwgUznt87hboDd66NTRaw0WtfFVzxxtoxowNqBg,9266
@@ -410,7 +410,7 @@ sky/templates/oci-ray.yml.j2,sha256=TvB2at81DuXSG1QV4dxmqjjMdfDTsCU5T4JH01vI5DU,
410
410
  sky/templates/paperspace-ray.yml.j2,sha256=PcB21RMfxO5Gne1qT7J_JjnZENLVHrAwVegjIEb_F6E,4283
411
411
  sky/templates/runpod-ray.yml.j2,sha256=By2b6BLyaon4dx0b3elXCyLN7Dk1lxvMkYikZgCxjG4,4617
412
412
  sky/templates/scp-ray.yml.j2,sha256=48b_mKtkx_fyEPQUQ_i6YMmylrtGbvIIUkQsuvgTU3I,3481
413
- sky/templates/sky-serve-controller.yaml.j2,sha256=W4i1-OGRU2WDvauLC4EDXcYrNxj7mzRFSvSqzAKfehc,2020
413
+ sky/templates/sky-serve-controller.yaml.j2,sha256=AFOIP3yqOKSvaBDxhTbop70h_SXHiUeEjmUx8ygpBtM,2202
414
414
  sky/templates/skypilot-server-kubernetes-proxy.sh,sha256=n5swq5LauF9dnhDWMYqFFHkXeJ44Zjmg1RVbF60jNbE,1079
415
415
  sky/templates/vast-ray.yml.j2,sha256=Kjq8AtfL86VllOB8vDSnZeKsyv4QJV-80diXO2xuB6g,3020
416
416
  sky/templates/vsphere-ray.yml.j2,sha256=zSCAptPE40wQcxn-bL5GPU-ac5mV9kgsbJXcSJTSWHA,3886
@@ -453,7 +453,7 @@ sky/utils/resource_checker.py,sha256=N18XhoVIqjY1VzmKvxQxRchRgC2WIgcEQyHDkLvg4Y8
453
453
  sky/utils/resources_utils.py,sha256=zcJXHYQt6WtQHKuWEif1QP1NtSO7XQYJBaEs625yV1Y,15958
454
454
  sky/utils/rich_console_utils.py,sha256=wPvAlshaFHuMZSjiDnaK3OSBppZLBjAn-lj7AvxNBQk,553
455
455
  sky/utils/rich_utils.py,sha256=iR6Gf8ZewE9sut4uhkmZwtEelzm3FvckM9K41meQnWM,14650
456
- sky/utils/schemas.py,sha256=-wpV5EwxXgwFrBEjzKxy7-xsfFgEd0J098N_Hs5r3No,55059
456
+ sky/utils/schemas.py,sha256=PB7uYrNsEVu0kHiwZksZK6k35ZP7SnkUuXtphD_g2Lc,55204
457
457
  sky/utils/status_lib.py,sha256=QGkd6COD1GX1h30Mk9RMUdyeUOMJs5971GkxTcFgdsU,1705
458
458
  sky/utils/subprocess_utils.py,sha256=tOpFY_1ml7JkVGAN1o473lcKPklGR95qBCW61eu8kEo,15773
459
459
  sky/utils/tempstore.py,sha256=3S5fJ3UjnE12ve38c3MpTXpoRWfDSGndZpqNe7P_8aU,2148
@@ -477,7 +477,7 @@ sky/utils/kubernetes/deploy_remote_cluster.py,sha256=KECOmpIt_i1qnrC2Ju7sKUlTbQY
477
477
  sky/utils/kubernetes/exec_kubeconfig_converter.py,sha256=fCWX13qvbqvoHghwjWjZdmzfOrcmSiTaQnP6owJ05A8,2256
478
478
  sky/utils/kubernetes/generate_kind_config.py,sha256=_TNLnifA_r7-CRq083IP1xjelYqiLjzQX9ohuqYpDH8,3187
479
479
  sky/utils/kubernetes/generate_kubeconfig.sh,sha256=JnHiFJ8RTULB55jpbbmQrixzxLpc2otbRnUleDakMR4,10694
480
- sky/utils/kubernetes/gpu_labeler.py,sha256=YAwkytFo2j5GyGyX8RqnUXCMBff00Mdm9G_0mmtNZLo,10345
480
+ sky/utils/kubernetes/gpu_labeler.py,sha256=3v5Gwdwt0O5R_7moGCI5C2VgeQeOw9nVbI4JJS8TkUY,10352
481
481
  sky/utils/kubernetes/k8s_gpu_labeler_job.yaml,sha256=k0TBoQ4zgf79-sVkixKSGYFHQ7ZWF5gdVIZPupCCo9A,1224
482
482
  sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488oMQvhRZWwsj9vBbPUg,3812
483
483
  sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=lF9hMg0TVVX1jE8W1xmzkaz66YOwFJvGNws3ICC2syA,15932
@@ -497,9 +497,9 @@ sky/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
497
497
  sky/workspaces/core.py,sha256=MkQoVqWN67tf4VRq284U9vgAw4lwb_cpUfwHQT4V9Ow,16598
498
498
  sky/workspaces/server.py,sha256=Box45DS54xXGHy7I3tGKGy-JP0a8G_z6IhfvGlEXtsA,3439
499
499
  sky/workspaces/utils.py,sha256=IIAiFoS6sdb2t0X5YoX9AietpTanZUQNTK8cePun-sY,2143
500
- skypilot_nightly-1.0.0.dev20250726.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
501
- skypilot_nightly-1.0.0.dev20250726.dist-info/METADATA,sha256=Q2Vbq0xwpI46UJ1Rk2fvEHbztvkzaTXFenWcUkhVVyE,19691
502
- skypilot_nightly-1.0.0.dev20250726.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
503
- skypilot_nightly-1.0.0.dev20250726.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
504
- skypilot_nightly-1.0.0.dev20250726.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
505
- skypilot_nightly-1.0.0.dev20250726.dist-info/RECORD,,
500
+ skypilot_nightly-1.0.0.dev20250729.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
501
+ skypilot_nightly-1.0.0.dev20250729.dist-info/METADATA,sha256=e_BYSuTOuyMDtVrwniLYy43gRgd6PBPaoYR_eRS1ZRM,19691
502
+ skypilot_nightly-1.0.0.dev20250729.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
503
+ skypilot_nightly-1.0.0.dev20250729.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
504
+ skypilot_nightly-1.0.0.dev20250729.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
505
+ skypilot_nightly-1.0.0.dev20250729.dist-info/RECORD,,