skypilot-nightly 1.0.0.dev20251014__py3-none-any.whl → 1.0.0.dev20251016__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 (51) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +29 -15
  3. sky/backends/cloud_vm_ray_backend.py +30 -13
  4. sky/dashboard/out/404.html +1 -1
  5. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  6. sky/dashboard/out/clusters/[cluster].html +1 -1
  7. sky/dashboard/out/clusters.html +1 -1
  8. sky/dashboard/out/config.html +1 -1
  9. sky/dashboard/out/index.html +1 -1
  10. sky/dashboard/out/infra/[context].html +1 -1
  11. sky/dashboard/out/infra.html +1 -1
  12. sky/dashboard/out/jobs/[job].html +1 -1
  13. sky/dashboard/out/jobs/pools/[pool].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 +13 -1
  21. sky/jobs/constants.py +1 -1
  22. sky/jobs/scheduler.py +2 -4
  23. sky/jobs/server/core.py +2 -1
  24. sky/jobs/server/server.py +5 -3
  25. sky/jobs/state.py +12 -6
  26. sky/jobs/utils.py +8 -2
  27. sky/provision/common.py +2 -0
  28. sky/provision/instance_setup.py +10 -2
  29. sky/provision/kubernetes/instance.py +34 -10
  30. sky/provision/kubernetes/utils.py +9 -0
  31. sky/schemas/generated/jobsv1_pb2.py +52 -52
  32. sky/schemas/generated/jobsv1_pb2.pyi +4 -2
  33. sky/serve/server/server.py +1 -0
  34. sky/server/requests/executor.py +51 -15
  35. sky/server/requests/preconditions.py +2 -4
  36. sky/server/requests/requests.py +14 -23
  37. sky/server/requests/threads.py +106 -0
  38. sky/server/rest.py +36 -18
  39. sky/server/server.py +24 -0
  40. sky/skylet/constants.py +1 -1
  41. sky/skylet/services.py +3 -1
  42. sky/utils/asyncio_utils.py +18 -0
  43. sky/utils/context_utils.py +2 -0
  44. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/METADATA +37 -36
  45. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/RECORD +51 -49
  46. /sky/dashboard/out/_next/static/{9Fek73R28lDp1A5J4N7g7 → pbgtEUoCUdmJyLHjgln5A}/_buildManifest.js +0 -0
  47. /sky/dashboard/out/_next/static/{9Fek73R28lDp1A5J4N7g7 → pbgtEUoCUdmJyLHjgln5A}/_ssgManifest.js +0 -0
  48. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/WHEEL +0 -0
  49. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/entry_points.txt +0 -0
  50. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/licenses/LICENSE +0 -0
  51. {skypilot_nightly-1.0.0.dev20251014.dist-info → skypilot_nightly-1.0.0.dev20251016.dist-info}/top_level.txt +0 -0
sky/__init__.py CHANGED
@@ -7,7 +7,7 @@ import urllib.request
7
7
  from sky.utils import directory_utils
8
8
 
9
9
  # Replaced with the current commit when building the wheels.
10
- _SKYPILOT_COMMIT_SHA = '7bcf0fcb2073aac435139d1d85fc0e66acca26a5'
10
+ _SKYPILOT_COMMIT_SHA = 'f901ee418f19042aed31e5ebd2b067f2af2ae198'
11
11
 
12
12
 
13
13
  def _get_git_commit():
@@ -37,7 +37,7 @@ def _get_git_commit():
37
37
 
38
38
 
39
39
  __commit__ = _get_git_commit()
40
- __version__ = '1.0.0.dev20251014'
40
+ __version__ = '1.0.0.dev20251016'
41
41
  __root_dir__ = directory_utils.get_sky_dir()
42
42
 
43
43
 
@@ -3340,7 +3340,10 @@ def get_clusters(
3340
3340
  force_refresh_statuses=force_refresh_statuses,
3341
3341
  include_user_info=True,
3342
3342
  summary_response=summary_response)
3343
- if 'error' not in record:
3343
+ # record may be None if the cluster is deleted during refresh,
3344
+ # e.g. all the Pods of a cluster on Kubernetes have been
3345
+ # deleted before refresh.
3346
+ if record is not None and 'error' not in record:
3344
3347
  _update_records_with_handle_info([record])
3345
3348
  if include_credentials:
3346
3349
  _update_records_with_credentials([record])
@@ -3360,37 +3363,48 @@ def get_clusters(
3360
3363
  cluster_names_with_launch_request = {
3361
3364
  request.cluster_name for request in requests
3362
3365
  }
3366
+ # Preserve the index of the cluster name as it appears on "records"
3363
3367
  cluster_names_without_launch_request = [
3364
- cluster_name for cluster_name in cluster_names
3368
+ (i, cluster_name)
3369
+ for i, cluster_name in enumerate(cluster_names)
3365
3370
  if cluster_name not in cluster_names_with_launch_request
3366
3371
  ]
3367
3372
  # for clusters that have an active launch request, we do not refresh the status
3368
- updated_records = [
3369
- record for record in records
3370
- if record['name'] in cluster_names_with_launch_request
3371
- ]
3373
+ updated_records = []
3372
3374
  if len(cluster_names_without_launch_request) > 0:
3373
3375
  with progress:
3374
3376
  updated_records = subprocess_utils.run_in_parallel(
3375
- _refresh_cluster_record, cluster_names_without_launch_request)
3376
-
3377
+ _refresh_cluster_record, [
3378
+ cluster_name
3379
+ for _, cluster_name in cluster_names_without_launch_request
3380
+ ])
3381
+ # Preserve the index of the cluster name as it appears on "records"
3382
+ # before filtering for clusters being launched.
3383
+ updated_records_dict: Dict[int, Optional[Dict[str, Any]]] = {
3384
+ cluster_names_without_launch_request[i][0]: updated_records[i]
3385
+ for i in range(len(cluster_names_without_launch_request))
3386
+ }
3377
3387
  # Show information for removed clusters.
3378
3388
  kept_records = []
3379
3389
  autodown_clusters, remaining_clusters, failed_clusters = [], [], []
3380
3390
  for i, record in enumerate(records):
3381
- if updated_records[i] is None:
3391
+ if i not in updated_records_dict:
3392
+ # record was not refreshed, keep the original record
3393
+ kept_records.append(record)
3394
+ continue
3395
+ updated_record = updated_records_dict[i]
3396
+ if updated_record is None:
3382
3397
  if record['to_down']:
3383
- autodown_clusters.append(cluster_names[i])
3398
+ autodown_clusters.append(record['name'])
3384
3399
  else:
3385
- remaining_clusters.append(cluster_names[i])
3386
- elif updated_records[i]['status'] == 'UNKNOWN':
3387
- failed_clusters.append(
3388
- (cluster_names[i], updated_records[i]['error']))
3400
+ remaining_clusters.append(record['name'])
3401
+ elif updated_record['status'] == 'UNKNOWN':
3402
+ failed_clusters.append((record['name'], updated_record['error']))
3389
3403
  # Keep the original record if the status is unknown,
3390
3404
  # so that the user can still see the cluster.
3391
3405
  kept_records.append(record)
3392
3406
  else:
3393
- kept_records.append(updated_records[i])
3407
+ kept_records.append(updated_record)
3394
3408
 
3395
3409
  if autodown_clusters:
3396
3410
  plural = 's' if len(autodown_clusters) > 1 else ''
@@ -605,7 +605,11 @@ class RayCodeGen:
605
605
  # skip the scheduling step.
606
606
  job_lib.scheduler.schedule_step()
607
607
 
608
- total_num_nodes = len(ray.nodes())
608
+ # If some nodes are down and then new nodes are added after launching again,
609
+ # the result of `ray.nodes()` will include all the nodes, so we need to get
610
+ # the alive nodes.
611
+ alive_nodes = [n for n in ray.nodes() if 'Alive' in n and n['Alive']]
612
+ total_num_nodes = len(alive_nodes)
609
613
  setup_bundles = [{{"CPU": _SETUP_CPUS}} for _ in range(total_num_nodes)]
610
614
  setup_pg = ray.util.placement_group(setup_bundles, strategy='STRICT_SPREAD')
611
615
  setup_workers = [run_bash_command_with_log_and_return_pid \\
@@ -4216,6 +4220,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4216
4220
  codegen: str,
4217
4221
  job_id: int,
4218
4222
  managed_job_dag: Optional['dag.Dag'] = None,
4223
+ managed_job_user_id: Optional[str] = None,
4219
4224
  remote_log_dir: Optional[str] = None,
4220
4225
  ) -> None:
4221
4226
  """Executes generated code on the head node."""
@@ -4288,7 +4293,8 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4288
4293
  pool=managed_job_dag.pool,
4289
4294
  workspace=workspace,
4290
4295
  entrypoint=entrypoint,
4291
- tasks=managed_job_tasks)
4296
+ tasks=managed_job_tasks,
4297
+ user_id=managed_job_user_id)
4292
4298
 
4293
4299
  if _is_command_length_over_limit(codegen):
4294
4300
  _dump_code_to_file(codegen)
@@ -4325,7 +4331,8 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4325
4331
  managed_job_dag,
4326
4332
  skypilot_config.get_active_workspace(
4327
4333
  force_user_workspace=True),
4328
- entrypoint=common_utils.get_current_command())
4334
+ entrypoint=common_utils.get_current_command(),
4335
+ user_hash=managed_job_user_id)
4329
4336
  # Set the managed job to PENDING state to make sure that
4330
4337
  # this managed job appears in the `sky jobs queue`, even
4331
4338
  # if it needs to wait to be submitted.
@@ -6270,6 +6277,12 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
6270
6277
  env_vars.update(self._skypilot_predefined_env_vars(handle))
6271
6278
  return env_vars
6272
6279
 
6280
+ def _get_managed_job_user_id(self, task: task_lib.Task) -> Optional[str]:
6281
+ """Returns the user id for the managed job."""
6282
+ if task.managed_job_dag is not None:
6283
+ return task.envs[constants.USER_ID_ENV_VAR]
6284
+ return None
6285
+
6273
6286
  def _execute_task_one_node(self, handle: CloudVmRayResourceHandle,
6274
6287
  task: task_lib.Task, job_id: int,
6275
6288
  remote_log_dir: str) -> None:
@@ -6308,11 +6321,13 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
6308
6321
 
6309
6322
  codegen.add_epilogue()
6310
6323
 
6311
- self._exec_code_on_head(handle,
6312
- codegen.build(),
6313
- job_id,
6314
- managed_job_dag=task.managed_job_dag,
6315
- remote_log_dir=remote_log_dir)
6324
+ self._exec_code_on_head(
6325
+ handle,
6326
+ codegen.build(),
6327
+ job_id,
6328
+ managed_job_dag=task.managed_job_dag,
6329
+ managed_job_user_id=self._get_managed_job_user_id(task),
6330
+ remote_log_dir=remote_log_dir)
6316
6331
 
6317
6332
  def _execute_task_n_nodes(self, handle: CloudVmRayResourceHandle,
6318
6333
  task: task_lib.Task, job_id: int,
@@ -6363,8 +6378,10 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
6363
6378
 
6364
6379
  codegen.add_epilogue()
6365
6380
  # TODO(zhanghao): Add help info for downloading logs.
6366
- self._exec_code_on_head(handle,
6367
- codegen.build(),
6368
- job_id,
6369
- managed_job_dag=task.managed_job_dag,
6370
- remote_log_dir=remote_log_dir)
6381
+ self._exec_code_on_head(
6382
+ handle,
6383
+ codegen.build(),
6384
+ job_id,
6385
+ managed_job_dag=task.managed_job_dag,
6386
+ managed_job_user_id=self._get_managed_job_user_id(task),
6387
+ remote_log_dir=remote_log_dir)
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_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":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_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":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-8f058b0346db2aff.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_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":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D/%5Bjob%5D-8f058b0346db2aff.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_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":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-5fdc9b851a18acdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-49141c317f3a9020.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-477555ab7c0b13d8.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/6856-5fdc9b851a18acdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/1871-49141c317f3a9020.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters/%5Bcluster%5D-477555ab7c0b13d8.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters/[cluster]","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-2f61f65487f6d8ff.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/clusters-2f61f65487f6d8ff.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/clusters","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/config-dfb9bf07b13045f4.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/config","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/index-444f1804401f04ea.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-553b8b5cb65e100b.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra/%5Bcontext%5D-553b8b5cb65e100b.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra/[context]","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-910a22500c50596f.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/infra-910a22500c50596f.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/infra","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-e5c9ce6a24fc0de4.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/%5Bjob%5D-e5c9ce6a24fc0de4.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/[job]","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-bc979970c247d8f3.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/6212-7bd06f60ba693125.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs/pools/%5Bpool%5D-bc979970c247d8f3.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs/pools/[pool]","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-a35a9dc3c5ccd657.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/jobs-a35a9dc3c5ccd657.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/jobs","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-98d2ed979084162a.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/users-98d2ed979084162a.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/users","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-835d14ba94808f79.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/volumes-835d14ba94808f79.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/volumes","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspace/new","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-3b40c39626f99c89.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-e8688c35c06f0ac5.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/616-3d59f75e2ccf9321.js" defer=""></script><script src="/dashboard/_next/static/chunks/6130-2be46d70a38f1e82.js" defer=""></script><script src="/dashboard/_next/static/chunks/5739-d67458fcb1386c92.js" defer=""></script><script src="/dashboard/_next/static/chunks/7411-b15471acd2cba716.js" defer=""></script><script src="/dashboard/_next/static/chunks/1272-1ef0bf0237faccdb.js" defer=""></script><script src="/dashboard/_next/static/chunks/7359-c8d04e06886000b3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6989-01359c57e018caa4.js" defer=""></script><script src="/dashboard/_next/static/chunks/3850-ff4a9a69d978632b.js" defer=""></script><script src="/dashboard/_next/static/chunks/8969-66237729cdf9749e.js" defer=""></script><script src="/dashboard/_next/static/chunks/6990-f6818c84ed8f1c86.js" defer=""></script><script src="/dashboard/_next/static/chunks/6135-4b4d5e824b7f9d3c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1121-d0782b9251f0fcd3.js" defer=""></script><script src="/dashboard/_next/static/chunks/6601-06114c982db410b6.js" defer=""></script><script src="/dashboard/_next/static/chunks/3015-7e0e8f06bb2f881c.js" defer=""></script><script src="/dashboard/_next/static/chunks/1141-3b40c39626f99c89.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces/%5Bname%5D-e8688c35c06f0ac5.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces/[name]","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-69c80d677d3c2949.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/9Fek73R28lDp1A5J4N7g7/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"9Fek73R28lDp1A5J4N7g7","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-66f23594d38c7f16.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/workspaces-69c80d677d3c2949.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/pbgtEUoCUdmJyLHjgln5A/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/workspaces","query":{},"buildId":"pbgtEUoCUdmJyLHjgln5A","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
sky/exceptions.py CHANGED
@@ -649,7 +649,14 @@ class VolumeTopologyConflictError(Exception):
649
649
 
650
650
  class ServerTemporarilyUnavailableError(Exception):
651
651
  """Raised when the server is temporarily unavailable."""
652
- pass
652
+
653
+ def __init__(self, message: str):
654
+ super().__init__(message)
655
+ self.message = message
656
+
657
+ def __str__(self):
658
+ return ('SkyPilot API server is temporarily unavailable: '
659
+ f'{self.message}. Please try again later.')
653
660
 
654
661
 
655
662
  class RestfulPolicyError(Exception):
@@ -686,3 +693,8 @@ class ClientError(Exception):
686
693
  If a request encounters a ClientError, it will not be retried to the server.
687
694
  """
688
695
  pass
696
+
697
+
698
+ class ConcurrentWorkerExhaustedError(Exception):
699
+ """Raised when the concurrent worker is exhausted."""
700
+ pass
sky/jobs/constants.py CHANGED
@@ -46,7 +46,7 @@ JOBS_CLUSTER_NAME_PREFIX_LENGTH = 25
46
46
  # The version of the lib files that jobs/utils use. Whenever there is an API
47
47
  # change for the jobs/utils, we need to bump this version and update
48
48
  # job.utils.ManagedJobCodeGen to handle the version update.
49
- MANAGED_JOBS_VERSION = 10
49
+ MANAGED_JOBS_VERSION = 11
50
50
 
51
51
  # The command for setting up the jobs dashboard on the controller. It firstly
52
52
  # checks if the systemd services are available, and if not (e.g., Kubernetes
sky/jobs/scheduler.py CHANGED
@@ -64,7 +64,6 @@ from sky.jobs import utils as managed_job_utils
64
64
  from sky.server import config as server_config
65
65
  from sky.skylet import constants
66
66
  from sky.utils import annotations
67
- from sky.utils import common_utils
68
67
  from sky.utils import controller_utils
69
68
  from sky.utils import subprocess_utils
70
69
 
@@ -290,9 +289,8 @@ def submit_job(job_id: int, dag_yaml_path: str, original_user_yaml_path: str,
290
289
  maybe_start_controllers(from_scheduler=True)
291
290
  return
292
291
 
293
- state.scheduler_set_waiting(job_id, dag_yaml_path,
294
- original_user_yaml_path, env_file_path,
295
- common_utils.get_user_hash(), priority)
292
+ state.scheduler_set_waiting(job_id, dag_yaml_path, original_user_yaml_path,
293
+ env_file_path, priority)
296
294
  if state.get_ha_recovery_script(job_id) is None:
297
295
  # the run command is just the command that called scheduler
298
296
  run = (f'source {env_file_path} && '
sky/jobs/server/core.py CHANGED
@@ -142,7 +142,8 @@ def _maybe_submit_job_locally(prefix: str, dag: 'sky.Dag',
142
142
  force_user_workspace=True),
143
143
  entrypoint=common_utils.get_current_command(),
144
144
  pool=pool,
145
- pool_hash=pool_hash))
145
+ pool_hash=pool_hash,
146
+ user_hash=common_utils.get_user_hash()))
146
147
  for task_id, task in enumerate(dag.tasks):
147
148
  resources_str = backend_utils.get_task_resources_str(
148
149
  task, is_managed_job=True)
sky/jobs/server/server.py CHANGED
@@ -99,6 +99,8 @@ async def logs(
99
99
  # When refresh is specified, the job controller might be restarted,
100
100
  # which takes longer time to finish. We schedule it to long executor.
101
101
  schedule_type = api_requests.ScheduleType.LONG
102
+ if schedule_type == api_requests.ScheduleType.SHORT:
103
+ executor.check_request_thread_executor_available()
102
104
  request_task = executor.prepare_request(
103
105
  request_id=request.state.request_id,
104
106
  request_name='jobs.logs',
@@ -107,14 +109,14 @@ async def logs(
107
109
  schedule_type=schedule_type,
108
110
  request_cluster_name=common.JOB_CONTROLLER_NAME,
109
111
  )
110
- if schedule_type == api_requests.ScheduleType.LONG:
111
- executor.schedule_prepared_request(request_task)
112
- else:
112
+ if schedule_type == api_requests.ScheduleType.SHORT:
113
113
  # For short request, run in the coroutine to avoid blocking
114
114
  # short workers.
115
115
  task = executor.execute_request_in_coroutine(request_task)
116
116
  # Cancel the coroutine after the request is done or client disconnects
117
117
  background_tasks.add_task(task.cancel)
118
+ else:
119
+ executor.schedule_prepared_request(request_task)
118
120
 
119
121
  return stream_utils.stream_response_for_long_request(
120
122
  request_id=request_task.request_id,
sky/jobs/state.py CHANGED
@@ -692,8 +692,8 @@ class ManagedJobScheduleState(enum.Enum):
692
692
  # === Status transition functions ===
693
693
  @_init_db
694
694
  def set_job_info_without_job_id(name: str, workspace: str, entrypoint: str,
695
- pool: Optional[str],
696
- pool_hash: Optional[str]) -> int:
695
+ pool: Optional[str], pool_hash: Optional[str],
696
+ user_hash: Optional[str]) -> int:
697
697
  assert _SQLALCHEMY_ENGINE is not None
698
698
  with orm.Session(_SQLALCHEMY_ENGINE) as session:
699
699
  if (_SQLALCHEMY_ENGINE.dialect.name ==
@@ -712,6 +712,7 @@ def set_job_info_without_job_id(name: str, workspace: str, entrypoint: str,
712
712
  entrypoint=entrypoint,
713
713
  pool=pool,
714
714
  pool_hash=pool_hash,
715
+ user_hash=user_hash,
715
716
  )
716
717
 
717
718
  if (_SQLALCHEMY_ENGINE.dialect.name ==
@@ -1241,7 +1242,7 @@ def get_task_specs(job_id: int, task_id: int) -> Dict[str, Any]:
1241
1242
  @_init_db
1242
1243
  def scheduler_set_waiting(job_id: int, dag_yaml_path: str,
1243
1244
  original_user_yaml_path: str, env_file_path: str,
1244
- user_hash: str, priority: int):
1245
+ priority: int):
1245
1246
  """Do not call without holding the scheduler lock.
1246
1247
 
1247
1248
  Returns: Whether this is a recovery run or not.
@@ -1260,7 +1261,6 @@ def scheduler_set_waiting(job_id: int, dag_yaml_path: str,
1260
1261
  job_info_table.c.dag_yaml_path: dag_yaml_path,
1261
1262
  job_info_table.c.original_user_yaml_path: original_user_yaml_path,
1262
1263
  job_info_table.c.env_file_path: env_file_path,
1263
- job_info_table.c.user_hash: user_hash,
1264
1264
  job_info_table.c.priority: priority,
1265
1265
  })
1266
1266
  session.commit()
@@ -2000,8 +2000,13 @@ async def scheduler_set_done_async(job_id: int,
2000
2000
 
2001
2001
 
2002
2002
  @_init_db
2003
- def set_job_info(job_id: int, name: str, workspace: str, entrypoint: str,
2004
- pool: Optional[str], pool_hash: Optional[str]):
2003
+ def set_job_info(job_id: int,
2004
+ name: str,
2005
+ workspace: str,
2006
+ entrypoint: str,
2007
+ pool: Optional[str],
2008
+ pool_hash: Optional[str],
2009
+ user_hash: Optional[str] = None):
2005
2010
  assert _SQLALCHEMY_ENGINE is not None
2006
2011
  with orm.Session(_SQLALCHEMY_ENGINE) as session:
2007
2012
  if (_SQLALCHEMY_ENGINE.dialect.name ==
@@ -2020,6 +2025,7 @@ def set_job_info(job_id: int, name: str, workspace: str, entrypoint: str,
2020
2025
  entrypoint=entrypoint,
2021
2026
  pool=pool,
2022
2027
  pool_hash=pool_hash,
2028
+ user_hash=user_hash,
2023
2029
  )
2024
2030
  session.execute(insert_stmt)
2025
2031
  session.commit()