xpk 0.12.0__py3-none-any.whl → 0.14.0__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.
Files changed (68) hide show
  1. xpk/commands/batch.py +17 -10
  2. xpk/commands/cluster.py +137 -123
  3. xpk/commands/cluster_gcluster.py +77 -14
  4. xpk/commands/cluster_gcluster_test.py +177 -0
  5. xpk/commands/common.py +13 -27
  6. xpk/commands/info.py +11 -9
  7. xpk/commands/inspector.py +22 -11
  8. xpk/commands/job.py +53 -9
  9. xpk/commands/kind.py +38 -40
  10. xpk/commands/kjob_common.py +4 -4
  11. xpk/commands/run.py +9 -2
  12. xpk/commands/shell.py +13 -10
  13. xpk/commands/storage.py +26 -2
  14. xpk/commands/version.py +0 -4
  15. xpk/commands/workload.py +58 -30
  16. xpk/core/blueprint/blueprint_generator.py +4 -40
  17. xpk/core/blueprint/blueprint_test.py +0 -6
  18. xpk/core/capacity.py +6 -5
  19. xpk/core/cluster.py +96 -195
  20. xpk/core/cluster_private.py +9 -12
  21. xpk/core/commands.py +21 -25
  22. xpk/core/config.py +1 -1
  23. xpk/core/docker_image.py +17 -9
  24. xpk/core/docker_resources.py +9 -4
  25. xpk/core/gcloud_context.py +26 -2
  26. xpk/core/gcloud_context_test.py +96 -0
  27. xpk/core/gcluster_manager.py +0 -3
  28. xpk/core/jobset.py +5 -8
  29. xpk/core/kjob.py +19 -29
  30. xpk/core/kueue_manager.py +383 -0
  31. xpk/core/kueue_manager_test.py +542 -0
  32. xpk/core/monitoring.py +1 -1
  33. xpk/core/nap.py +11 -16
  34. xpk/core/network.py +18 -19
  35. xpk/core/nodepool.py +65 -71
  36. xpk/core/nodepool_test.py +198 -1
  37. xpk/core/pathways.py +9 -5
  38. xpk/core/ray.py +11 -15
  39. xpk/core/resources.py +15 -10
  40. xpk/core/scheduling.py +23 -1
  41. xpk/core/scheduling_test.py +31 -0
  42. xpk/core/system_characteristics.py +335 -229
  43. xpk/core/vertex.py +1 -1
  44. xpk/core/workload.py +7 -8
  45. xpk/main.py +3 -2
  46. xpk/parser/cluster.py +50 -0
  47. xpk/parser/cluster_test.py +66 -0
  48. xpk/parser/common.py +11 -0
  49. xpk/parser/workload.py +62 -25
  50. xpk/parser/workload_test.py +82 -0
  51. xpk/utils/execution_context.py +28 -0
  52. xpk/utils/feature_flags.py +28 -0
  53. xpk/utils/file.py +25 -10
  54. xpk/utils/kueue.py +20 -0
  55. xpk/utils/network.py +4 -0
  56. xpk/utils/templates.py +2 -0
  57. xpk/utils/topology.py +37 -0
  58. xpk/utils/topology_test.py +43 -0
  59. xpk/utils/validation.py +79 -55
  60. xpk/utils/validation_test.py +37 -0
  61. {xpk-0.12.0.dist-info → xpk-0.14.0.dist-info}/METADATA +6 -1
  62. xpk-0.14.0.dist-info/RECORD +112 -0
  63. xpk/core/kueue.py +0 -545
  64. xpk-0.12.0.dist-info/RECORD +0 -100
  65. {xpk-0.12.0.dist-info → xpk-0.14.0.dist-info}/WHEEL +0 -0
  66. {xpk-0.12.0.dist-info → xpk-0.14.0.dist-info}/entry_points.txt +0 -0
  67. {xpk-0.12.0.dist-info → xpk-0.14.0.dist-info}/licenses/LICENSE +0 -0
  68. {xpk-0.12.0.dist-info → xpk-0.14.0.dist-info}/top_level.txt +0 -0
xpk/utils/network.py CHANGED
@@ -18,6 +18,7 @@ import ipaddress
18
18
  import socket
19
19
  import requests
20
20
  from .console import xpk_print
21
+ from .execution_context import is_dry_run
21
22
 
22
23
  # Retrives machine's external IP address
23
24
  ip_resolver_url = "http://api.ipify.org"
@@ -36,6 +37,9 @@ def get_current_machine_ip(external_ip=True):
36
37
  The IP address as a string.
37
38
  """
38
39
 
40
+ if is_dry_run():
41
+ return 0, "127.0.0.1"
42
+
39
43
  try:
40
44
  if external_ip:
41
45
  # Get external IP address
xpk/utils/templates.py CHANGED
@@ -18,6 +18,8 @@ import os
18
18
 
19
19
  import ruamel.yaml
20
20
 
21
+ TEMPLATE_PATH = "src/xpk/templates/"
22
+
21
23
  yaml = ruamel.yaml.YAML()
22
24
 
23
25
 
xpk/utils/topology.py ADDED
@@ -0,0 +1,37 @@
1
+ """
2
+ Copyright 2025 Google LLC
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ from functools import reduce
18
+ from operator import mul
19
+
20
+
21
+ def is_topology_valid(topology: str) -> bool:
22
+ try:
23
+ parse_topology(topology)
24
+ return True
25
+ except ValueError:
26
+ return False
27
+
28
+
29
+ def get_topology_product(topology: str) -> int:
30
+ return reduce(mul, parse_topology(topology), 1)
31
+
32
+
33
+ def parse_topology(topology: str) -> list[int]:
34
+ if len(topology) <= 0:
35
+ raise ValueError("Topology is an empty string")
36
+
37
+ return [int(el) for el in topology.lower().split("x")]
@@ -0,0 +1,43 @@
1
+ """
2
+ Copyright 2025 Google LLC
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ import pytest
18
+ from .topology import is_topology_valid, get_topology_product, parse_topology
19
+
20
+
21
+ def test_is_topology_valid_with_invalid_topology():
22
+ result = is_topology_valid("N/A")
23
+ assert result is False
24
+
25
+
26
+ def test_is_topology_valid_with_valid_topology():
27
+ result = is_topology_valid("1x1x1")
28
+ assert result is True
29
+
30
+
31
+ def test_parse_topology_with_valid_topology():
32
+ result = parse_topology("1x2x3")
33
+ assert result == [1, 2, 3]
34
+
35
+
36
+ def test_parse_topology_with_empty_input():
37
+ with pytest.raises(ValueError):
38
+ parse_topology("")
39
+
40
+
41
+ def test_get_topology_product():
42
+ result = get_topology_product("1x2x3")
43
+ assert result == 6
xpk/utils/validation.py CHANGED
@@ -15,66 +15,90 @@ limitations under the License.
15
15
  """
16
16
 
17
17
  from ..core.commands import run_command_for_value
18
+ from ..core.config import __version__ as xpk_version
18
19
  from .console import xpk_exit, xpk_print
19
20
  from ..commands.config import xpk_cfg
20
21
  from ..core.config import DEPENDENCIES_KEY
21
- from ..commands.version import get_xpk_version
22
-
23
-
24
- validation_commands = {
25
- 'kubectl': {
26
- 'command': 'kubectl --help',
27
- 'message': (
28
- '`kubectl` not installed. Please follow'
29
- ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
30
- ' to install xpk prerequisites.'
31
- ),
32
- },
33
- 'kjob': {
34
- 'command': 'kubectl kjob --help',
35
- 'message': (
36
- '`kjobctl` not installed. Please follow'
37
- ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
38
- ' to install xpk prerequisites.'
39
- ),
40
- },
41
- 'gcloud': {
42
- 'command': 'gcloud version',
43
- 'message': (
44
- '`gcloud not installed. Please follow'
45
- ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
46
- ' to install xpk prerequisites.'
47
- ),
48
- },
49
- 'docker': {
50
- 'command': 'docker version',
51
- 'message': (
52
- '`docker` not installed. Please follow'
53
- ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
54
- ' to install xpk prerequisites.'
55
- ),
56
- },
57
- 'kueuectl': {
58
- 'command': 'kubectl kueue --help',
59
- 'message': (
60
- '`kueuectl` not installed. Please follow'
61
- ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
62
- ' to install xpk prerequisites.'
63
- ),
64
- },
65
- }
22
+ from enum import Enum
23
+ from dataclasses import dataclass
24
+
25
+
26
+ @dataclass
27
+ class _SystemDependency:
28
+ command: str
29
+ message: str
30
+
31
+
32
+ class SystemDependency(Enum):
33
+ """Represents required system dependencies."""
34
+
35
+ KUBECTL = _SystemDependency(
36
+ command='kubectl --help',
37
+ message=(
38
+ '`kubectl` not installed. Please follow'
39
+ ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
40
+ ' to install xpk prerequisites.'
41
+ ),
42
+ )
43
+ KJOB = _SystemDependency(
44
+ command='kubectl kjob --help',
45
+ message=(
46
+ '`kjobctl` not installed. Please follow'
47
+ ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
48
+ ' to install xpk prerequisites.'
49
+ ),
50
+ )
51
+ GCLOUD = _SystemDependency(
52
+ command='gcloud version',
53
+ message=(
54
+ '`gcloud not installed. Please follow'
55
+ ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
56
+ ' to install xpk prerequisites.'
57
+ ),
58
+ )
59
+ DOCKER = _SystemDependency(
60
+ command='docker version',
61
+ message=(
62
+ '`docker` not installed. Please follow'
63
+ ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
64
+ ' to install xpk prerequisites.'
65
+ ),
66
+ )
67
+ KUEUECTL = _SystemDependency(
68
+ command='kubectl kueue --help',
69
+ message=(
70
+ '`kueuectl` not installed. Please follow'
71
+ ' https://github.com/AI-Hypercomputer/xpk?tab=readme-ov-file#prerequisites'
72
+ ' to install xpk prerequisites.'
73
+ ),
74
+ )
75
+
76
+
77
+ def should_validate_dependencies(args):
78
+ skip_validation = 'skip_validation' in args and args.skip_validation
79
+ dry_run = 'dry_run' in args and args.dry_run
80
+ return not skip_validation and not dry_run
66
81
 
67
82
 
68
83
  def validate_dependencies():
84
+ """Validates all system dependencies if validation has not been done with current XPK version."""
69
85
  deps_version = xpk_cfg.get(DEPENDENCIES_KEY)
70
- xpk_version = get_xpk_version()
71
86
  if deps_version is None or deps_version != xpk_version:
72
- for name, check in validation_commands.items():
73
- cmd, message = check['command'], check['message']
74
- code, _ = run_command_for_value(
75
- cmd, f'Validate {name} installation.', None
76
- )
77
- if code != 0:
78
- xpk_print(message)
79
- xpk_exit(code)
80
- xpk_cfg.set(DEPENDENCIES_KEY, get_xpk_version())
87
+ validate_dependencies_list(list(SystemDependency))
88
+ xpk_cfg.set(DEPENDENCIES_KEY, xpk_version)
89
+
90
+
91
+ def validate_dependencies_list(dependencies: list[SystemDependency]):
92
+ """Validates a list of system dependencies and returns none or exits with error."""
93
+ for dependency in dependencies:
94
+ _validate_dependency(dependency)
95
+
96
+
97
+ def _validate_dependency(dependency: SystemDependency) -> None:
98
+ """Validates system dependency and returns none or exits with error."""
99
+ name, value = dependency.name, dependency.value
100
+ cmd, message = value.command, value.message
101
+ code, _ = run_command_for_value(cmd, f'Validate {name} installation.')
102
+ if code != 0:
103
+ xpk_print(message)
104
+ xpk_exit(code)
@@ -0,0 +1,37 @@
1
+ """
2
+ Copyright 2025 Google LLC
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ """
16
+
17
+ import pytest
18
+ from .validation import validate_dependencies_list, SystemDependency
19
+
20
+
21
+ def test_validate_dependencies_list_returns_nothing_for_successful_validation(
22
+ mocker,
23
+ ):
24
+ mocker.patch(
25
+ 'xpk.utils.validation.run_command_for_value', return_value=(0, '')
26
+ )
27
+ validate_dependencies_list([SystemDependency.DOCKER])
28
+
29
+
30
+ def test_validate_dependencies_list_exits_with_error_for_failed_validation(
31
+ mocker,
32
+ ):
33
+ mocker.patch(
34
+ 'xpk.utils.validation.run_command_for_value', return_value=(1, '')
35
+ )
36
+ with pytest.raises(SystemExit):
37
+ validate_dependencies_list([SystemDependency.DOCKER])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpk
3
- Version: 0.12.0
3
+ Version: 0.14.0
4
4
  Summary: xpk helps Cloud developers to orchestrate training jobs on accelerators on GKE.
5
5
  Author-email: XPK team <xpk-code-reviewers@google.com>
6
6
  License: Apache-2.0
@@ -22,15 +22,18 @@ Requires-Dist: google-api-core==2.24.1
22
22
  Requires-Dist: packaging==24.2
23
23
  Requires-Dist: google-cloud-filestore==1.12.0
24
24
  Requires-Dist: google-cloud-storage
25
+ Requires-Dist: Jinja2==3.1.6
25
26
  Provides-Extra: dev
26
27
  Requires-Dist: pyink==24.3.0; extra == "dev"
27
28
  Requires-Dist: pylint>=2.6.0; extra == "dev"
28
29
  Requires-Dist: pre-commit; extra == "dev"
29
30
  Requires-Dist: pytest; extra == "dev"
31
+ Requires-Dist: pytest-mock==3.15.1; extra == "dev"
30
32
  Requires-Dist: docker==7.1.0; extra == "dev"
31
33
  Requires-Dist: mypy~=1.17; extra == "dev"
32
34
  Requires-Dist: types-PyYAML==6.0.2; extra == "dev"
33
35
  Requires-Dist: types-docker~=7.1.0.0; extra == "dev"
36
+ Requires-Dist: pylint-per-file-ignores==1.4.0; extra == "dev"
34
37
  Dynamic: license-file
35
38
 
36
39
  <!--
@@ -76,6 +79,7 @@ XPK supports the following TPU types:
76
79
  * v5e
77
80
  * v5p
78
81
  * Trillium (v6e)
82
+ * Ironwood (tpu7x)
79
83
 
80
84
  and the following GPU types:
81
85
  * A100
@@ -83,6 +87,7 @@ and the following GPU types:
83
87
  * A3-Mega (h100-mega) - [Create cluster](#provisioning-a3-ultra-a3-mega-and-a4-clusters-gpu-machines), [Create workloads](#workloads-for-a3-ultra-a3-mega-and-a4-clusters-gpu-machines)
84
88
  * A3-Ultra (h200) - [Create cluster](#provisioning-a3-ultra-a3-mega-and-a4-clusters-gpu-machines), [Create workloads](#workloads-for-a3-ultra-a3-mega-and-a4-clusters-gpu-machines)
85
89
  * A4 (b200) - [Create cluster](#provisioning-a3-ultra-a3-mega-and-a4-clusters-gpu-machines), [Create workloads](#workloads-for-a3-ultra-a3-mega-and-a4-clusters-gpu-machines)
90
+ * A4X (gb200)
86
91
 
87
92
  and the following CPU types:
88
93
  * n2-standard-32
@@ -0,0 +1,112 @@
1
+ xpk/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
2
+ xpk/main.py,sha256=7YBpzpHxV61c2Js0-uUHUXxTW7cWhLLdMc263rYRW3E,2416
3
+ xpk/api/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
4
+ xpk/api/storage_crd.yaml,sha256=r4WFXnSJJ25EUF-t4Ljfbl-cJoSaiFiZkP8451eTub4,1260
5
+ xpk/commands/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
6
+ xpk/commands/batch.py,sha256=Cj1bDpzPMoPdhaKKrOJJLJ3JzRvJrCMn8huQoHHIZJI,4192
7
+ xpk/commands/cluster.py,sha256=plS9p9PW-NPdNgvf30K9fdKo-0VyDk5gd6BX8tizcpM,41219
8
+ xpk/commands/cluster_gcluster.py,sha256=YWNC-ljRJfZG-T1ttkPEklplMsYlBXwJ7JpGpJfdKuE,12918
9
+ xpk/commands/cluster_gcluster_test.py,sha256=MoMlHbHnCI4ZrnMai1Zw71IP1ORxVVh23cMD5qgXOtQ,6136
10
+ xpk/commands/common.py,sha256=wGsZH9qhV4rgzZ5oMvMgrU7i4Z3orNjFU-OgymLs9Lc,2308
11
+ xpk/commands/config.py,sha256=gFNkf3ibsvZmcPpkpKXe-KJmHO5IKucNwLCXNgKvaDc,836
12
+ xpk/commands/info.py,sha256=uhv5mPfgg9N-5JhQw4dT2jujL9ZC5kzGA18h9NFfm5A,7429
13
+ xpk/commands/inspector.py,sha256=JruseZl9ZIlR9-Lv_pn8YHfLdyiMgHHSf7xPGBAtXTM,12616
14
+ xpk/commands/job.py,sha256=rPIfWvgm5mLz7K7YDLK721ZcUcg5OEmYVAPAtRtB5Ag,6718
15
+ xpk/commands/kind.py,sha256=8z9B80Xc-D8bt9iDdWPlqZqzmGFYpqdwokhmySQ5zLY,7619
16
+ xpk/commands/kjob_common.py,sha256=bRaORiGVjPAdN0T3aRmbcQgXYe-EtjoVKePdWzQ5xU4,1928
17
+ xpk/commands/run.py,sha256=D0zgmnGeBLATphYhzQj29EScxrMmAKqPRhP6nfWuYcY,4085
18
+ xpk/commands/shell.py,sha256=mRHMwm3Izzsue4bocekm82Rg_cPUaGMClSlvNzNXQ-o,4467
19
+ xpk/commands/storage.py,sha256=90nz84_ut-uwdIVrxnLYq0K4uYpZWncKM-ZZ_2bRzcI,11505
20
+ xpk/commands/version.py,sha256=k30rdLP9clUM8eeSwRFhpfzSb1qwcQImTfuC59Ed6CA,771
21
+ xpk/commands/workload.py,sha256=Lx1BZx_PsQ7llML4VomurJRSTO4fC9Ohf_DolotiSoA,27894
22
+ xpk/core/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
23
+ xpk/core/capacity.py,sha256=ohrVvguNwSv7HufdhAhp9dEtf49QT9eXPaPuI9BuAck,7401
24
+ xpk/core/cluster.py,sha256=H5-x0xYijQbgINbAIXovu6JoR-9iKnuVQrMVy1xrEP0,26359
25
+ xpk/core/cluster_private.py,sha256=RLi0C7bV0NEUXl6QKQzvUT0weN9EdqPvjuuOQsNO0DY,6868
26
+ xpk/core/commands.py,sha256=mtkT_ZsuHj5HTvFAj7mMd8kMXsWoWSA4zqHjlRiFL4o,10369
27
+ xpk/core/config.py,sha256=JCvW7vetC9-VLEOkeGkydiSklupBRl20imP8zqjR5S4,3407
28
+ xpk/core/config_test.py,sha256=v1qfyFRzLkYSQ7Wn4nx1N0dBSOFXidLWDfhkeHDZOVM,1847
29
+ xpk/core/docker_container.py,sha256=GvkCJ2S5UKn8uh3pZhRd3X7iS0-PsQpRO8l7QhywVGc,7604
30
+ xpk/core/docker_image.py,sha256=MIU397IGIPwkTZFK-ZGEWuc3RmUIF3sQQZUiUj2gLqA,6775
31
+ xpk/core/docker_manager.py,sha256=JBFgyD6O7LKwEHJC7YuSoCDZqrFRtb-LjgWNqkfAbR0,10566
32
+ xpk/core/docker_resources.py,sha256=_aKgpUjyJB2krQ1PkHrotB7K4kByLmPLbuvl_UVvuX8,12843
33
+ xpk/core/filestore.py,sha256=mcuUzsAPARbnrBG4fIGsEoN8NmzjaQ6k0tvIwMtjO9k,8068
34
+ xpk/core/gcloud_context.py,sha256=xZdVoRNLlE-kwXY5djoyQ0I0-KEh5nAohrVql7Jl42k,6649
35
+ xpk/core/gcloud_context_test.py,sha256=YY0R6j-m62coVK2MAjWXDIdxdP6J5yn6R1RiTDkuExQ,2719
36
+ xpk/core/gcluster_manager.py,sha256=lyv_MvdnkByy9_PEBj_ugAEBwnCbFNiWTSrEFjrMlPc,6236
37
+ xpk/core/gcsfuse.py,sha256=kg5pgxdTjgiqquuGjev9fXzJPb8oiWPTK6wzCddzheQ,2125
38
+ xpk/core/jobset.py,sha256=PJ4Fd8TNNLuYKNOMehoMYRIUEXyc5jsbHctJGqfW_8Y,4037
39
+ xpk/core/kjob.py,sha256=symYO3DQfSNP6MAJE54QZuCPDF2kseaxZ-_mmsoBQjo,14478
40
+ xpk/core/kueue_manager.py,sha256=ujEvPLhnnNiHAB0Bosl28OXR3WpWvOOS0K7oP1sVSMc,12129
41
+ xpk/core/kueue_manager_test.py,sha256=BBJLPoTAB0oIA4DGL0MYx08BKcnYXUQMxoQ_8ORQShs,18623
42
+ xpk/core/monitoring.py,sha256=__bzTq_DIDAK8yIaN4F3MJh-yjYw5X1OlxmRgYOpf1g,4332
43
+ xpk/core/mtc.py,sha256=pO7p3l-EzLFdTE8MdwWV8i0Zu-7epGql_kPoksVofIU,6259
44
+ xpk/core/nap.py,sha256=uA33XccGjEF5RZRO5IpUMMzCf-u6D73cwwPEj4q1qvc,12820
45
+ xpk/core/network.py,sha256=Oulb7U69lWkpOKxOC1C7ekJDpC51TLwd7XdZA3NQ7E0,10505
46
+ xpk/core/nodepool.py,sha256=LfS_RvKHmS7f97hc_UidUC13FFEyGvfageSlt8d-5hw,23227
47
+ xpk/core/nodepool_test.py,sha256=YNvp8WXznAI8DscrN9-BSnqII2AtRju2guxrobvCH8A,8805
48
+ xpk/core/pathways.py,sha256=s-h_ofMrbFn3J6NFmT5OMe_HiUQIkI90ty7xbS05iA8,10710
49
+ xpk/core/ray.py,sha256=JWhc_ToRHpF4_URGnuE_47FMgamaRsA4KVUMpqThWzw,6145
50
+ xpk/core/resources.py,sha256=HlYNPQlaJa5y-pb70aVJzdiiOLDnoACF-wJXePM4ejs,8077
51
+ xpk/core/scheduling.py,sha256=_o8QkQxVM-8z5K5ATslM_qQ87f5dzYE0ZeBcwQ6Oqic,9702
52
+ xpk/core/scheduling_test.py,sha256=m9KcglAbg0qly095PmrUOZxJYUE2UeQmkBNIWn5nFyk,979
53
+ xpk/core/storage.py,sha256=NILvVAcLNMLmp4wKx_TEKbMMF5X1oL-FrQV46PT0_ds,16902
54
+ xpk/core/system_characteristics.py,sha256=kRNWwQ6vcLyfII-VcWP1Q3Pvgpo5GRUDTcDHq9e_sPQ,22206
55
+ xpk/core/vertex.py,sha256=orIZAVwZruRJQ6-vgc1wShuTsiipdH-zHQ9O4ie_HSA,3638
56
+ xpk/core/workload.py,sha256=6TVZM15n8W7046VgmmH9Jv54MrhExtLQH3GaiwlV8Xs,8959
57
+ xpk/core/workload_test.py,sha256=tVTvrwDRXD3O1GCoftgEBWilCYTN74ayP1KRP0vptx0,857
58
+ xpk/core/blueprint/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
59
+ xpk/core/blueprint/blueprint_definitions.py,sha256=5i331XA-2yP_ALyB6XU5tP2Tf9iHcIX5g0TilxQi8zE,1800
60
+ xpk/core/blueprint/blueprint_generator.py,sha256=VWhp89upY7vqVFUqcpWR6zwTBoFUSahX2sQxXEdUpSk,36393
61
+ xpk/core/blueprint/blueprint_test.py,sha256=T058Dq-x4wQQqjs33BWhjHdT4qJLDwsIcc7vareHh_c,7204
62
+ xpk/core/remote_state/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
63
+ xpk/core/remote_state/fuse_remote_state.py,sha256=3Dx4ZZd0NFF5-MlqGWHzz8H4bjYiPOWdF_YSEnKUPQ8,3246
64
+ xpk/core/remote_state/remote_state_client.py,sha256=6PcR92Xy_RMjlF4AscanQ1jXNHnewLWGNC2v53jbzD4,1077
65
+ xpk/core/workload_decorators/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
66
+ xpk/core/workload_decorators/rdma_decorator.py,sha256=isbgPnjdu2AT_Da1nVUIRoGE_qZ7jMDOKCgZOLq5r2A,4006
67
+ xpk/core/workload_decorators/storage_decorator.py,sha256=DDYQVO1OKTLhveDOA4V6b2RWr4n0fbwHdnoFFmW7iaQ,2000
68
+ xpk/core/workload_decorators/tcpx_decorator.py,sha256=m5EgzEHjbcOD13ygY91mQdhwQt4Gr5PyalVkKcHyeV8,5975
69
+ xpk/core/workload_decorators/tcpx_decorator_test.py,sha256=iTBS3X_-VwA2oveNDjscduLtll0VOJyFRCp4xmsjg7w,8515
70
+ xpk/core/workload_decorators/tcpxo_decorator.py,sha256=_nLX7tbnxhnS-xv4Jijd1JOP76V4LpNCfW3Np404Cqw,6537
71
+ xpk/parser/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
72
+ xpk/parser/batch.py,sha256=mJU-Cp1yTLje59vD-B1IiBcUeD-ZmEsoeB4xhj9cflc,1406
73
+ xpk/parser/cluster.py,sha256=1cc2pCMbceF6Lx6MXINlgEfiIRUYMITha3eCE6R8SrI,30708
74
+ xpk/parser/cluster_test.py,sha256=h7lILF2V37WzQSZjGD2jCqI1iWJNY7BLODZf1uhK9QA,1806
75
+ xpk/parser/common.py,sha256=1wihGYBe01ci4quZnkeR60-u_lapSOG4WhRFrE3yFR8,8108
76
+ xpk/parser/config.py,sha256=-XnWx9aFsBW4Uzo_hpOMD2ZQ0bdZLvq1ksv83_5jqSM,1633
77
+ xpk/parser/core.py,sha256=VRJerlS92ufoQbG1mZv7B04DAP4qGkBHa4pRXgcbAs0,4761
78
+ xpk/parser/info.py,sha256=UJohxVVWdt9IgUXoPsrVae2DN1BjAVGWrSN2ajrB8RQ,1860
79
+ xpk/parser/inspector.py,sha256=hAPAZ2k9iSJgC1mjnz3rMleInsAQ8PmkyyUKFyBmsgY,1997
80
+ xpk/parser/job.py,sha256=5RdE70rucGfrsn65l7Ho6RmO06mag1S0AO-3saVuXyw,4328
81
+ xpk/parser/kind.py,sha256=sgPCqNVrgmFLcOBEbhlaphwVXxMh_opP9ntCq4KPePE,2682
82
+ xpk/parser/run.py,sha256=oi_ksSyJ8Ooffe2EgoV_ecpmXEmNGVotjpIQH-HjufE,1481
83
+ xpk/parser/shell.py,sha256=VC8p-kz9XjJZW9DXZ-rnv41XnRDRpQRFywHpB5j7tfc,1970
84
+ xpk/parser/storage.py,sha256=XNynqulEzTmT8_G6wkeBwfXX0XQ1lsd6BFcx0H6rGfU,9971
85
+ xpk/parser/validators.py,sha256=-NBZelvfwZRzjz-YUCreD8EzMLHll8PZM-d-MVm2PG4,1192
86
+ xpk/parser/version.py,sha256=eJo4PAbbmRQZulgKBs_ytbVgV9zAaaXeNzMMxmgFMVY,769
87
+ xpk/parser/workload.py,sha256=oI6y66Old_z6PxFPTZ3LvektUsOZ7U8f6g6cscuzh9g,27208
88
+ xpk/parser/workload_test.py,sha256=t0aAqEsAMz1U3xTMrBcm773d9kwYOcvLtQk5n4jqWPw,2075
89
+ xpk/templates/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
90
+ xpk/templates/storage.yaml,sha256=AykdyMtDnKZF8Y_0BYxoYP03hEIzEk6iNalXAQHgAls,163
91
+ xpk/utils/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
92
+ xpk/utils/console.py,sha256=hRbvtog_VAzuxt5GfwK5GZdd5SWaa7kvWG8zo_qFRQc,1519
93
+ xpk/utils/execution_context.py,sha256=WYxm6NExBIP6iLAWaL5aV858riGJbAHn0Zs6fmKlmzE,784
94
+ xpk/utils/feature_flags.py,sha256=b8zB_zEiKcoOnyGHc7vuQN0ruRTdY8ixqUjWT7Ilp-M,824
95
+ xpk/utils/file.py,sha256=hi9v4gfwiB3JHi3tnelPbm_dlTUt47U0wvvWKQqMjiQ,2500
96
+ xpk/utils/gcs_utils.py,sha256=zg-XSTv4G4TFjeT2bNBm2WLdDXPrOZi0rNv_JdppNg4,4113
97
+ xpk/utils/kubectl.py,sha256=WKB9UhpouPN9G4n2ejRi_PgsYLI0R01gzkS1WGU6mJA,1828
98
+ xpk/utils/kueue.py,sha256=P1Pu_crGuOgYxjl8CczTgtQoum0w1sbSLGPOaEZ5180,713
99
+ xpk/utils/network.py,sha256=dGS5rxIm_zaayDElHNlzalaf09M99by5ckL_lGDl_yQ,4293
100
+ xpk/utils/objects.py,sha256=OwMNxB4TGX21qnJPdZo2YBMPMbQPqOtHMh19QhoRNRY,2498
101
+ xpk/utils/templates.py,sha256=mH7up63_-vev7TQF_n2IwhEZHarbzSqCKPRDVP51gVc,845
102
+ xpk/utils/topology.py,sha256=heKgMQxeTEYCD-PVp8m_c7rscdGcGVLx2_kHCDQca50,1039
103
+ xpk/utils/topology_test.py,sha256=UiCurxYGTDrqVlGlAeg-I95-ScOEZQq3roSSwtdG10U,1196
104
+ xpk/utils/validation.py,sha256=-Qd5jqkVzQHkJvmQnGjHjtAcfvz064Vbo6_sl4EnYKw,3497
105
+ xpk/utils/validation_test.py,sha256=PEDSMUqZdt_Lx1FSR-LOTXKKtsJ47JH1fxugM0Gfz6Y,1168
106
+ xpk/utils/yaml.py,sha256=j8xuAJ9yAAwnQi6ozwZ-nMnDyDnc3xWkeBZMtSuP4RU,844
107
+ xpk-0.14.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
108
+ xpk-0.14.0.dist-info/METADATA,sha256=Y2-MopqRDfoUx-owouglTHeDP-88ruOPr4o6oWIBmSE,71934
109
+ xpk-0.14.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
+ xpk-0.14.0.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
111
+ xpk-0.14.0.dist-info/top_level.txt,sha256=aDe4N0jicmuWExx_6w0TxWQJaEuPSs9BnLU-3aF1GLo,4
112
+ xpk-0.14.0.dist-info/RECORD,,