GRM-9: feat: add runner registry for simplified CLI UX

This commit is contained in:
Emil Simeonov
2026-06-19 00:57:26 +02:00
parent a575a89026
commit 4c08606d0c
10 changed files with 869 additions and 244 deletions
+93 -30
View File
@@ -229,13 +229,31 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["start", "host1", "--user", "ubuntu", "--name", "r1"])
result = runner.invoke(cli, ["start", "r1"])
assert result.exit_code == 0
mock_manager.start.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
mode="docker",
host=None,
user=None,
key=None,
mode=None,
ask_become_pass=False,
)
@patch("gitea_runner_manager.cli.RunnerManager")
def test_start_with_override(self, mock_manager_class: MagicMock) -> None:
mock_manager = MagicMock()
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["start", "r1", "--host", "newhost", "--user", "newuser", "--mode", "binary"])
assert result.exit_code == 0
mock_manager.start.assert_called_once_with(
name="r1",
host="newhost",
user="newuser",
key=None,
mode="binary",
ask_become_pass=False,
)
@@ -245,12 +263,13 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["stop", "host1", "--user", "ubuntu", "--name", "r1"])
result = runner.invoke(cli, ["stop", "r1"])
assert result.exit_code == 0
mock_manager.stop.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
host=None,
user=None,
key=None,
ask_become_pass=False,
)
@@ -260,12 +279,13 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["enable", "host1", "--user", "ubuntu", "--name", "r1"])
result = runner.invoke(cli, ["enable", "r1"])
assert result.exit_code == 0
mock_manager.enable.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
host=None,
user=None,
key=None,
ask_become_pass=False,
)
@@ -275,15 +295,16 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner(env={"GITEA_URL": "https://git.example.com"})
result = runner.invoke(cli, ["disable", "host1", "--user", "ubuntu", "--name", "r1", "--token", "tok"])
result = runner.invoke(cli, ["disable", "r1", "--token", "tok"])
assert result.exit_code == 0
mock_manager.disable.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
host=None,
user=None,
key=None,
token="tok",
gitea_url="https://git.example.com",
mode="docker",
mode=None,
ask_become_pass=False,
)
@@ -291,7 +312,7 @@ class TestCLI:
def test_disable_missing_url(self, mock_manager_class: MagicMock) -> None:
with patch.dict("os.environ", {"GITEA_REGISTRATION_TOKEN": "tok"}, clear=True):
runner = CliRunner()
result = runner.invoke(cli, ["disable", "host1", "--user", "ubuntu", "--token", "tok"])
result = runner.invoke(cli, ["disable", "r1", "--token", "tok"])
assert result.exit_code != 0
assert "GITEA_URL must be set" in result.output
@@ -304,7 +325,7 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner(env={"GITEA_URL": "https://git.example.com"})
result = runner.invoke(cli, ["disable", "host1", "--user", "ubuntu", "--token", "tok"])
result = runner.invoke(cli, ["disable", "r1", "--token", "tok"])
assert result.exit_code != 0
assert "fail" in result.output
@@ -314,13 +335,14 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["status", "host1", "--user", "ubuntu", "--name", "r1"])
result = runner.invoke(cli, ["status", "r1"])
assert result.exit_code == 0
mock_manager.status.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
mode="docker",
host=None,
user=None,
key=None,
mode=None,
ask_become_pass=False,
)
@@ -330,15 +352,16 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner(env={"GITEA_URL": "https://git.example.com"})
result = runner.invoke(cli, ["remove", "host1", "--user", "ubuntu", "--name", "r1", "--token", "tok"])
result = runner.invoke(cli, ["remove", "r1", "--token", "tok"])
assert result.exit_code == 0
mock_manager.remove.assert_called_once_with(
host="host1",
user="ubuntu",
name="r1",
host=None,
user=None,
key=None,
token="tok",
gitea_url="https://git.example.com",
mode="docker",
mode=None,
ask_become_pass=False,
)
@@ -351,7 +374,7 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["start", "host1", "--user", "ubuntu"])
result = runner.invoke(cli, ["start", "r1"])
assert result.exit_code != 0
assert "fail" in result.output
@@ -364,7 +387,7 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["stop", "host1", "--user", "ubuntu"])
result = runner.invoke(cli, ["stop", "r1"])
assert result.exit_code != 0
assert "fail" in result.output
@@ -377,7 +400,7 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["enable", "host1", "--user", "ubuntu"])
result = runner.invoke(cli, ["enable", "r1"])
assert result.exit_code != 0
assert "fail" in result.output
@@ -390,7 +413,7 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["status", "host1", "--user", "ubuntu"])
result = runner.invoke(cli, ["status", "r1"])
assert result.exit_code != 0
assert "fail" in result.output
@@ -398,7 +421,7 @@ class TestCLI:
def test_remove_missing_url(self, mock_manager_class: MagicMock) -> None:
with patch.dict("os.environ", {"GITEA_REGISTRATION_TOKEN": "tok"}, clear=True):
runner = CliRunner()
result = runner.invoke(cli, ["remove", "host1", "--user", "ubuntu", "--token", "tok"])
result = runner.invoke(cli, ["remove", "r1", "--token", "tok"])
assert result.exit_code != 0
assert "GITEA_URL must be set" in result.output
@@ -411,6 +434,46 @@ class TestCLI:
mock_manager_class.return_value = mock_manager
runner = CliRunner(env={"GITEA_URL": "https://git.example.com"})
result = runner.invoke(cli, ["remove", "host1", "--user", "ubuntu", "--token", "tok"])
result = runner.invoke(cli, ["remove", "r1", "--token", "tok"])
assert result.exit_code != 0
assert "fail" in result.output
@patch("gitea_runner_manager.cli.RunnerManager")
def test_list(self, mock_manager_class: MagicMock) -> None:
mock_manager = MagicMock()
mock_manager.list_runners.return_value = [
{"name": "r1", "host": "10.0.0.1", "user": "ubuntu", "mode": "docker", "status": "active"},
]
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["list"])
assert result.exit_code == 0
assert "r1" in result.output
assert "10.0.0.1" in result.output
assert "active" in result.output
mock_manager.list_runners.assert_called_once()
@patch("gitea_runner_manager.cli.RunnerManager")
def test_list_empty(self, mock_manager_class: MagicMock) -> None:
mock_manager = MagicMock()
mock_manager.list_runners.return_value = []
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["list"])
assert result.exit_code == 0
assert "No runners registered" in result.output
@patch("gitea_runner_manager.cli.RunnerManager")
def test_list_error(self, mock_manager_class: MagicMock) -> None:
mock_manager = MagicMock()
from gitea_runner_manager.exceptions import AnsibleError
mock_manager.list_runners.side_effect = AnsibleError("fail")
mock_manager_class.return_value = mock_manager
runner = CliRunner()
result = runner.invoke(cli, ["list"])
assert result.exit_code != 0
assert "fail" in result.output