Require filter parameters for running tempest test

This helps avoid the case where a user runs a bare
`juju run tempest/0 validation`,
not realising it will run all the tests and take a long time.

Change-Id: I42b67bb941afcc4ed6d9cb905879d81336bfe83f
This commit is contained in:
Samuel Allan 2024-02-07 11:08:57 +10:30
parent 35b4e10e30
commit 28b1ae2a24
3 changed files with 37 additions and 3 deletions

View File

@ -247,7 +247,7 @@ class TempestOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S):
def _on_validate_action(self, event: ops.charm.ActionEvent) -> None: def _on_validate_action(self, event: ops.charm.ActionEvent) -> None:
"""Run tempest action.""" """Run tempest action."""
serial: bool = event.params["serial"] serial: bool = event.params["serial"]
regexes: List[str] = event.params["regex"].strip().split() regexes: List[str] = event.params["regex"].split()
exclude_regex: str = event.params["exclude-regex"].strip() exclude_regex: str = event.params["exclude-regex"].strip()
test_list: str = event.params["test-list"].strip() test_list: str = event.params["test-list"].strip()

View File

@ -198,6 +198,15 @@ class TempestPebbleHandler(sunbeam_chandlers.ServicePebbleHandler):
Raises a RuntimeError if something goes wrong. Raises a RuntimeError if something goes wrong.
""" """
# validation before running anything # validation before running anything
if not (regexes or exclude_regex or test_list):
raise RuntimeError(
"No filter parameters provided.\n"
"At least one of regex, exclude-regex, or test-list must be provided to run tests.\n\n"
"If you really intend to run all tests, pass regex='.*'.\n"
"WARNING: the full test set is very large and will take a long time."
)
for r in [*regexes, exclude_regex]: for r in [*regexes, exclude_regex]:
try: try:
re.compile(r) re.compile(r)

View File

@ -299,14 +299,14 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
action_event = mock.Mock() action_event = mock.Mock()
action_event.params = { action_event.params = {
"serial": False, "serial": False,
"regex": "", "regex": "smoke",
"exclude-regex": "", "exclude-regex": "",
"test-list": "", "test-list": "",
} }
self.harness.charm._on_validate_action(action_event) self.harness.charm._on_validate_action(action_event)
action_event.fail.assert_not_called() action_event.fail.assert_not_called()
exec_mock.assert_called_with( exec_mock.assert_called_with(
["tempest-run-wrapper", "--parallel"], ["tempest-run-wrapper", "--parallel", "--regex", "smoke"],
user="tempest", user="tempest",
group="tempest", group="tempest",
working_dir=TEMPEST_HOME, working_dir=TEMPEST_HOME,
@ -368,6 +368,31 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.harness.remove_relation(identity_ops_rel_id) self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id) self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_no_params(self):
"""Test validate action with no filter params."""
test_utils.set_all_pebbles_ready(self.harness)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
exec_mock = mock.Mock()
self.harness.charm.pebble_handler().execute = exec_mock
action_event = mock.Mock()
action_event.params = {
"serial": True,
"regex": "",
"exclude-regex": "",
"test-list": "",
}
self.harness.charm._on_validate_action(action_event)
action_event.fail.assert_called_once()
self.assertIn(
"No filter parameters provided",
action_event.fail.call_args.args[0],
)
exec_mock.assert_not_called()
def test_get_list_action(self): def test_get_list_action(self):
"""Test get-list action.""" """Test get-list action."""
test_utils.set_all_pebbles_ready(self.harness) test_utils.set_all_pebbles_ready(self.harness)