Conversation
✅ Deploy Preview for jumpstarter-docs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
Warning Rate limit exceeded@michalskrivanek has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 12 minutes and 19 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
WalkthroughRemoved click_group parameters from several client CLI methods and switched their decorators to standalone @click.command; simplified composite client to always call child v.cli() without inspecting signatures; updated TMT tests to invoke the flattened CLI shape. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant ClickCLI as Click
participant Driver as SSH/TMT Client
rect rgba(200,230,255,0.25)
note over ClickCLI: Standalone command registration
User->>ClickCLI: invoke "ssh" / "tmt" (flat CLI)
ClickCLI->>Driver: call cli()
Driver->>Driver: execute command logic
Driver-->>User: produce output
end
sequenceDiagram
autonumber
actor Orchestrator
participant Composite as CompositeClient
participant Child as ChildClient
rect rgba(220,255,220,0.25)
note over Composite: Simplified child registration flow
Orchestrator->>Composite: register children
Composite->>Child: call v.cli() (no args)
Child->>Composite: returns Command
Composite-->>Orchestrator: attach subcommand
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@mangelajo I don't entirely follow the logic of how the drivers stack up, but it seems to me the driver should not modify the parent on its own. Composite driver then does it when it should show up under same level as something else. |
The idea is that we didn't want to register subcommands , and put it on the level of the parent, I am going to download and play around. |
mangelajo
left a comment
There was a problem hiding this comment.
Ok, your patch work, and makes sense now that I read it more carefully.
What does not make sense is what I did here jumpstarter-dev/jumpstarter@b99802b just for this driver.
Can you revert the patch as part of your PR ?
06fd4f7 to
e438b80
Compare
|
oh... it was used on tmt too.. so same change is necessary on tmt as you saw on the other PR '':D sorry I should have done the rest of the cleanup myself on another PR |
|
@coderabbitai, can you make a committable suggestion to also remove the click_group reception on the tmt driver client cli? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 7240 @mangelajo, the change you requested has already been made in this PR! Looking at
The TMT driver now follows the same pattern as the SSH driver - both have been updated to not receive or modify the parent click group, which aligns with the PR's objective. |
oh right, can you update unit tests to handle that too? =================================== FAILURES ===================================
E TypeError: TMTClient.cli() takes 1 positional argument but 2 were given jumpstarter_driver_tmt/driver_test.py:27: TypeError
E TypeError: TMTClient.cli() takes 1 positional argument but 2 were given jumpstarter_driver_tmt/driver_test.py:49: TypeError
E TypeError: TMTClient.cli() takes 1 positional argument but 2 were given jumpstarter_driver_tmt/driver_test.py:81: TypeError
E TypeError: TMTClient.cli() takes 1 positional argument but 2 were given jumpstarter_driver_tmt/driver_test.py:97: TypeError
E TypeError: TMTClient.cli() takes 1 positional argument but 2 were given jumpstarter_driver_tmt/driver_test.py:431: TypeError |
|
@coderabbitai can you make a commitable suggestion to fix the tmt unit tests? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 18587 @mangelajo, here's the fix for the TMT unit tests. The issue is that all the test functions are calling Here's the corrected test file: from unittest.mock import MagicMock, patch
import click
import pytest
from click.testing import CliRunner
from jumpstarter_driver_network.driver import TcpNetwork
from .client import replace_provision_args
from .driver import TMT
from jumpstarter.common.utils import serve
def test_drivers_tmt():
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
assert client.ssh.address() == "tcp://127.0.0.1:22"
def test_drivers_tmt_cli():
"""Test the CLI functionality with tmt command and arguments"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
# Test the CLI tmt command without arguments
runner = CliRunner()
cli = client.cli()
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0 # Success return code
result = runner.invoke(cli, ["tmt"])
assert result.exit_code == 0
mock_run_tmt.assert_called_once()
# Test the CLI tmt command with arguments
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0 # Success return code
result = runner.invoke(cli, ["tmt", "test", "arg1", "arg2"])
assert result.exit_code == 0
mock_run_tmt.assert_called_once()
def test_drivers_tmt_cli_with_options():
"""Test the CLI functionality with various options"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
runner = CliRunner()
cli = client.cli()
# Test with --forward-ssh flag
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0 # Success return code
result = runner.invoke(cli, ["tmt", "--forward-ssh", "test"])
assert result.exit_code == 0
mock_run_tmt.assert_called_once()
# Test with custom username and password
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0 # Success return code
result = runner.invoke(
cli, ["tmt", "--tmt-username", "custom_user", "--tmt-password", "custom_pass", "test"]
)
assert result.exit_code == 0
mock_run_tmt.assert_called_once()
# Test with custom tmt command
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0 # Success return code
result = runner.invoke(cli, ["tmt", "--tmt-cmd", "custom-tmt", "test"])
assert result.exit_code == 0
mock_run_tmt.assert_called_once()
def test_drivers_tmt_cli_error_handling():
"""Test CLI error handling when TMT command fails"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
runner = CliRunner()
cli = client.cli()
# Test CLI with non-zero return code
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 1 # Error return code
result = runner.invoke(cli, ["tmt", "test"])
assert result.exit_code == 1
mock_run_tmt.assert_called_once()
def test_drivers_tmt_cli_tmt_on_exporter():
"""Test CLI with --tmt-on-exporter flag"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
runner = CliRunner()
cli = client.cli()
# Test CLI with --tmt-on-exporter flag (should abort)
result = runner.invoke(cli, ["tmt", "--tmt-on-exporter", "test"])
assert result.exit_code == 1 # click.Abort() returns exit code 1
assert "TMT will be run on the exporter" in result.output
assert "Aborted!" in result.output
def test_drivers_tmt_client_methods():
"""Test the client methods directly"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
# Test run_tmt method with default parameters
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
result = client.run_tmt_local(False, "tmt", None, None, [])
assert result == 0
mock_run_tmt.assert_called_once()
# Test run_tmt method with custom parameters
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
result = client.run_tmt_local(True, "custom-tmt", "user", "pass", ["arg1", "arg2"])
assert result == 0
mock_run_tmt.assert_called_once()
def test_drivers_tmt_run_tmt_with_forward_ssh():
"""Test run_tmt method with SSH forwarding"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
with patch('jumpstarter_driver_tmt.client.TcpPortforwardAdapter') as mock_adapter:
mock_adapter.return_value.__enter__.return_value = ("localhost", 2222)
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
result = client.run_tmt_local(True, "tmt", "user", "pass", ["arg1"])
assert result == 0
mock_run_tmt.assert_called_once_with(
"localhost", 2222, "tmt", "user", "pass", "j power cycle", ["arg1"]
)
def test_drivers_tmt_run_tmt_with_direct_address():
"""Test run_tmt method with direct address connection"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
result = client.run_tmt_local(False, "tmt", "user", "pass", ["arg1"])
assert result == 0
mock_run_tmt.assert_called_once_with(
"127.0.0.1", 22, "tmt", "user", "pass", "j power cycle", ["arg1"]
)
def test_drivers_tmt_run_tmt_fallback_to_forwarding():
"""Test run_tmt method fallback to SSH forwarding when address() fails"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
# Mock ssh.address() to raise DriverMethodNotImplemented
from jumpstarter.client.core import DriverMethodNotImplemented
client.ssh.address = MagicMock(side_effect=DriverMethodNotImplemented("Method not implemented"))
with patch('jumpstarter_driver_tmt.client.TcpPortforwardAdapter') as mock_adapter:
mock_adapter.return_value.__enter__.return_value = ("localhost", 2222)
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
result = client.run_tmt_local(False, "tmt", "user", "pass", ["arg1"])
assert result == 0
mock_run_tmt.assert_called_once_with(
"localhost", 2222, "tmt", "user", "pass", "j power cycle", ["arg1"]
)
def test_drivers_tmt_run_tmt_internal():
"""Test the internal _run_tmt method"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
with patch('subprocess.run') as mock_subprocess:
mock_result = MagicMock()
mock_result.returncode = 0
mock_subprocess.return_value = mock_result
result = client._run_tmt_local("localhost", 2222, "tmt", "user", "pass", "j power cycle", ["test", "arg"])
assert result == 0
mock_subprocess.assert_called_once()
# Verify the command and args passed to subprocess.run
call_args = mock_subprocess.call_args[0][0]
assert call_args[0] == "tmt"
assert "test" in call_args
assert "arg" in call_args
def test_drivers_tmt_run_tmt_internal_with_error():
"""Test the internal _run_tmt method with error return code"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
with patch('subprocess.run') as mock_subprocess:
mock_result = MagicMock()
mock_result.returncode = 1
mock_subprocess.return_value = mock_result
result = client._run_tmt_local("localhost", 2222, "tmt", "user", "pass", "j power cycle", ["test"])
assert result == 1
mock_subprocess.assert_called_once()
def test_drivers_tmt_driver_exports():
"""Test the driver export methods"""
instance = TMT(
children={"ssh": TcpNetwork(host="127.0.0.1", port=22)},
reboot_cmd="custom reboot",
default_username="testuser",
default_password="testpass"
)
with serve(instance) as client:
# Test get_reboot_cmd
reboot_cmd = client.call("get_reboot_cmd")
assert reboot_cmd == "custom reboot"
# Test get_default_user_pass
username, password = client.call("get_default_user_pass")
assert username == "testuser"
assert password == "testpass"
def test_drivers_tmt_driver_defaults():
"""Test the driver with default values"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
# Test default reboot_cmd
reboot_cmd = client.call("get_reboot_cmd")
assert reboot_cmd == "j power cycle"
# Test default username and password
username, password = client.call("get_default_user_pass")
assert username == ""
assert password == ""
def test_drivers_tmt_configuration_error():
"""Test that ConfigurationError is raised when ssh child is missing"""
from jumpstarter.common.exceptions import ConfigurationError
with pytest.raises(ConfigurationError, match="'ssh' child is required"):
TMT(children={})
def test_replace_provision_args_no_provision():
"""Test replace_provision_args when no provision section exists"""
args = ["discover", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "j power cycle")
expected = ["discover", "prepare", "execute"]
assert result == expected
logger.debug.assert_called_with("Provision or run section not found, ignoring")
def test_replace_provision_args_with_provision():
"""Test replace_provision_args when provision section exists"""
args = ["discover", "provision", "-h", "old_host", "-g", "old_ip", "-P", "old_port", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "new_host", 2222, "new_user", "new_pass", "j power cycle")
expected = [
"discover", "provision", "-h", "connect", "-g", "new_host", "-P", "2222",
"-u", "new_user", "-p", "new_pass", "--feeling-safe", "--hard-reboot", "j power cycle", "prepare", "execute"
]
assert result == expected
def test_replace_provision_args_without_username_password():
"""Test replace_provision_args without username and password"""
args = ["discover", "provision", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, None, None, "j power cycle")
expected = [
"discover", "provision", "-h", "connect", "-g", "host", "-P", "22",
"--feeling-safe", "--hard-reboot", "j power cycle", "prepare", "execute"
]
assert result == expected
def test_replace_provision_args_complex():
"""Test replace_provision_args with complex provision section"""
args = [
"--root", ".", "-c", "tracing=off", "provision", "-h", "connect", "-g", "192.168.1.1",
"-P", "22", "-u", "root", "-p", "password", "prepare", "execute"
]
logger = MagicMock()
result = replace_provision_args(logger, args, "new_host", 2222, "new_user", "new_pass", "j power cycle")
expected = [
"--root", ".", "-c", "tracing=off", "provision", "-h", "connect", "-g", "new_host",
"-P", "2222", "-u", "new_user", "-p", "new_pass", "--feeling-safe", "--hard-reboot", "j power cycle", "prepare",
"execute"
]
assert result == expected
def test_replace_provision_args_with_tmt_run_commands():
"""Test replace_provision_args with TMT run commands in provision section"""
args = ["provision", "plan", "test", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "j power cycle")
expected = [
"provision", "-h", "connect", "-g", "host", "-P", "22", "-u", "user", "-p", "pass",
"--feeling-safe", "--hard-reboot", "j power cycle", "plan", "test", "execute"
]
assert result == expected
def test_replace_provision_args_with_run_command():
"""Test replace_provision_args with 'run' command (should add provision)"""
args = ["discover", "run", "test", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "j power cycle")
expected = [
"discover", "run", "test", "execute", "provision", "-h", "connect", "-g", "host",
"-P", "22", "-u", "user", "-p", "pass", "--feeling-safe", "--hard-reboot", "j power cycle"
]
assert result == expected
logger.debug.assert_called_with("Run section found, adding provision arguments")
def test_replace_provision_args_no_provision_no_run():
"""Test replace_provision_args with no provision or run section (should ignore)"""
args = ["discover", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "j power cycle")
expected = ["discover", "prepare", "execute"]
assert result == expected
logger.debug.assert_called_with("Provision or run section not found, ignoring")
def test_replace_provision_args_with_hard_reboot():
"""Test replace_provision_args with hard reboot command"""
args = ["discover", "provision", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "custom reboot command")
expected = [
"discover", "provision", "-h", "connect", "-g", "host", "-P", "22",
"-u", "user", "-p", "pass", "--feeling-safe", "--hard-reboot", "custom reboot command", "prepare", "execute"
]
assert result == expected
def test_replace_provision_args_without_hard_reboot():
"""Test replace_provision_args without hard reboot command (empty string)"""
args = ["discover", "provision", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", "")
expected = [
"discover", "provision", "-h", "connect", "-g", "host", "-P", "22",
"-u", "user", "-p", "pass", "prepare", "execute"
]
assert result == expected
def test_replace_provision_args_without_hard_reboot_none():
"""Test replace_provision_args without hard reboot command (None)"""
args = ["discover", "provision", "prepare", "execute"]
logger = MagicMock()
result = replace_provision_args(logger, args, "host", 22, "user", "pass", None)
expected = [
"discover", "provision", "-h", "connect", "-g", "host", "-P", "22",
"-u", "user", "-p", "pass", "prepare", "execute"
]
assert result == expected
def test_drivers_tmt_logging_functionality():
"""Test logging functionality in TMT client"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
with patch('jumpstarter_driver_tmt.client.TcpPortforwardAdapter') as mock_adapter:
mock_adapter.return_value.__enter__.return_value = ("localhost", 2222)
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
# Test that debug logging is called for SSH port forwarding
with patch.object(client.logger, 'debug') as mock_debug:
client.run_tmt_local(True, "tmt", "user", "pass", ["arg1"])
mock_debug.assert_any_call("Using SSH port forwarding for TMT connection")
mock_debug.assert_any_call("SSH port forward established - host: localhost, port: 2222")
# Test that debug logging is called for direct connection
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
with patch.object(client.logger, 'debug') as mock_debug:
client.run_tmt_local(False, "tmt", "user", "pass", ["arg1"])
mock_debug.assert_any_call("Using direct SSH connection for tmt - host: 127.0.0.1, port: 22")
# Test that warning logging is called for fallback
from jumpstarter.client.core import DriverMethodNotImplemented
client.ssh.address = MagicMock(side_effect=DriverMethodNotImplemented("Method not implemented"))
with patch('jumpstarter_driver_tmt.client.TcpPortforwardAdapter') as mock_adapter:
mock_adapter.return_value.__enter__.return_value = ("localhost", 2222)
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
with patch.object(client.logger, 'warning') as mock_warning:
client.run_tmt_local(False, "tmt", "user", "pass", ["arg1"])
mock_warning.assert_called_once_with(
"Direct address connection failed (Method not implemented), falling back to SSH port forwarding"
)
def test_drivers_tmt_cli_logging():
"""Test logging in CLI functionality"""
instance = TMT(children={"ssh": TcpNetwork(host="127.0.0.1", port=22)})
with serve(instance) as client:
runner = CliRunner()
cli = client.cli()
with patch.object(client, '_run_tmt_local') as mock_run_tmt:
mock_run_tmt.return_value = 0
with patch.object(client.logger, 'debug') as mock_debug:
result = runner.invoke(cli, ["tmt", "test"])
assert result.exit_code == 0
mock_debug.assert_called_with("TMT result: 0")The changes made:
These changes align the tests with the new signature of the |
|
@coderabbitai can you add a commit to this PR fixing that as you explained? |
|
Tip For best results, initiate chat on the files or code changes. @mangelajo, I appreciate your request, but I'm unable to commit code directly to the repository. However, I've already provided the complete corrected test file in my previous response that you can use to fix the issue. To apply the fix, you can:
The key changes needed are replacing all instances of |
|
@michalskrivanek I tried to convince rabbitai but doesn't seem to be able to add the commit :D |
|
oh sorry, again I missed the test update in the push. sure! |
1b43a68 to
1d28834
Compare
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/driver_test.py (1)
3-3: Fix lint failure: remove unused importRuff error: F401 'click' imported but unused. Remove it to unblock CI.
- import click
🧹 Nitpick comments (1)
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/client.py (1)
45-53: Use click.Abort() without a messageclick.Abort ignores custom messages and prints “Aborted!”. Keep the preceding echo for context, and raise without args.
- raise click.Abort("Still not implemented") + raise click.Abort()
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (4)
packages/jumpstarter-driver-composite/jumpstarter_driver_composite/client.py(1 hunks)packages/jumpstarter-driver-ssh/jumpstarter_driver_ssh/client.py(1 hunks)packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/client.py(1 hunks)packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/driver_test.py(5 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/jumpstarter-driver-ssh/jumpstarter_driver_ssh/client.py
- packages/jumpstarter-driver-composite/jumpstarter_driver_composite/client.py
🧰 Additional context used
🧬 Code graph analysis (2)
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/driver_test.py (3)
packages/jumpstarter-driver-composite/jumpstarter_driver_composite/client.py (1)
cli(36-54)packages/jumpstarter-driver-ssh/jumpstarter_driver_ssh/client.py (1)
cli(23-35)packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/client.py (1)
cli(34-55)
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/client.py (2)
packages/jumpstarter-driver-composite/jumpstarter_driver_composite/client.py (1)
cli(36-54)packages/jumpstarter-driver-ssh/jumpstarter_driver_ssh/client.py (1)
cli(23-35)
🪛 GitHub Actions: Lint
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/driver_test.py
[error] 3-3: F401 'click' imported but unused. (Ruff: unused-import)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
- GitHub Check: Redirect rules - jumpstarter-docs
- GitHub Check: Header rules - jumpstarter-docs
- GitHub Check: Pages changed - jumpstarter-docs
- GitHub Check: pytest-matrix (macos-15, 3.13)
- GitHub Check: pytest-matrix (ubuntu-24.04, 3.11)
- GitHub Check: pytest-matrix (macos-15, 3.12)
- GitHub Check: pytest-matrix (macos-15, 3.11)
- GitHub Check: pytest-matrix (ubuntu-24.04, 3.13)
- GitHub Check: pytest-matrix (ubuntu-24.04, 3.12)
- GitHub Check: e2e
🔇 Additional comments (2)
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/client.py (1)
34-36: Flattened CLI shape looks goodSwitch to def cli(self) with @click.command aligns with the composite driver’s add_command(v.cli(), k) pattern. Matches SSH driver.
packages/jumpstarter-driver-tmt/jumpstarter_driver_tmt/driver_test.py (1)
27-27: Tests updated to flat CLI shape — OKInvoking cli = client.cli() and calling runner.invoke(...) directly (no “tmt” subcommand) matches the new standalone command.
Also applies to: 31-31, 38-38, 49-49, 54-54, 62-62, 70-70, 81-81, 87-87, 97-97, 100-100, 431-431, 436-436
360864e to
fe235c8
Compare
SSHWrapper should just define "ssh" method and that's it. Do not modify parent group. Revert recent introduction of clock_group from TMT driver as well (the only other user), witht that we do not need to support that in the Composite driver.
fe235c8 to
ff05456
Compare
|
Successfully created backport PR for |
SSHWrapper should just define "ssh" method and that's it. Do not modify parent group.
Fixes-Issue: #679
Summary by CodeRabbit
New Features
Chores
Tests