skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20250907__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.
- sky/__init__.py +2 -2
- sky/adaptors/common.py +24 -1
- sky/adaptors/do.py +8 -2
- sky/backends/backend_utils.py +46 -0
- sky/catalog/__init__.py +1 -0
- sky/clouds/aws.py +4 -6
- sky/clouds/azure.py +12 -13
- sky/clouds/cudo.py +4 -8
- sky/clouds/do.py +5 -6
- sky/clouds/nebius.py +4 -1
- sky/clouds/oci.py +7 -7
- sky/clouds/runpod.py +59 -18
- sky/clouds/vast.py +21 -22
- sky/clouds/vsphere.py +10 -15
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/chunks/{webpack-4fe903277b57b523.js → webpack-6f5f27e9d7900777.js} +1 -1
- sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → i60KpqkwvB9QVScj-NeKo}/_buildManifest.js +1 -1
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs/pools/[pool].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/provision/__init__.py +26 -0
- sky/provision/aws/config.py +30 -12
- sky/provision/kubernetes/__init__.py +2 -0
- sky/provision/kubernetes/volume.py +71 -1
- sky/provision/nebius/instance.py +2 -0
- sky/provision/nebius/utils.py +3 -1
- sky/provision/runpod/volume.py +22 -0
- sky/server/daemons.py +2 -0
- sky/server/requests/executor.py +10 -0
- sky/server/requests/payloads.py +5 -0
- sky/templates/nebius-ray.yml.j2 +1 -0
- sky/utils/common_utils.py +18 -0
- sky/utils/schemas.py +7 -1
- sky/volumes/server/core.py +25 -2
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.dist-info}/METADATA +31 -31
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.dist-info}/RECORD +54 -54
- /sky/dashboard/out/_next/static/chunks/{6856-dca7962af4814e1b.js → 6856-6e2bc8a6fd0867af.js} +0 -0
- /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → i60KpqkwvB9QVScj-NeKo}/_ssgManifest.js +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20250907.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 = '
|
|
10
|
+
_SKYPILOT_COMMIT_SHA = '430be1ad2ab1c3b0cd6d2aab3ce228dbebe562ee'
|
|
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.
|
|
40
|
+
__version__ = '1.0.0.dev20250907'
|
|
41
41
|
__root_dir__ = directory_utils.get_sky_dir()
|
|
42
42
|
|
|
43
43
|
|
sky/adaptors/common.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Lazy import for modules to avoid import error when not used."""
|
|
2
|
+
from importlib import util as importlib_util
|
|
2
3
|
import functools
|
|
3
4
|
import importlib
|
|
4
5
|
import threading
|
|
5
6
|
import types
|
|
6
|
-
from typing import Any, Callable, Optional, Tuple
|
|
7
|
+
from typing import Any, Callable, List, Optional, Tuple
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class LazyImport(types.ModuleType):
|
|
@@ -78,3 +79,25 @@ def load_lazy_modules(modules: Tuple[LazyImport, ...]):
|
|
|
78
79
|
return wrapper
|
|
79
80
|
|
|
80
81
|
return decorator
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def can_import_modules(module_names: List[str]) -> bool:
|
|
85
|
+
""" module availability without actually importing it to
|
|
86
|
+
save memory footprint.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
module_names: List[str], the names of the modules to check.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
True if all modules are available, False otherwise.
|
|
93
|
+
If a module exists in sys.modules, but is set to None,
|
|
94
|
+
then it is considered as not available.
|
|
95
|
+
"""
|
|
96
|
+
try:
|
|
97
|
+
for module_name in module_names:
|
|
98
|
+
module_spec = importlib_util.find_spec(module_name)
|
|
99
|
+
if module_spec is None:
|
|
100
|
+
return False
|
|
101
|
+
return True
|
|
102
|
+
except ValueError:
|
|
103
|
+
return False
|
sky/adaptors/do.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"""Digital Ocean cloud adaptors"""
|
|
2
2
|
|
|
3
|
-
# pylint: disable=import-outside-toplevel
|
|
4
|
-
|
|
5
3
|
from sky.adaptors import common
|
|
6
4
|
|
|
7
5
|
_IMPORT_ERROR_MESSAGE = ('Failed to import dependencies for DO. '
|
|
@@ -16,5 +14,13 @@ _LAZY_MODULES = (pydo, azure)
|
|
|
16
14
|
@common.load_lazy_modules(modules=_LAZY_MODULES)
|
|
17
15
|
def exceptions():
|
|
18
16
|
"""Azure exceptions."""
|
|
17
|
+
# pylint: disable=import-outside-toplevel
|
|
19
18
|
from azure.core import exceptions as azure_exceptions
|
|
20
19
|
return azure_exceptions
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def check_exceptions_dependencies_installed():
|
|
23
|
+
"""Check if the azure.core.exceptions module is installed."""
|
|
24
|
+
if not common.can_import_modules(['azure.core.exceptions']):
|
|
25
|
+
return False, _IMPORT_ERROR_MESSAGE
|
|
26
|
+
return True, None
|
sky/backends/backend_utils.py
CHANGED
|
@@ -767,6 +767,52 @@ def write_cluster_config(
|
|
|
767
767
|
assert region_name in ssh_proxy_command_config, (
|
|
768
768
|
region_name, ssh_proxy_command_config)
|
|
769
769
|
ssh_proxy_command = ssh_proxy_command_config[region_name]
|
|
770
|
+
|
|
771
|
+
use_internal_ips = skypilot_config.get_effective_region_config(
|
|
772
|
+
cloud=str(cloud).lower(),
|
|
773
|
+
region=region.name,
|
|
774
|
+
keys=('use_internal_ips',),
|
|
775
|
+
default_value=False)
|
|
776
|
+
if isinstance(cloud, clouds.AWS):
|
|
777
|
+
# If the use_ssm flag is set to true, we use the ssm proxy command.
|
|
778
|
+
use_ssm = skypilot_config.get_effective_region_config(
|
|
779
|
+
cloud=str(cloud).lower(),
|
|
780
|
+
region=region.name,
|
|
781
|
+
keys=('use_ssm',),
|
|
782
|
+
default_value=False)
|
|
783
|
+
|
|
784
|
+
if use_ssm and ssh_proxy_command is not None:
|
|
785
|
+
raise exceptions.InvalidCloudConfigs(
|
|
786
|
+
'use_ssm is set to true, but ssh_proxy_command '
|
|
787
|
+
f'is already set to {ssh_proxy_command!r}. Please remove '
|
|
788
|
+
'ssh_proxy_command or set use_ssm to false.')
|
|
789
|
+
|
|
790
|
+
if not use_ssm and use_internal_ips and ssh_proxy_command is None:
|
|
791
|
+
logger.warning(
|
|
792
|
+
f'{colorama.Fore.YELLOW}'
|
|
793
|
+
'use_internal_ips is set to true, '
|
|
794
|
+
'but ssh_proxy_command is not set. Defaulting to '
|
|
795
|
+
'using SSM. Specify ssh_proxy_command to use a different '
|
|
796
|
+
'https://docs.skypilot.co/en/latest/reference/config.html#'
|
|
797
|
+
f'aws.ssh_proxy_command.{colorama.Style.RESET_ALL}')
|
|
798
|
+
use_ssm = True
|
|
799
|
+
if use_ssm:
|
|
800
|
+
aws_profile = os.environ.get('AWS_PROFILE', None)
|
|
801
|
+
profile_str = f'--profile {aws_profile}' if aws_profile else ''
|
|
802
|
+
ip_address_filter = ('Name=private-ip-address,Values=%h'
|
|
803
|
+
if use_internal_ips else
|
|
804
|
+
'Name=ip-address,Values=%h')
|
|
805
|
+
get_instance_id_command = 'aws ec2 describe-instances ' + \
|
|
806
|
+
f'--region {region_name} --filters {ip_address_filter} ' + \
|
|
807
|
+
'--query \"Reservations[].Instances[].InstanceId\" ' + \
|
|
808
|
+
f'{profile_str} --output text'
|
|
809
|
+
ssm_proxy_command = 'aws ssm start-session --target ' + \
|
|
810
|
+
f'\"$({get_instance_id_command})\" ' + \
|
|
811
|
+
f'--region {region_name} {profile_str} ' + \
|
|
812
|
+
'--document-name AWS-StartSSHSession ' + \
|
|
813
|
+
'--parameters portNumber=%p'
|
|
814
|
+
ssh_proxy_command = ssm_proxy_command
|
|
815
|
+
region_name = 'ssm-session'
|
|
770
816
|
logger.debug(f'Using ssh_proxy_command: {ssh_proxy_command!r}')
|
|
771
817
|
|
|
772
818
|
# User-supplied global instance tags from ~/.sky/config.yaml.
|
sky/catalog/__init__.py
CHANGED
sky/clouds/aws.py
CHANGED
|
@@ -17,6 +17,7 @@ from sky import provision as provision_lib
|
|
|
17
17
|
from sky import sky_logging
|
|
18
18
|
from sky import skypilot_config
|
|
19
19
|
from sky.adaptors import aws
|
|
20
|
+
from sky.adaptors import common
|
|
20
21
|
from sky.catalog import common as catalog_common
|
|
21
22
|
from sky.clouds.utils import aws_utils
|
|
22
23
|
from sky.skylet import constants
|
|
@@ -787,12 +788,9 @@ class AWS(clouds.Cloud):
|
|
|
787
788
|
stderr=subprocess.PIPE)
|
|
788
789
|
if proc.returncode != 0:
|
|
789
790
|
return False, dependency_installation_hints
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
import boto3
|
|
794
|
-
import botocore
|
|
795
|
-
except ImportError:
|
|
791
|
+
|
|
792
|
+
# Checks if aws boto is installed properly
|
|
793
|
+
if not common.can_import_modules(['boto3', 'botocore']):
|
|
796
794
|
return False, dependency_installation_hints
|
|
797
795
|
|
|
798
796
|
# Checks if AWS credentials 1) exist and 2) are valid.
|
sky/clouds/azure.py
CHANGED
|
@@ -15,6 +15,7 @@ from sky import exceptions
|
|
|
15
15
|
from sky import sky_logging
|
|
16
16
|
from sky import skypilot_config
|
|
17
17
|
from sky.adaptors import azure
|
|
18
|
+
from sky.adaptors import common as adaptors_common
|
|
18
19
|
from sky.clouds.utils import azure_utils
|
|
19
20
|
from sky.utils import annotations
|
|
20
21
|
from sky.utils import common_utils
|
|
@@ -546,6 +547,7 @@ class Azure(clouds.Cloud):
|
|
|
546
547
|
@classmethod
|
|
547
548
|
def _check_credentials(cls) -> Tuple[bool, Optional[str]]:
|
|
548
549
|
"""Checks if the user has access credentials to this cloud."""
|
|
550
|
+
|
|
549
551
|
help_str = (
|
|
550
552
|
' Run the following commands:'
|
|
551
553
|
f'\n{cls._INDENT_PREFIX} $ az login'
|
|
@@ -561,6 +563,16 @@ class Azure(clouds.Cloud):
|
|
|
561
563
|
return (False,
|
|
562
564
|
f'{azure_token_cache_file} does not exist.' + help_str)
|
|
563
565
|
|
|
566
|
+
dependency_installation_hints = (
|
|
567
|
+
'Azure dependencies are not installed. '
|
|
568
|
+
'Run the following commands:'
|
|
569
|
+
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[azure]'
|
|
570
|
+
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set.')
|
|
571
|
+
# Check if the azure blob storage dependencies are installed.
|
|
572
|
+
if not adaptors_common.can_import_modules(
|
|
573
|
+
['azure.storage.blob', 'msgraph']):
|
|
574
|
+
return False, dependency_installation_hints
|
|
575
|
+
|
|
564
576
|
try:
|
|
565
577
|
_run_output('az --version')
|
|
566
578
|
except subprocess.CalledProcessError as e:
|
|
@@ -580,19 +592,6 @@ class Azure(clouds.Cloud):
|
|
|
580
592
|
return False, (f'Getting user\'s Azure identity failed.{help_str}\n'
|
|
581
593
|
f'{cls._INDENT_PREFIX}Details: '
|
|
582
594
|
f'{common_utils.format_exception(e)}')
|
|
583
|
-
|
|
584
|
-
# Check if the azure blob storage dependencies are installed.
|
|
585
|
-
try:
|
|
586
|
-
# pylint: disable=redefined-outer-name, import-outside-toplevel, unused-import
|
|
587
|
-
from azure.storage import blob
|
|
588
|
-
import msgraph
|
|
589
|
-
except ImportError as e:
|
|
590
|
-
return False, (
|
|
591
|
-
f'Azure blob storage depdencies are not installed. '
|
|
592
|
-
'Run the following commands:'
|
|
593
|
-
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[azure]'
|
|
594
|
-
f'\n{cls._INDENT_PREFIX}Details: '
|
|
595
|
-
f'{common_utils.format_exception(e)}')
|
|
596
595
|
return True, None
|
|
597
596
|
|
|
598
597
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
sky/clouds/cudo.py
CHANGED
|
@@ -5,6 +5,7 @@ from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
|
5
5
|
|
|
6
6
|
from sky import catalog
|
|
7
7
|
from sky import clouds
|
|
8
|
+
from sky.adaptors import common
|
|
8
9
|
from sky.utils import common_utils
|
|
9
10
|
from sky.utils import registry
|
|
10
11
|
from sky.utils import resources_utils
|
|
@@ -287,14 +288,9 @@ class Cudo(clouds.Cloud):
|
|
|
287
288
|
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
288
289
|
"""Checks if the user has access credentials to
|
|
289
290
|
Cudo's compute service."""
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
except (ImportError, subprocess.CalledProcessError) as e:
|
|
294
|
-
return False, (
|
|
295
|
-
f'{cls._DEPENDENCY_HINT}\n'
|
|
296
|
-
f'{cls._INDENT_PREFIX}'
|
|
297
|
-
f'{common_utils.format_exception(e, use_bracket=True)}')
|
|
291
|
+
if not common.can_import_modules(['cudo_api']):
|
|
292
|
+
return False, (f'{cls._DEPENDENCY_HINT}\n'
|
|
293
|
+
f'{cls._INDENT_PREFIX}')
|
|
298
294
|
|
|
299
295
|
try:
|
|
300
296
|
_run_output('cudoctl --version')
|
sky/clouds/do.py
CHANGED
|
@@ -283,18 +283,17 @@ class DO(clouds.Cloud):
|
|
|
283
283
|
"""Verify that the user has valid credentials for
|
|
284
284
|
DO's compute service."""
|
|
285
285
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
return False, str(err)
|
|
286
|
+
installed, err_msg = do.check_exceptions_dependencies_installed()
|
|
287
|
+
if not installed:
|
|
288
|
+
return False, err_msg
|
|
290
289
|
|
|
291
290
|
try:
|
|
292
291
|
# attempt to make a CURL request for listing instances
|
|
293
292
|
do_utils.client().droplets.list()
|
|
294
|
-
except do.exceptions().HttpResponseError as err:
|
|
295
|
-
return False, str(err)
|
|
296
293
|
except do_utils.DigitalOceanError as err:
|
|
297
294
|
return False, str(err)
|
|
295
|
+
except do.exceptions().HttpResponseError as err:
|
|
296
|
+
return False, str(err)
|
|
298
297
|
|
|
299
298
|
return True, None
|
|
300
299
|
|
sky/clouds/nebius.py
CHANGED
|
@@ -245,9 +245,12 @@ class Nebius(clouds.Cloud):
|
|
|
245
245
|
'filesystem_mount_tag': f'filesystem-skypilot-{i+1}'
|
|
246
246
|
})
|
|
247
247
|
|
|
248
|
+
use_static_ip_address = skypilot_config.get_nested(
|
|
249
|
+
('nebius', 'use_static_ip_address'), default_value=False)
|
|
248
250
|
resources_vars: Dict[str, Any] = {
|
|
249
251
|
'instance_type': resources.instance_type,
|
|
250
252
|
'custom_resources': custom_resources,
|
|
253
|
+
'use_static_ip_address': use_static_ip_address,
|
|
251
254
|
'region': region.name,
|
|
252
255
|
'image_id': image_family,
|
|
253
256
|
# Nebius does not support specific zones.
|
|
@@ -364,10 +367,10 @@ class Nebius(clouds.Cloud):
|
|
|
364
367
|
f'{_INDENT_PREFIX} $ nebius --format json iam whoami|jq -r \'.user_profile.tenants[0].tenant_id\' > {nebius.tenant_id_path()} \n') # pylint: disable=line-too-long
|
|
365
368
|
if not nebius.is_token_or_cred_file_exist():
|
|
366
369
|
return False, f'{token_cred_msg}'
|
|
367
|
-
sdk = nebius.sdk()
|
|
368
370
|
tenant_id = nebius.get_tenant_id()
|
|
369
371
|
if tenant_id is None:
|
|
370
372
|
return False, f'{tenant_msg}'
|
|
373
|
+
sdk = nebius.sdk()
|
|
371
374
|
try:
|
|
372
375
|
service = nebius.iam().ProjectServiceClient(sdk)
|
|
373
376
|
service.list(
|
sky/clouds/oci.py
CHANGED
|
@@ -28,6 +28,7 @@ from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
|
|
|
28
28
|
from sky import catalog
|
|
29
29
|
from sky import clouds
|
|
30
30
|
from sky import exceptions
|
|
31
|
+
from sky.adaptors import common
|
|
31
32
|
from sky.adaptors import oci as oci_adaptor
|
|
32
33
|
from sky.clouds.utils import oci_utils
|
|
33
34
|
from sky.provision.oci.query_utils import query_helper
|
|
@@ -454,13 +455,12 @@ class OCI(clouds.Cloud):
|
|
|
454
455
|
f'{cls._INDENT_PREFIX} region=us-sanjose-1\n'
|
|
455
456
|
f'{cls._INDENT_PREFIX} key_file=~/.oci/oci_api_key.pem')
|
|
456
457
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
f'{cls._INDENT_PREFIX}{short_credential_help_str}')
|
|
458
|
+
dependency_error_msg = (
|
|
459
|
+
'`oci` is not installed. Install it with: '
|
|
460
|
+
'pip install oci\n'
|
|
461
|
+
f'{cls._INDENT_PREFIX}{short_credential_help_str}')
|
|
462
|
+
if not common.can_import_modules(['oci']):
|
|
463
|
+
return False, dependency_error_msg
|
|
464
464
|
|
|
465
465
|
conf_file = oci_adaptor.get_config_file()
|
|
466
466
|
|
sky/clouds/runpod.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
""" RunPod Cloud. """
|
|
2
2
|
|
|
3
|
+
from importlib import util as import_lib_util
|
|
4
|
+
import os
|
|
3
5
|
import typing
|
|
4
6
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
5
7
|
|
|
@@ -12,9 +14,7 @@ if typing.TYPE_CHECKING:
|
|
|
12
14
|
from sky import resources as resources_lib
|
|
13
15
|
from sky.utils import volume as volume_lib
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
'config.toml',
|
|
17
|
-
]
|
|
17
|
+
_CREDENTIAL_FILE = 'config.toml'
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
@registry.CLOUD_REGISTRY.register
|
|
@@ -285,30 +285,71 @@ class RunPod(clouds.Cloud):
|
|
|
285
285
|
|
|
286
286
|
@classmethod
|
|
287
287
|
def _check_credentials(cls) -> Tuple[bool, Optional[str]]:
|
|
288
|
-
"""
|
|
288
|
+
"""Verify that the user has valid credentials for RunPod. """
|
|
289
|
+
dependency_error_msg = ('Failed to import runpod. '
|
|
290
|
+
'To install, run: pip install skypilot[runpod]')
|
|
289
291
|
try:
|
|
290
|
-
|
|
291
|
-
|
|
292
|
+
runpod_spec = import_lib_util.find_spec('runpod')
|
|
293
|
+
if runpod_spec is None:
|
|
294
|
+
return False, dependency_error_msg
|
|
295
|
+
toml_spec = import_lib_util.find_spec('toml')
|
|
296
|
+
if toml_spec is None:
|
|
297
|
+
return False, dependency_error_msg
|
|
298
|
+
except ValueError:
|
|
299
|
+
# docstring of importlib_util.find_spec:
|
|
300
|
+
# First, sys.modules is checked to see if the module was alread
|
|
301
|
+
# imported.
|
|
302
|
+
# If so, then sys.modules[name].__spec__ is returned.
|
|
303
|
+
# If that happens to be set to None, then ValueError is raised.
|
|
304
|
+
return False, dependency_error_msg
|
|
305
|
+
|
|
306
|
+
valid, error = cls._check_runpod_credentials()
|
|
307
|
+
if not valid:
|
|
308
|
+
return False, (
|
|
309
|
+
f'{error} \n' # First line is indented by 4 spaces
|
|
310
|
+
' Credentials can be set up by running: \n'
|
|
311
|
+
f' $ pip install runpod \n'
|
|
312
|
+
f' $ runpod config\n'
|
|
313
|
+
' For more information, see https://docs.skypilot.co/en/latest/getting-started/installation.html#runpod' # pylint: disable=line-too-long
|
|
314
|
+
)
|
|
292
315
|
|
|
293
|
-
|
|
316
|
+
return True, None
|
|
317
|
+
|
|
318
|
+
@classmethod
|
|
319
|
+
def _check_runpod_credentials(cls, profile: str = 'default'):
|
|
320
|
+
"""Checks if the credentials file exists and is valid."""
|
|
321
|
+
credential_file = os.path.expanduser(f'~/.runpod/{_CREDENTIAL_FILE}')
|
|
322
|
+
if not os.path.exists(credential_file):
|
|
323
|
+
return False, '~/.runpod/config.toml does not exist.'
|
|
324
|
+
|
|
325
|
+
# we don't need to import toml here if config.toml does not exist,
|
|
326
|
+
# wait until we know the cred file exists.
|
|
327
|
+
import tomli as toml # pylint: disable=import-outside-toplevel
|
|
328
|
+
|
|
329
|
+
# Check for default api_key
|
|
330
|
+
try:
|
|
331
|
+
with open(credential_file, 'rb') as cred_file:
|
|
332
|
+
config = toml.load(cred_file)
|
|
333
|
+
|
|
334
|
+
if profile not in config:
|
|
294
335
|
return False, (
|
|
295
|
-
f'
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
336
|
+
f'~/.runpod/config.toml is missing {profile} profile.')
|
|
337
|
+
|
|
338
|
+
if 'api_key' not in config[profile]:
|
|
339
|
+
return (
|
|
340
|
+
False,
|
|
341
|
+
'~/.runpod/config.toml is missing '
|
|
342
|
+
f'api_key for {profile} profile.',
|
|
300
343
|
)
|
|
301
344
|
|
|
302
|
-
|
|
345
|
+
except (TypeError, ValueError):
|
|
346
|
+
return False, '~/.runpod/config.toml is not a valid TOML file.'
|
|
303
347
|
|
|
304
|
-
|
|
305
|
-
return False, ('Failed to import runpod. '
|
|
306
|
-
'To install, run: pip install skypilot[runpod]')
|
|
348
|
+
return True, None
|
|
307
349
|
|
|
308
350
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
|
309
351
|
return {
|
|
310
|
-
f'~/.runpod/{
|
|
311
|
-
for filename in _CREDENTIAL_FILES
|
|
352
|
+
f'~/.runpod/{_CREDENTIAL_FILE}': f'~/.runpod/{_CREDENTIAL_FILE}'
|
|
312
353
|
}
|
|
313
354
|
|
|
314
355
|
@classmethod
|
sky/clouds/vast.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
""" Vast Cloud. """
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import typing
|
|
4
5
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
5
6
|
|
|
6
7
|
from sky import catalog
|
|
7
8
|
from sky import clouds
|
|
9
|
+
from sky.adaptors import common
|
|
8
10
|
from sky.utils import registry
|
|
9
11
|
from sky.utils import resources_utils
|
|
10
12
|
|
|
@@ -12,6 +14,8 @@ if typing.TYPE_CHECKING:
|
|
|
12
14
|
from sky import resources as resources_lib
|
|
13
15
|
from sky.utils import volume as volume_lib
|
|
14
16
|
|
|
17
|
+
_CREDENTIAL_PATH = '~/.config/vastai/vast_api_key'
|
|
18
|
+
|
|
15
19
|
|
|
16
20
|
@registry.CLOUD_REGISTRY.register
|
|
17
21
|
class Vast(clouds.Cloud):
|
|
@@ -253,32 +257,27 @@ class Vast(clouds.Cloud):
|
|
|
253
257
|
def _check_compute_credentials(
|
|
254
258
|
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
255
259
|
"""Checks if the user has valid credentials for
|
|
256
|
-
Vast's compute service.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if vast.creds_source != 'FILE':
|
|
263
|
-
return False, (
|
|
264
|
-
'error \n' # First line is indented by 4 spaces
|
|
265
|
-
' Credentials can be set up by running: \n'
|
|
266
|
-
' $ pip install vastai\n'
|
|
267
|
-
' $ mkdir -p ~/.config/vastai\n'
|
|
268
|
-
' $ echo [key] > ~/.config/vastai/vast_api_key\n'
|
|
269
|
-
' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
|
|
270
|
-
)
|
|
260
|
+
Vast's compute service."""
|
|
261
|
+
|
|
262
|
+
dependency_error_msg = ('Failed to import vast. '
|
|
263
|
+
'To install, run: pip install skypilot[vast]')
|
|
264
|
+
if not common.can_import_modules(['vastai_sdk']):
|
|
265
|
+
return False, dependency_error_msg
|
|
271
266
|
|
|
272
|
-
|
|
267
|
+
if not os.path.exists(os.path.expanduser(_CREDENTIAL_PATH)):
|
|
268
|
+
return False, (
|
|
269
|
+
'error \n' # First line is indented by 4 spaces
|
|
270
|
+
' Credentials can be set up by running: \n'
|
|
271
|
+
' $ pip install vastai\n'
|
|
272
|
+
' $ mkdir -p ~/.config/vastai\n'
|
|
273
|
+
f' $ echo [key] > {_CREDENTIAL_PATH}\n'
|
|
274
|
+
' For more information, see https://skypilot.readthedocs.io/en/latest/getting-started/installation.html#vast' # pylint: disable=line-too-long
|
|
275
|
+
)
|
|
273
276
|
|
|
274
|
-
|
|
275
|
-
return False, ('Failed to import vast. '
|
|
276
|
-
'To install, run: pip install skypilot[vast]')
|
|
277
|
+
return True, None
|
|
277
278
|
|
|
278
279
|
def get_credential_file_mounts(self) -> Dict[str, str]:
|
|
279
|
-
return {
|
|
280
|
-
'~/.config/vastai/vast_api_key': '~/.config/vastai/vast_api_key'
|
|
281
|
-
}
|
|
280
|
+
return {f'{_CREDENTIAL_PATH}': f'{_CREDENTIAL_PATH}'}
|
|
282
281
|
|
|
283
282
|
@classmethod
|
|
284
283
|
def get_user_identities(cls) -> Optional[List[List[str]]]:
|
sky/clouds/vsphere.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
"""Vsphere cloud implementation."""
|
|
2
|
-
import subprocess
|
|
3
2
|
import typing
|
|
4
3
|
from typing import Dict, Iterator, List, Optional, Tuple, Union
|
|
5
4
|
|
|
@@ -9,7 +8,6 @@ from sky.adaptors import common as adaptors_common
|
|
|
9
8
|
from sky.provision.vsphere import vsphere_utils
|
|
10
9
|
from sky.provision.vsphere.vsphere_utils import get_vsphere_credentials
|
|
11
10
|
from sky.provision.vsphere.vsphere_utils import initialize_vsphere_data
|
|
12
|
-
from sky.utils import common_utils
|
|
13
11
|
from sky.utils import registry
|
|
14
12
|
from sky.utils import resources_utils
|
|
15
13
|
|
|
@@ -278,19 +276,16 @@ class Vsphere(clouds.Cloud):
|
|
|
278
276
|
cls) -> Tuple[bool, Optional[Union[str, Dict[str, str]]]]:
|
|
279
277
|
"""Checks if the user has access credentials to
|
|
280
278
|
vSphere's compute service."""
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
|
|
292
|
-
'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
|
|
293
|
-
f'{common_utils.format_exception(e, use_bracket=True)}')
|
|
279
|
+
dependency_error_msg = (
|
|
280
|
+
'vSphere dependencies are not installed. '
|
|
281
|
+
'Run the following commands:'
|
|
282
|
+
f'\n{cls._INDENT_PREFIX} $ pip install skypilot[vSphere]'
|
|
283
|
+
f'\n{cls._INDENT_PREFIX}Credentials may also need to be set. '
|
|
284
|
+
'For more details. See https://docs.skypilot.co/en/latest/getting-started/installation.html#vmware-vsphere' # pylint: disable=line-too-long
|
|
285
|
+
)
|
|
286
|
+
# Check pyVmomi installation.
|
|
287
|
+
if not adaptors_common.can_import_modules(['pyVmomi']):
|
|
288
|
+
return False, dependency_error_msg
|
|
294
289
|
|
|
295
290
|
required_keys = ['name', 'username', 'password', 'clusters']
|
|
296
291
|
skip_key = 'skip_verification'
|
sky/dashboard/out/404.html
CHANGED
|
@@ -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-
|
|
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-6f5f27e9d7900777.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/i60KpqkwvB9QVScj-NeKo/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/i60KpqkwvB9QVScj-NeKo/_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":"i60KpqkwvB9QVScj-NeKo","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
sky/dashboard/out/_next/static/chunks/{webpack-4fe903277b57b523.js → webpack-6f5f27e9d7900777.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(){"use strict";var e,t,n,r,c,o,u,a,f,i={},d={};function s(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}},r=!0;try{i[e](n,n.exports,s),r=!1}finally{r&&delete d[e]}return n.exports}s.m=i,e=[],s.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var u=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],a=!0,f=0;f<n.length;f++)u>=c&&Object.keys(s.O).every(function(e){return s.O[e](n[f])})?n.splice(f--,1):(a=!1,c<u&&(u=c));if(a){e.splice(o--,1);var i=r();void 0!==i&&(t=i)}}return t},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);s.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var u=2&r&&e;"object"==typeof u&&!~t.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},s.d(c,o),c},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return 2350===e?"static/chunks/2350.fab69e61bac57b23.js":
|
|
1
|
+
!function(){"use strict";var e,t,n,r,c,o,u,a,f,i={},d={};function s(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}},r=!0;try{i[e](n,n.exports,s),r=!1}finally{r&&delete d[e]}return n.exports}s.m=i,e=[],s.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var u=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],a=!0,f=0;f<n.length;f++)u>=c&&Object.keys(s.O).every(function(e){return s.O[e](n[f])})?n.splice(f--,1):(a=!1,c<u&&(u=c));if(a){e.splice(o--,1);var i=r();void 0!==i&&(t=i)}}return t},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);s.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var u=2&r&&e;"object"==typeof u&&!~t.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},s.d(c,o),c},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return 2350===e?"static/chunks/2350.fab69e61bac57b23.js":3937===e?"static/chunks/3937.210053269f121201.js":7325===e?"static/chunks/7325.b4bc99ce0892dcd5.js":9025===e?"static/chunks/9025.c12318fb6a1a9093.js":3294===e?"static/chunks/3294.c80326aec9bfed40.js":649===e?"static/chunks/649.b9d7f7d10c1b8c53.js":7669===e?"static/chunks/7669.1f5d9a402bf5cc42.js":4045===e?"static/chunks/4045.b30465273dc5e468.js":4725===e?"static/chunks/4725.10f7a9a5d3ea8208.js":3785===e?"static/chunks/3785.4872a2f3aa489880.js":5339===e?"static/chunks/5339.3fda4a4010ff4e06.js":"static/chunks/"+e+"-"+({616:"3d59f75e2ccf9321",1121:"408ed10b2f9fce17",1141:"943efc7aff0f0c06",1272:"1ef0bf0237faccdb",1836:"37fede578e2da5f8",3015:"86cabed5d4669ad0",3850:"ff4a9a69d978632b",4676:"9da7fdbde90b5549",5739:"d67458fcb1386c92",6130:"2be46d70a38f1e82",6135:"4b4d5e824b7f9d3c",6601:"06114c982db410b6",6856:"6e2bc8a6fd0867af",6989:"01359c57e018caa4",6990:"08b2a1cae076a943",7411:"b15471acd2cba716",8969:"0be3036bf86f8256",9037:"fa1737818d0a0969"})[e]+".js"},s.miniCssF=function(e){},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",s.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,a,f=document.getElementsByTagName("script"),i=0;i<f.length;i++){var d=f[i];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==c+n){u=d;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,s.nc&&u.setAttribute("nonce",s.nc),u.setAttribute("data-webpack",c+n),u.src=s.tu(e)),r[e]=[t];var b=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var c=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),c&&c.forEach(function(e){return e(n)}),t)return t(n)},l=setTimeout(b.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=b.bind(null,u.onerror),u.onload=b.bind(null,u.onload),a&&document.head.appendChild(u)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},s.tu=function(e){return s.tt().createScriptURL(e)},s.p="/dashboard/_next/",u={2272:0},s.f.j=function(e,t){var n=s.o(u,e)?u[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(2272!=e){var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var c=s.p+s.u(e),o=Error();s.l(c,function(t){if(s.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else u[e]=0}},s.O.j=function(e){return 0===u[e]},a=function(e,t){var n,r,c=t[0],o=t[1],a=t[2],f=0;if(c.some(function(e){return 0!==u[e]})){for(n in o)s.o(o,n)&&(s.m[n]=o[n]);if(a)var i=a(s)}for(e&&e(t);f<c.length;f++)r=c[f],s.o(u,r)&&u[r]&&u[r][0](),u[r]=0;return s.O(i)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(a.bind(null,0)),f.push=a.bind(null,f.push.bind(f)),s.nc=void 0}();
|
sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → i60KpqkwvB9QVScj-NeKo}/_buildManifest.js
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__BUILD_MANIFEST=function(s,c,a,e,t,f,b,u,n,o,j,i,r,k){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-444f1804401f04ea.js"],"/_error":["static/chunks/pages/_error-c66a4e8afc46f17b.js"],"/clusters":["static/chunks/pages/clusters-469814d711d63b1b.js"],"/clusters/[cluster]":[s,c,a,f,b,"static/chunks/4676-9da7fdbde90b5549.js",o,e,t,u,j,n,i,"static/chunks/6856-
|
|
1
|
+
self.__BUILD_MANIFEST=function(s,c,a,e,t,f,b,u,n,o,j,i,r,k){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-444f1804401f04ea.js"],"/_error":["static/chunks/pages/_error-c66a4e8afc46f17b.js"],"/clusters":["static/chunks/pages/clusters-469814d711d63b1b.js"],"/clusters/[cluster]":[s,c,a,f,b,"static/chunks/4676-9da7fdbde90b5549.js",o,e,t,u,j,n,i,"static/chunks/6856-6e2bc8a6fd0867af.js",r,k,"static/chunks/9037-fa1737818d0a0969.js","static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js"],"/clusters/[cluster]/[job]":[s,c,a,f,e,t,n,"static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js"],"/config":["static/chunks/pages/config-dfb9bf07b13045f4.js"],"/infra":["static/chunks/pages/infra-aabba60d57826e0f.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-6563820e094f68ca.js"],"/jobs":["static/chunks/pages/jobs-1f70d9faa564804f.js"],"/jobs/pools/[pool]":[s,c,a,b,o,e,t,u,"static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js"],"/jobs/[job]":[s,c,a,f,b,o,e,t,u,n,"static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js"],"/users":["static/chunks/pages/users-018bf31cda52e11b.js"],"/volumes":["static/chunks/pages/volumes-739726d6b823f532.js"],"/workspace/new":["static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js"],"/workspaces":["static/chunks/pages/workspaces-7598c33a746cdc91.js"],"/workspaces/[name]":[s,c,a,f,b,"static/chunks/1836-37fede578e2da5f8.js",e,t,u,j,n,i,r,k,"static/chunks/1141-943efc7aff0f0c06.js","static/chunks/pages/workspaces/[name]-af76bb06dbb3954f.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/pools/[pool]","/jobs/[job]","/users","/volumes","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-3d59f75e2ccf9321.js","static/chunks/6130-2be46d70a38f1e82.js","static/chunks/5739-d67458fcb1386c92.js","static/chunks/6989-01359c57e018caa4.js","static/chunks/3850-ff4a9a69d978632b.js","static/chunks/7411-b15471acd2cba716.js","static/chunks/1272-1ef0bf0237faccdb.js","static/chunks/8969-0be3036bf86f8256.js","static/chunks/6135-4b4d5e824b7f9d3c.js","static/chunks/754-d0da8ab45f9509e9.js","static/chunks/6990-08b2a1cae076a943.js","static/chunks/1121-408ed10b2f9fce17.js","static/chunks/6601-06114c982db410b6.js","static/chunks/3015-86cabed5d4669ad0.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -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-
|
|
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-6f5f27e9d7900777.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-1cbba24bd1bd35f8.js" defer=""></script><script src="/dashboard/_next/static/i60KpqkwvB9QVScj-NeKo/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/i60KpqkwvB9QVScj-NeKo/_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":"i60KpqkwvB9QVScj-NeKo","assetPrefix":"/dashboard","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
|