xpk 0.14.2__py3-none-any.whl → 0.14.3__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 (39) hide show
  1. xpk/commands/cluster.py +57 -22
  2. xpk/commands/cluster_gcluster_test.py +2 -2
  3. xpk/commands/cluster_test.py +197 -25
  4. xpk/commands/inspector.py +20 -7
  5. xpk/commands/kind.py +1 -1
  6. xpk/commands/workload.py +42 -4
  7. xpk/commands/workload_test.py +88 -5
  8. xpk/core/blueprint/blueprint_definitions.py +16 -1
  9. xpk/core/blueprint/blueprint_generator.py +11 -11
  10. xpk/core/capacity.py +17 -0
  11. xpk/core/capacity_test.py +50 -0
  12. xpk/core/config.py +1 -1
  13. xpk/core/docker_container.py +4 -4
  14. xpk/core/docker_resources.py +11 -11
  15. xpk/core/kjob.py +3 -5
  16. xpk/core/kueue_manager.py +21 -10
  17. xpk/core/kueue_manager_test.py +379 -536
  18. xpk/core/nap.py +1 -1
  19. xpk/core/nodepool.py +9 -9
  20. xpk/core/nodepool_test.py +4 -4
  21. xpk/core/pathways.py +1 -1
  22. xpk/core/resources.py +1 -1
  23. xpk/core/scheduling.py +7 -13
  24. xpk/core/system_characteristics.py +42 -35
  25. xpk/core/system_characteristics_test.py +3 -3
  26. xpk/core/testing/__init__.py +15 -0
  27. xpk/core/testing/commands_tester.py +131 -0
  28. xpk/core/testing/commands_tester_test.py +129 -0
  29. xpk/core/updates.py +57 -0
  30. xpk/core/updates_test.py +80 -0
  31. xpk/main.py +7 -4
  32. xpk/parser/common.py +8 -0
  33. xpk/utils/execution_context.py +20 -2
  34. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/METADATA +1 -3
  35. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/RECORD +39 -33
  36. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/WHEEL +0 -0
  37. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/entry_points.txt +0 -0
  38. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/licenses/LICENSE +0 -0
  39. {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,129 @@
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 pytest_mock import MockerFixture
19
+
20
+ from xpk.core.commands import run_command_for_value, run_command_with_updates_retry
21
+ from xpk.core.testing.commands_tester import CommandsTester
22
+
23
+
24
+ @pytest.fixture
25
+ def mock_commands(mocker: MockerFixture) -> CommandsTester:
26
+ return CommandsTester(
27
+ mocker,
28
+ run_command_for_value_path=(
29
+ "xpk.core.testing.commands_tester_test.run_command_for_value"
30
+ ),
31
+ run_command_with_updates_retry_path=(
32
+ "xpk.core.testing.commands_tester_test.run_command_with_updates_retry"
33
+ ),
34
+ )
35
+
36
+
37
+ def test_run_for_value_default_result(mock_commands: CommandsTester):
38
+ result = run_command_for_value(
39
+ command="cmd foo bar baz qux", task="Test command"
40
+ )
41
+
42
+ assert result == (0, "0")
43
+ mock_commands.assert_command_run("cmd", "bar")
44
+
45
+
46
+ def test_run_command_with_updates_retry_default_result(
47
+ mock_commands: CommandsTester,
48
+ ):
49
+ result = run_command_with_updates_retry(
50
+ command="cmd foo bar baz qux", task="Test command"
51
+ )
52
+
53
+ assert result == 0
54
+ mock_commands.assert_command_run("cmd", "bar")
55
+
56
+
57
+ def test_set_result_for_command(mock_commands: CommandsTester):
58
+ mock_commands.set_result_for_command((17, "Error!"), "cmd", "--err")
59
+
60
+ result = run_command_for_value("cmd foo --err", task="Matching test command")
61
+
62
+ assert result == (17, "Error!")
63
+
64
+
65
+ def test_set_result_for_command_not_matching_other_commands(
66
+ mock_commands: CommandsTester,
67
+ ):
68
+ mock_commands.set_result_for_command((17, "Error!"), "cmd", "--err")
69
+
70
+ result = run_command_for_value(
71
+ "cmd foo bar", task="Not matching test command"
72
+ )
73
+
74
+ assert result == (0, "0")
75
+
76
+
77
+ def test_assert_command_run(mock_commands: CommandsTester):
78
+ run_command_for_value("cmd foo bar", task="Test command")
79
+
80
+ mock_commands.assert_command_run("cmd foo bar")
81
+ mock_commands.assert_command_run("cmd")
82
+ mock_commands.assert_command_run("cmd", "bar")
83
+
84
+
85
+ def test_assert_command_run_twice(mock_commands: CommandsTester):
86
+ run_command_for_value("cmd foo bar", task="Test command")
87
+ run_command_for_value("cmd foo bar", task="Test command")
88
+
89
+ mock_commands.assert_command_run("cmd", times=2)
90
+
91
+
92
+ def test_assert_command_not_run(mock_commands: CommandsTester):
93
+ run_command_for_value("cmd", task="Test command")
94
+
95
+ mock_commands.assert_command_not_run("kubectl")
96
+
97
+
98
+ def test_commands_history_contains_all_commands_in_order(
99
+ mock_commands: CommandsTester,
100
+ ):
101
+ run_command_for_value("cmd1", task="Test command")
102
+ run_command_for_value("cmd2 foo", task="Test command2")
103
+ run_command_for_value("cmd3 bar", task="Test command3")
104
+
105
+ assert mock_commands.commands_history == [
106
+ "cmd1",
107
+ "cmd2 foo",
108
+ "cmd3 bar",
109
+ ]
110
+
111
+
112
+ def test_get_matching_commands(mock_commands: CommandsTester):
113
+ run_command_for_value("cmd", task="Test command")
114
+ run_command_for_value("cmd foo", task="Test command")
115
+ run_command_for_value("cmd foo bar", task="Test command")
116
+
117
+ assert len(mock_commands.get_matching_commands("cmd")) == 3
118
+ assert len(mock_commands.get_matching_commands("cmd", "foo")) == 2
119
+ assert mock_commands.get_matching_commands("cmd", "bar") == ["cmd foo bar"]
120
+
121
+
122
+ def test_get_matching_commands_matches_parts_substrings(
123
+ mock_commands: CommandsTester,
124
+ ):
125
+ run_command_for_value("kubectl apply", task="Test command")
126
+ run_command_for_value("kubectl", task="Test command")
127
+
128
+ assert len(mock_commands.get_matching_commands("kube")) == 2
129
+ assert len(mock_commands.get_matching_commands("ctl apply")) == 1
xpk/core/updates.py ADDED
@@ -0,0 +1,57 @@
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 json
18
+ from json.decoder import JSONDecodeError
19
+ from .commands import run_command_for_value
20
+ from ..utils.console import xpk_print
21
+ from ..utils.execution_context import is_dry_run
22
+ from packaging.version import Version
23
+ from .config import __version__
24
+
25
+
26
+ def get_latest_xpk_version() -> tuple[int, Version | None]:
27
+ if is_dry_run():
28
+ return 0, Version(__version__)
29
+
30
+ return_code, result = run_command_for_value(
31
+ command="pip index versions xpk --json",
32
+ task="Retrieve latest XPK version",
33
+ quiet=True,
34
+ )
35
+
36
+ if return_code != 0:
37
+ return return_code, None
38
+
39
+ try:
40
+ parsed = json.loads(result.strip())
41
+ return 0, Version(parsed["latest"])
42
+ except JSONDecodeError:
43
+ return 1, None
44
+
45
+
46
+ def print_xpk_hello() -> None:
47
+ current_version = Version(__version__)
48
+ xpk_print(f"Starting xpk v{current_version}", flush=True)
49
+ return_code, latest_version = get_latest_xpk_version()
50
+ if return_code != 0 or latest_version is None:
51
+ return
52
+ if current_version < latest_version:
53
+ xpk_print(
54
+ f"XPK version v{current_version} is outdated. Please consider upgrading"
55
+ f" to v{latest_version}",
56
+ flush=True,
57
+ )
@@ -0,0 +1,80 @@
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 ..utils.execution_context import set_dry_run
18
+ from .updates import get_latest_xpk_version, print_xpk_hello
19
+ from packaging.version import Version
20
+ from .config import __version__
21
+ from unittest.mock import MagicMock, patch
22
+
23
+
24
+ def test_get_latest_xpk_version_returns_current_version_for_dry_run():
25
+ set_dry_run(True)
26
+ return_code, version = get_latest_xpk_version()
27
+ assert return_code == 0
28
+ assert version == Version(__version__)
29
+
30
+
31
+ @patch('xpk.core.updates.run_command_for_value')
32
+ def test_get_latest_xpk_version_returns_error_when_underlaying_command_errors(
33
+ run_command_for_value: MagicMock,
34
+ ):
35
+ run_command_for_value.return_value = (1, None)
36
+ set_dry_run(False)
37
+ return_code, version = get_latest_xpk_version()
38
+ assert return_code == 1
39
+ assert version is None
40
+
41
+
42
+ @patch('xpk.core.updates.run_command_for_value')
43
+ def test_get_latest_xpk_version_returns_version_returned_from_command(
44
+ run_command_for_value: MagicMock,
45
+ ):
46
+ run_command_for_value.return_value = (0, '{"latest": "1.0.0"}')
47
+ set_dry_run(False)
48
+ return_code, version = get_latest_xpk_version()
49
+ assert return_code == 0
50
+ assert version == Version('1.0.0')
51
+
52
+
53
+ @patch('xpk.core.updates.xpk_print')
54
+ @patch('xpk.core.updates.get_latest_xpk_version')
55
+ def test_print_xpk_hello_does_not_print_update_when_version_check_fails(
56
+ get_latest_xpk_version: MagicMock, xpk_print: MagicMock
57
+ ):
58
+ get_latest_xpk_version.return_value = (1, None)
59
+ print_xpk_hello()
60
+ xpk_print.assert_called_once()
61
+
62
+
63
+ @patch('xpk.core.updates.xpk_print')
64
+ @patch('xpk.core.updates.get_latest_xpk_version')
65
+ def test_print_xpk_hello_does_not_print_update_when_xpk_is_up_to_date(
66
+ get_latest_xpk_version: MagicMock, xpk_print: MagicMock
67
+ ):
68
+ get_latest_xpk_version.return_value = (0, Version(__version__))
69
+ print_xpk_hello()
70
+ xpk_print.assert_called_once()
71
+
72
+
73
+ @patch('xpk.core.updates.xpk_print')
74
+ @patch('xpk.core.updates.get_latest_xpk_version')
75
+ def test_print_xpk_hello_prints_update_when_xpk_is_outdated(
76
+ get_latest_xpk_version: MagicMock, xpk_print: MagicMock
77
+ ):
78
+ get_latest_xpk_version.return_value = (0, Version('99.99.99'))
79
+ print_xpk_hello()
80
+ assert xpk_print.call_count == 2
xpk/main.py CHANGED
@@ -35,8 +35,9 @@ import argparse
35
35
  import sys
36
36
 
37
37
  from .parser.core import set_parser
38
+ from .core.updates import print_xpk_hello
38
39
  from .utils.console import xpk_print
39
- from .utils.execution_context import set_dry_run
40
+ from .utils.execution_context import set_context
40
41
  ################### Compatibility Check ###################
41
42
  # Check that the user runs the below version or greater.
42
43
 
@@ -62,11 +63,13 @@ def main() -> None:
62
63
  parser = argparse.ArgumentParser(description='xpk command', prog='xpk')
63
64
  set_parser(parser=parser)
64
65
 
65
- xpk_print('Starting xpk', flush=True)
66
66
  main_args = parser.parse_args()
67
67
  main_args.enable_ray_cluster = False
68
- dry_run = 'dry_run' in main_args and main_args.dry_run
69
- set_dry_run(dry_run)
68
+ set_context(
69
+ dry_run_value='dry_run' in main_args and main_args.dry_run,
70
+ quiet_value='quiet' in main_args and main_args.quiet,
71
+ )
72
+ print_xpk_hello()
70
73
  main_args.func(main_args)
71
74
  xpk_print('XPK Done.', flush=True)
72
75
 
xpk/parser/common.py CHANGED
@@ -73,6 +73,14 @@ def add_shared_arguments(
73
73
  ),
74
74
  required=required,
75
75
  )
76
+ custom_parser_or_group.add_argument(
77
+ '--quiet',
78
+ type=bool,
79
+ action=argparse.BooleanOptionalAction,
80
+ default=False,
81
+ help='Disables prompting before unintended destructive actions.',
82
+ required=required,
83
+ )
76
84
 
77
85
 
78
86
  def add_cluster_arguments(
@@ -15,14 +15,32 @@ limitations under the License.
15
15
  """
16
16
 
17
17
  dry_run = False
18
+ quiet = False
18
19
 
19
20
 
20
- def set_dry_run(value: bool) -> None:
21
+ def set_context(dry_run_value: bool, quiet_value: bool) -> None:
22
+ """Sets the dry_run and quiet flags."""
23
+ set_dry_run(dry_run_value)
24
+ set_quiet(quiet_value)
25
+
26
+
27
+ def set_dry_run(dry_run_value: bool) -> None:
21
28
  """Sets the dry_run flag."""
22
29
  global dry_run
23
- dry_run = value
30
+ dry_run = dry_run_value
31
+
32
+
33
+ def set_quiet(quiet_value: bool) -> None:
34
+ """Sets the quiet flag."""
35
+ global quiet
36
+ quiet = quiet_value
24
37
 
25
38
 
26
39
  def is_dry_run() -> bool:
27
40
  """Returns the current value of the dry_run flag."""
28
41
  return dry_run
42
+
43
+
44
+ def is_quiet() -> bool:
45
+ """Returns the current value of the quiet flag."""
46
+ return quiet
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xpk
3
- Version: 0.14.2
3
+ Version: 0.14.3
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
@@ -54,8 +54,6 @@ Dynamic: license-file
54
54
 
55
55
  [![Build Tests](https://github.com/google/xpk/actions/workflows/build_tests.yaml/badge.svg?query=branch%3Amain)](https://github.com/google/xpk/actions/workflows/build_tests.yaml?query=branch%3Amain)
56
56
  [![Nightly Tests](https://github.com/google/xpk/actions/workflows/nightly_tests.yaml/badge.svg?query=branch%3Amain)](https://github.com/google/xpk/actions/workflows/nightly_tests.yaml?query=branch%3Amain)
57
- [![Develop Tests](https://github.com/AI-Hypercomputer/xpk/actions/workflows/build_tests.yaml/badge.svg?query=branch%3Adevelop)](https://github.com/AI-Hypercomputer/xpk/actions/workflows/build_tests.yaml?query=branch%3Adevelop)
58
- [![Develop Nightly Tests](https://github.com/AI-Hypercomputer/xpk/actions/workflows/nightly_tests.yaml/badge.svg?query=branch%3Adevelop)](https://github.com/AI-Hypercomputer/xpk/actions/workflows/nightly_tests.yaml?query=branch%3Adevelop)
59
57
 
60
58
  # Overview
61
59
 
@@ -5,73 +5,79 @@ integration/gcluster_a3ultra_test.py,sha256=8wEtlQN1_uIBUsidvH_l7Ab-ikDpnABrlu9k
5
5
  integration/gcluster_a4_test.py,sha256=GCe6BujHCvM62kIGOd-9Wvz-IrR0BY5d83bGD1cmsQ0,5754
6
6
  integration/gcluster_test.py,sha256=3GSOMszzNW6Yr4T4PFIpmszonwDAAGpSdKutUA77O-g,3304
7
7
  xpk/__init__.py,sha256=7mu-VQDQMyxM5To0KOhuYe4y2TYGsEkfV7hXZmUyih4,561
8
- xpk/main.py,sha256=7YBpzpHxV61c2Js0-uUHUXxTW7cWhLLdMc263rYRW3E,2416
8
+ xpk/main.py,sha256=ZFZCouyUgghk9bE9lpRidwGGGutFBLPAazSt5g3oezY,2503
9
9
  xpk/api/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
10
10
  xpk/api/storage_crd.yaml,sha256=r4WFXnSJJ25EUF-t4Ljfbl-cJoSaiFiZkP8451eTub4,1260
11
11
  xpk/commands/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
12
12
  xpk/commands/batch.py,sha256=Cj1bDpzPMoPdhaKKrOJJLJ3JzRvJrCMn8huQoHHIZJI,4192
13
- xpk/commands/cluster.py,sha256=CG4Ieg3QADNUAwyPzZh0P3mop4Pv1DILrNMJVLvgbi8,41682
13
+ xpk/commands/cluster.py,sha256=YBWeqbF7b22iUoyr_jZEI2NUmADHRx7kB2wnMrT3ink,42828
14
14
  xpk/commands/cluster_gcluster.py,sha256=MOxQfQ19sxaDtDBfIzUdrxw4FpboDIiGFKEtFLwfEgQ,13080
15
- xpk/commands/cluster_gcluster_test.py,sha256=MoMlHbHnCI4ZrnMai1Zw71IP1ORxVVh23cMD5qgXOtQ,6136
16
- xpk/commands/cluster_test.py,sha256=tT1oEUXqNkzElgHZ-UXJGkJEGyakuaPb1cLHjV-eeM0,2800
15
+ xpk/commands/cluster_gcluster_test.py,sha256=52pQprD7f3YWyO8Y0miULK35F8_G6tqKEUYBhMUv_Ug,6130
16
+ xpk/commands/cluster_test.py,sha256=b6z7H0DuhQ7uP5eGBqLNX3BVqBBOWc3QYn5cKcolhyU,7357
17
17
  xpk/commands/common.py,sha256=nxLKPhXuAMW7wq-5xL2YeOgDTMUDcLGMujatOUHJ3s4,2504
18
18
  xpk/commands/config.py,sha256=gFNkf3ibsvZmcPpkpKXe-KJmHO5IKucNwLCXNgKvaDc,836
19
19
  xpk/commands/info.py,sha256=uhv5mPfgg9N-5JhQw4dT2jujL9ZC5kzGA18h9NFfm5A,7429
20
- xpk/commands/inspector.py,sha256=JruseZl9ZIlR9-Lv_pn8YHfLdyiMgHHSf7xPGBAtXTM,12616
20
+ xpk/commands/inspector.py,sha256=7jA0indMDxBAR7iThPHTYKw-k6rQuZbcMTO5TGlp60w,12910
21
21
  xpk/commands/job.py,sha256=rPIfWvgm5mLz7K7YDLK721ZcUcg5OEmYVAPAtRtB5Ag,6718
22
- xpk/commands/kind.py,sha256=NM2CoKJXrYtY9DHZ2yM097WGcI1kno_G2b23tlLVIEI,7658
22
+ xpk/commands/kind.py,sha256=7cqnKrt6gfjXN-coeh_tHBI6drvEOrcms3ZgGjMfbk0,7655
23
23
  xpk/commands/kjob_common.py,sha256=bRaORiGVjPAdN0T3aRmbcQgXYe-EtjoVKePdWzQ5xU4,1928
24
24
  xpk/commands/run.py,sha256=D0zgmnGeBLATphYhzQj29EScxrMmAKqPRhP6nfWuYcY,4085
25
25
  xpk/commands/shell.py,sha256=mRHMwm3Izzsue4bocekm82Rg_cPUaGMClSlvNzNXQ-o,4467
26
26
  xpk/commands/storage.py,sha256=90nz84_ut-uwdIVrxnLYq0K4uYpZWncKM-ZZ_2bRzcI,11505
27
27
  xpk/commands/version.py,sha256=k30rdLP9clUM8eeSwRFhpfzSb1qwcQImTfuC59Ed6CA,771
28
- xpk/commands/workload.py,sha256=S6g2B8bzhM_XNGY4NJUYVODcIuvutKQmdl0VV7jwGzw,29239
29
- xpk/commands/workload_test.py,sha256=e6D1j2Akewq50_76oD84gSCdcW44PEOsIxLPjaL11s8,2344
28
+ xpk/commands/workload.py,sha256=LL2gO-pPhVgC94cA8bHL5HO8qpMB0jG6jLXR93HYwgk,30527
29
+ xpk/commands/workload_test.py,sha256=WCBPem5C5-9HX_6SbLYbiiy6L7huecQKdDpjIG-qBxc,4755
30
30
  xpk/core/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
31
- xpk/core/capacity.py,sha256=ohrVvguNwSv7HufdhAhp9dEtf49QT9eXPaPuI9BuAck,7401
31
+ xpk/core/capacity.py,sha256=vpUIXxwSVeyPQdyfxGBPRRU5Q9q_h07zqRhj-Mp22kg,7958
32
+ xpk/core/capacity_test.py,sha256=rnIVNGJh3impyuk58ixwXfLn3z15GHhzNbLsWAn0i70,1514
32
33
  xpk/core/cluster.py,sha256=BoZzQO7j6Q5vfooFPCv72KDg7zYL_RFLLjxVEMKQsus,26359
33
34
  xpk/core/cluster_private.py,sha256=RLi0C7bV0NEUXl6QKQzvUT0weN9EdqPvjuuOQsNO0DY,6868
34
35
  xpk/core/commands.py,sha256=mtkT_ZsuHj5HTvFAj7mMd8kMXsWoWSA4zqHjlRiFL4o,10369
35
- xpk/core/config.py,sha256=EBGJC2MEmkks-9RpRsW7HFyfa4k-W-8geFIlkm3y44c,3407
36
+ xpk/core/config.py,sha256=vB0HSi5TIPa4EPW5pAZCQ5SCbVrchtgzKZxCF4EY1Vk,3407
36
37
  xpk/core/config_test.py,sha256=v1qfyFRzLkYSQ7Wn4nx1N0dBSOFXidLWDfhkeHDZOVM,1847
37
- xpk/core/docker_container.py,sha256=GvkCJ2S5UKn8uh3pZhRd3X7iS0-PsQpRO8l7QhywVGc,7604
38
+ xpk/core/docker_container.py,sha256=mibRro1MKX5eeV3p-7g7E9pKbMvDjg1e2Ma8p8oPwFw,7592
38
39
  xpk/core/docker_image.py,sha256=MIU397IGIPwkTZFK-ZGEWuc3RmUIF3sQQZUiUj2gLqA,6775
39
40
  xpk/core/docker_manager.py,sha256=JBFgyD6O7LKwEHJC7YuSoCDZqrFRtb-LjgWNqkfAbR0,10566
40
- xpk/core/docker_resources.py,sha256=_aKgpUjyJB2krQ1PkHrotB7K4kByLmPLbuvl_UVvuX8,12843
41
+ xpk/core/docker_resources.py,sha256=bo_6fxvUOMY9XuL0Cps8mvn57K1osAVSgv0lpDGBGh8,12810
41
42
  xpk/core/filestore.py,sha256=mcuUzsAPARbnrBG4fIGsEoN8NmzjaQ6k0tvIwMtjO9k,8068
42
43
  xpk/core/gcloud_context.py,sha256=xZdVoRNLlE-kwXY5djoyQ0I0-KEh5nAohrVql7Jl42k,6649
43
44
  xpk/core/gcloud_context_test.py,sha256=YY0R6j-m62coVK2MAjWXDIdxdP6J5yn6R1RiTDkuExQ,2719
44
45
  xpk/core/gcluster_manager.py,sha256=lyv_MvdnkByy9_PEBj_ugAEBwnCbFNiWTSrEFjrMlPc,6236
45
46
  xpk/core/gcsfuse.py,sha256=kg5pgxdTjgiqquuGjev9fXzJPb8oiWPTK6wzCddzheQ,2125
46
47
  xpk/core/jobset.py,sha256=PJ4Fd8TNNLuYKNOMehoMYRIUEXyc5jsbHctJGqfW_8Y,4037
47
- xpk/core/kjob.py,sha256=symYO3DQfSNP6MAJE54QZuCPDF2kseaxZ-_mmsoBQjo,14478
48
- xpk/core/kueue_manager.py,sha256=PjZ1vjEfKvFdB5Tg5gK2qOm4J6LoHrpaafn5TizUo1A,13292
49
- xpk/core/kueue_manager_test.py,sha256=xN2viTlwrd5pPwn0OSn8RlD_gy13t3vpQfuN7jYFZWo,20062
48
+ xpk/core/kjob.py,sha256=lDdsj6bKu6VC_SpAKUulKLY1hAGagCQeHwe-HqQwnX8,14457
49
+ xpk/core/kueue_manager.py,sha256=39f0R-koMaMvx651aXlSJqpWvsoO26aafe0BcV-xQFg,13627
50
+ xpk/core/kueue_manager_test.py,sha256=sSphrcfPLKVJ2cfvc5vPngrVWi5OBW9TX_T6ECSRg0w,13877
50
51
  xpk/core/monitoring.py,sha256=__bzTq_DIDAK8yIaN4F3MJh-yjYw5X1OlxmRgYOpf1g,4332
51
52
  xpk/core/mtc.py,sha256=pO7p3l-EzLFdTE8MdwWV8i0Zu-7epGql_kPoksVofIU,6259
52
- xpk/core/nap.py,sha256=uA33XccGjEF5RZRO5IpUMMzCf-u6D73cwwPEj4q1qvc,12820
53
+ xpk/core/nap.py,sha256=BhuOPXmLhVs75ffnxtc5CaxF7yteEb1k_GwAKNc-olM,12817
53
54
  xpk/core/network.py,sha256=Oulb7U69lWkpOKxOC1C7ekJDpC51TLwd7XdZA3NQ7E0,10505
54
- xpk/core/nodepool.py,sha256=LfS_RvKHmS7f97hc_UidUC13FFEyGvfageSlt8d-5hw,23227
55
- xpk/core/nodepool_test.py,sha256=YNvp8WXznAI8DscrN9-BSnqII2AtRju2guxrobvCH8A,8805
56
- xpk/core/pathways.py,sha256=s-h_ofMrbFn3J6NFmT5OMe_HiUQIkI90ty7xbS05iA8,10710
55
+ xpk/core/nodepool.py,sha256=2lTMtS8q9Q2CAu5XvgITufac2HMU7DLez84-CGzemDs,23237
56
+ xpk/core/nodepool_test.py,sha256=q4LQEPkFWkozM8lrnbXUVJN1VbFjUdZsVZlFh2uVTmI,8793
57
+ xpk/core/pathways.py,sha256=5b5WOpCmMYWKBz7SOxOXbxAPpAig7k06HSEqjXsOmeg,10707
57
58
  xpk/core/ray.py,sha256=JWhc_ToRHpF4_URGnuE_47FMgamaRsA4KVUMpqThWzw,6145
58
- xpk/core/resources.py,sha256=HlYNPQlaJa5y-pb70aVJzdiiOLDnoACF-wJXePM4ejs,8077
59
- xpk/core/scheduling.py,sha256=_o8QkQxVM-8z5K5ATslM_qQ87f5dzYE0ZeBcwQ6Oqic,9702
59
+ xpk/core/resources.py,sha256=j1BAsIVvwnJ6zsPQDdkl_-SUY_MHumWcUqXPlXtGyLY,8074
60
+ xpk/core/scheduling.py,sha256=MEcVxL-W9Is-3ufWGMwY9mCcQ4BkJsNJDq3oSWhh2L8,9645
60
61
  xpk/core/scheduling_test.py,sha256=m9KcglAbg0qly095PmrUOZxJYUE2UeQmkBNIWn5nFyk,979
61
62
  xpk/core/storage.py,sha256=NILvVAcLNMLmp4wKx_TEKbMMF5X1oL-FrQV46PT0_ds,16902
62
- xpk/core/system_characteristics.py,sha256=qHgqyQF6RVjU059YU0eB66_ia74tV-ogDyZbqCTUfw0,22589
63
- xpk/core/system_characteristics_test.py,sha256=MWvbaEQRoepYNZKOQcs73ppcTKW8plYQ9FQBotfA27I,2250
63
+ xpk/core/system_characteristics.py,sha256=Ok9RUTpLnZh_O1UZpbOcztNEyLphRAlNlgRpGyQz0mo,22561
64
+ xpk/core/system_characteristics_test.py,sha256=37RmnJuvu-Q6dBwiAOHBLsfvk48sML1K36BpWpdRk64,2303
65
+ xpk/core/updates.py,sha256=sJCMyGh9epSz_96yeKMWGIvheqyMFEgxWFFQo7nzEBc,1723
66
+ xpk/core/updates_test.py,sha256=oeGMv-wOHcOhWKGI4GnVLZ4Z_vCxLzLHeXRCi8rIDIM,2704
64
67
  xpk/core/vertex.py,sha256=orIZAVwZruRJQ6-vgc1wShuTsiipdH-zHQ9O4ie_HSA,3638
65
68
  xpk/core/workload.py,sha256=6TVZM15n8W7046VgmmH9Jv54MrhExtLQH3GaiwlV8Xs,8959
66
69
  xpk/core/workload_test.py,sha256=tVTvrwDRXD3O1GCoftgEBWilCYTN74ayP1KRP0vptx0,857
67
70
  xpk/core/blueprint/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
68
- xpk/core/blueprint/blueprint_definitions.py,sha256=5i331XA-2yP_ALyB6XU5tP2Tf9iHcIX5g0TilxQi8zE,1800
69
- xpk/core/blueprint/blueprint_generator.py,sha256=VWhp89upY7vqVFUqcpWR6zwTBoFUSahX2sQxXEdUpSk,36393
71
+ xpk/core/blueprint/blueprint_definitions.py,sha256=OgKkMnz4xAnmnZLaXuehVzNm1Gr2R4HWgofc7qd_mC4,2258
72
+ xpk/core/blueprint/blueprint_generator.py,sha256=R4ReyN4syaq582wiGdcH6s0XCFr7UJ_P07U4IyvZJww,36407
70
73
  xpk/core/blueprint/blueprint_test.py,sha256=T058Dq-x4wQQqjs33BWhjHdT4qJLDwsIcc7vareHh_c,7204
71
74
  xpk/core/blueprint/testing/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
72
75
  xpk/core/remote_state/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
73
76
  xpk/core/remote_state/fuse_remote_state.py,sha256=3Dx4ZZd0NFF5-MlqGWHzz8H4bjYiPOWdF_YSEnKUPQ8,3246
74
77
  xpk/core/remote_state/remote_state_client.py,sha256=6PcR92Xy_RMjlF4AscanQ1jXNHnewLWGNC2v53jbzD4,1077
78
+ xpk/core/testing/__init__.py,sha256=PkV8D9WOtlJHH5AIxsQaKeIBcmupT_Ol_bwJgN6G2I8,561
79
+ xpk/core/testing/commands_tester.py,sha256=mQOSFggESeTdzqG4srAPV9ezmoeT90r22K58yAty9sE,4445
80
+ xpk/core/testing/commands_tester_test.py,sha256=NnLWh7TJ9rKtb-DtB-vwkxvCe5wNtvUJ0f6sOa87Ht4,4023
75
81
  xpk/core/workload_decorators/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
76
82
  xpk/core/workload_decorators/rdma_decorator.py,sha256=isbgPnjdu2AT_Da1nVUIRoGE_qZ7jMDOKCgZOLq5r2A,4006
77
83
  xpk/core/workload_decorators/storage_decorator.py,sha256=DDYQVO1OKTLhveDOA4V6b2RWr4n0fbwHdnoFFmW7iaQ,2000
@@ -82,7 +88,7 @@ xpk/parser/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
82
88
  xpk/parser/batch.py,sha256=mJU-Cp1yTLje59vD-B1IiBcUeD-ZmEsoeB4xhj9cflc,1406
83
89
  xpk/parser/cluster.py,sha256=1cc2pCMbceF6Lx6MXINlgEfiIRUYMITha3eCE6R8SrI,30708
84
90
  xpk/parser/cluster_test.py,sha256=h7lILF2V37WzQSZjGD2jCqI1iWJNY7BLODZf1uhK9QA,1806
85
- xpk/parser/common.py,sha256=1wihGYBe01ci4quZnkeR60-u_lapSOG4WhRFrE3yFR8,8108
91
+ xpk/parser/common.py,sha256=zsCCzlaACO8xX0lpzquTRfHFmykOMjdHlsdo0YGmMq0,8348
86
92
  xpk/parser/config.py,sha256=-XnWx9aFsBW4Uzo_hpOMD2ZQ0bdZLvq1ksv83_5jqSM,1633
87
93
  xpk/parser/core.py,sha256=VRJerlS92ufoQbG1mZv7B04DAP4qGkBHa4pRXgcbAs0,4761
88
94
  xpk/parser/info.py,sha256=UJohxVVWdt9IgUXoPsrVae2DN1BjAVGWrSN2ajrB8RQ,1860
@@ -111,7 +117,7 @@ xpk/templates/storage.yaml,sha256=AykdyMtDnKZF8Y_0BYxoYP03hEIzEk6iNalXAQHgAls,16
111
117
  xpk/templates/volume_bundle.yaml,sha256=sqeag7GPWqGNQ5doZtO9IVAX_vKYRO73-aBE7waEtSY,129
112
118
  xpk/utils/__init__.py,sha256=YPwWBbgLAu7L-YlTVGB2r8ZV4TzypURMRBcehSHHlLY,561
113
119
  xpk/utils/console.py,sha256=hRbvtog_VAzuxt5GfwK5GZdd5SWaa7kvWG8zo_qFRQc,1519
114
- xpk/utils/execution_context.py,sha256=WYxm6NExBIP6iLAWaL5aV858riGJbAHn0Zs6fmKlmzE,784
120
+ xpk/utils/execution_context.py,sha256=hONGz1hQSKE-puah2rE_uN9YUeEC4oW82VOryw5_Vgo,1181
115
121
  xpk/utils/feature_flags.py,sha256=b8zB_zEiKcoOnyGHc7vuQN0ruRTdY8ixqUjWT7Ilp-M,824
116
122
  xpk/utils/file.py,sha256=hi9v4gfwiB3JHi3tnelPbm_dlTUt47U0wvvWKQqMjiQ,2500
117
123
  xpk/utils/gcs_utils.py,sha256=zg-XSTv4G4TFjeT2bNBm2WLdDXPrOZi0rNv_JdppNg4,4113
@@ -125,9 +131,9 @@ xpk/utils/topology_test.py,sha256=jDXCPgBPfByqjhi0W9A5c8uOHOYjRav53nNlg71ipjk,19
125
131
  xpk/utils/validation.py,sha256=-Qd5jqkVzQHkJvmQnGjHjtAcfvz064Vbo6_sl4EnYKw,3497
126
132
  xpk/utils/validation_test.py,sha256=PEDSMUqZdt_Lx1FSR-LOTXKKtsJ47JH1fxugM0Gfz6Y,1168
127
133
  xpk/utils/yaml.py,sha256=j8xuAJ9yAAwnQi6ozwZ-nMnDyDnc3xWkeBZMtSuP4RU,844
128
- xpk-0.14.2.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
129
- xpk-0.14.2.dist-info/METADATA,sha256=XP5pIZaZR0oSR9WDn_vbpq5zHRURGHGJ8kRuVw4-s0I,71934
130
- xpk-0.14.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
131
- xpk-0.14.2.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
132
- xpk-0.14.2.dist-info/top_level.txt,sha256=TQKZWgV7LSElvmunYT9V_627qOMoxq3qYzWAFzKudB8,16
133
- xpk-0.14.2.dist-info/RECORD,,
134
+ xpk-0.14.3.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
135
+ xpk-0.14.3.dist-info/METADATA,sha256=HOH_X3b7o-ynhR0HK95rQrsO8VJm646oVmUpV9lHiRU,71468
136
+ xpk-0.14.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
137
+ xpk-0.14.3.dist-info/entry_points.txt,sha256=mzEtiIesFkT1kmcTUVDA1o3uOhiniX6tIz2wmOlMu1M,38
138
+ xpk-0.14.3.dist-info/top_level.txt,sha256=TQKZWgV7LSElvmunYT9V_627qOMoxq3qYzWAFzKudB8,16
139
+ xpk-0.14.3.dist-info/RECORD,,
File without changes