From 28b1ae2a24a7001ca349d5e1fd313b4dd8a93182 Mon Sep 17 00:00:00 2001 From: Samuel Allan Date: Wed, 7 Feb 2024 11:08:57 +1030 Subject: [PATCH] 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 --- charms/tempest-k8s/src/charm.py | 2 +- charms/tempest-k8s/src/handlers.py | 9 ++++++ .../tests/unit/test_tempest_charm.py | 29 +++++++++++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/charms/tempest-k8s/src/charm.py b/charms/tempest-k8s/src/charm.py index e2d8af9f..1a5a149c 100755 --- a/charms/tempest-k8s/src/charm.py +++ b/charms/tempest-k8s/src/charm.py @@ -247,7 +247,7 @@ class TempestOperatorCharm(sunbeam_charm.OSBaseOperatorCharmK8S): def _on_validate_action(self, event: ops.charm.ActionEvent) -> None: """Run tempest action.""" 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() test_list: str = event.params["test-list"].strip() diff --git a/charms/tempest-k8s/src/handlers.py b/charms/tempest-k8s/src/handlers.py index 3ae1cc8d..b19809ec 100644 --- a/charms/tempest-k8s/src/handlers.py +++ b/charms/tempest-k8s/src/handlers.py @@ -198,6 +198,15 @@ class TempestPebbleHandler(sunbeam_chandlers.ServicePebbleHandler): Raises a RuntimeError if something goes wrong. """ # 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]: try: re.compile(r) diff --git a/charms/tempest-k8s/tests/unit/test_tempest_charm.py b/charms/tempest-k8s/tests/unit/test_tempest_charm.py index 72651e42..8a9f9b01 100644 --- a/charms/tempest-k8s/tests/unit/test_tempest_charm.py +++ b/charms/tempest-k8s/tests/unit/test_tempest_charm.py @@ -299,14 +299,14 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase): action_event = mock.Mock() action_event.params = { "serial": False, - "regex": "", + "regex": "smoke", "exclude-regex": "", "test-list": "", } self.harness.charm._on_validate_action(action_event) action_event.fail.assert_not_called() exec_mock.assert_called_with( - ["tempest-run-wrapper", "--parallel"], + ["tempest-run-wrapper", "--parallel", "--regex", "smoke"], user="tempest", group="tempest", 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(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): """Test get-list action.""" test_utils.set_all_pebbles_ready(self.harness)