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.
- xpk/commands/cluster.py +57 -22
- xpk/commands/cluster_gcluster_test.py +2 -2
- xpk/commands/cluster_test.py +197 -25
- xpk/commands/inspector.py +20 -7
- xpk/commands/kind.py +1 -1
- xpk/commands/workload.py +42 -4
- xpk/commands/workload_test.py +88 -5
- xpk/core/blueprint/blueprint_definitions.py +16 -1
- xpk/core/blueprint/blueprint_generator.py +11 -11
- xpk/core/capacity.py +17 -0
- xpk/core/capacity_test.py +50 -0
- xpk/core/config.py +1 -1
- xpk/core/docker_container.py +4 -4
- xpk/core/docker_resources.py +11 -11
- xpk/core/kjob.py +3 -5
- xpk/core/kueue_manager.py +21 -10
- xpk/core/kueue_manager_test.py +379 -536
- xpk/core/nap.py +1 -1
- xpk/core/nodepool.py +9 -9
- xpk/core/nodepool_test.py +4 -4
- xpk/core/pathways.py +1 -1
- xpk/core/resources.py +1 -1
- xpk/core/scheduling.py +7 -13
- xpk/core/system_characteristics.py +42 -35
- xpk/core/system_characteristics_test.py +3 -3
- xpk/core/testing/__init__.py +15 -0
- xpk/core/testing/commands_tester.py +131 -0
- xpk/core/testing/commands_tester_test.py +129 -0
- xpk/core/updates.py +57 -0
- xpk/core/updates_test.py +80 -0
- xpk/main.py +7 -4
- xpk/parser/common.py +8 -0
- xpk/utils/execution_context.py +20 -2
- {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/METADATA +1 -3
- {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/RECORD +39 -33
- {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/WHEEL +0 -0
- {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/entry_points.txt +0 -0
- {xpk-0.14.2.dist-info → xpk-0.14.3.dist-info}/licenses/LICENSE +0 -0
- {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
|
+
)
|
xpk/core/updates_test.py
ADDED
|
@@ -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
|
|
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
|
-
|
|
69
|
-
|
|
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(
|
xpk/utils/execution_context.py
CHANGED
|
@@ -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
|
|
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 =
|
|
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.
|
|
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
|
[](https://github.com/google/xpk/actions/workflows/build_tests.yaml?query=branch%3Amain)
|
|
56
56
|
[](https://github.com/google/xpk/actions/workflows/nightly_tests.yaml?query=branch%3Amain)
|
|
57
|
-
[](https://github.com/AI-Hypercomputer/xpk/actions/workflows/build_tests.yaml?query=branch%3Adevelop)
|
|
58
|
-
[](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=
|
|
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=
|
|
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=
|
|
16
|
-
xpk/commands/cluster_test.py,sha256=
|
|
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=
|
|
20
|
+
xpk/commands/inspector.py,sha256=7jA0indMDxBAR7iThPHTYKw-k6rQuZbcMTO5TGlp60w,12910
|
|
21
21
|
xpk/commands/job.py,sha256=rPIfWvgm5mLz7K7YDLK721ZcUcg5OEmYVAPAtRtB5Ag,6718
|
|
22
|
-
xpk/commands/kind.py,sha256=
|
|
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=
|
|
29
|
-
xpk/commands/workload_test.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
48
|
-
xpk/core/kueue_manager.py,sha256=
|
|
49
|
-
xpk/core/kueue_manager_test.py,sha256=
|
|
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=
|
|
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=
|
|
55
|
-
xpk/core/nodepool_test.py,sha256=
|
|
56
|
-
xpk/core/pathways.py,sha256=
|
|
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=
|
|
59
|
-
xpk/core/scheduling.py,sha256=
|
|
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=
|
|
63
|
-
xpk/core/system_characteristics_test.py,sha256=
|
|
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=
|
|
69
|
-
xpk/core/blueprint/blueprint_generator.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
129
|
-
xpk-0.14.
|
|
130
|
-
xpk-0.14.
|
|
131
|
-
xpk-0.14.
|
|
132
|
-
xpk-0.14.
|
|
133
|
-
xpk-0.14.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|