summaryrefslogtreecommitdiffstats
path: root/roles/openshift_health_checker
diff options
context:
space:
mode:
authorRodolfo Carvalho <rhcarvalho@gmail.com>2017-08-21 13:37:25 +0200
committerRodolfo Carvalho <rhcarvalho@gmail.com>2017-08-24 15:00:12 +0200
commita28796fc669bd40f9384118f278b62001a15214d (patch)
tree553e484dac1c5a5dc6e88fec8e6006b3c623bb19 /roles/openshift_health_checker
parent25276bda8c002f4279e5c1748f64a9fd1ee999a4 (diff)
downloadopenshift-a28796fc669bd40f9384118f278b62001a15214d.tar.gz
openshift-a28796fc669bd40f9384118f278b62001a15214d.tar.bz2
openshift-a28796fc669bd40f9384118f278b62001a15214d.tar.xz
openshift-a28796fc669bd40f9384118f278b62001a15214d.zip
List known checks/tags when check name is invalid
Diffstat (limited to 'roles/openshift_health_checker')
-rw-r--r--roles/openshift_health_checker/action_plugins/openshift_health_check.py28
-rw-r--r--roles/openshift_health_checker/test/action_plugin_test.py10
2 files changed, 22 insertions, 16 deletions
diff --git a/roles/openshift_health_checker/action_plugins/openshift_health_check.py b/roles/openshift_health_checker/action_plugins/openshift_health_check.py
index 898d158a4..3e8962c3c 100644
--- a/roles/openshift_health_checker/action_plugins/openshift_health_check.py
+++ b/roles/openshift_health_checker/action_plugins/openshift_health_check.py
@@ -113,21 +113,27 @@ def list_known_checks(known_checks):
'list of check names or a YAML list. Available checks:\n {}'
).format('\n '.join(sorted(known_checks)))
+ tags = describe_tags(known_checks.values())
+
+ msg += (
+ '\n\nTags can be used as a shortcut to select multiple '
+ 'checks. Available tags and the checks they select:\n {}'
+ ).format('\n '.join(tags))
+
+ return msg
+
+
+def describe_tags(check_classes):
+ """Return a sorted list of strings describing tags and the checks they include."""
tag_checks = defaultdict(list)
- for cls in known_checks.values():
+ for cls in check_classes:
for tag in cls.tags:
tag_checks[tag].append(cls.name)
tags = [
'@{} = {}'.format(tag, ','.join(sorted(checks)))
for tag, checks in tag_checks.items()
]
-
- msg += (
- '\n\nTags can be used as a shortcut to select multiple '
- 'checks. Available tags and the checks they select:\n {}'
- ).format('\n '.join(sorted(tags)))
-
- return msg
+ return sorted(tags)
def resolve_checks(names, all_checks):
@@ -157,6 +163,12 @@ def resolve_checks(names, all_checks):
if unknown_tag_names:
msg.append('Unknown tag names: {}.'.format(', '.join(sorted(unknown_tag_names))))
msg.append('Make sure there is no typo in the playbook and no files are missing.')
+ # TODO: implement a "Did you mean ...?" when the input is similar to a
+ # valid check or tag.
+ msg.append('Known checks:')
+ msg.append(' {}'.format('\n '.join(sorted(known_check_names))))
+ msg.append('Known tags:')
+ msg.append(' {}'.format('\n '.join(describe_tags(all_checks))))
raise OpenShiftCheckException('\n'.join(msg))
tag_to_checks = defaultdict(set)
diff --git a/roles/openshift_health_checker/test/action_plugin_test.py b/roles/openshift_health_checker/test/action_plugin_test.py
index f73eb4f6e..2274cbd21 100644
--- a/roles/openshift_health_checker/test/action_plugin_test.py
+++ b/roles/openshift_health_checker/test/action_plugin_test.py
@@ -218,24 +218,21 @@ def test_resolve_checks_ok(names, all_checks, expected):
assert resolve_checks(names, all_checks) == expected
-@pytest.mark.parametrize('names,all_checks,words_in_exception,words_not_in_exception', [
+@pytest.mark.parametrize('names,all_checks,words_in_exception', [
(
['testA', 'testB'],
[],
['check', 'name', 'testA', 'testB'],
- ['tag', 'group', '@'],
),
(
['@group'],
[],
['tag', 'name', 'group'],
- ['check', '@'],
),
(
['testA', 'testB', '@group'],
[],
['check', 'name', 'testA', 'testB', 'tag', 'group'],
- ['@'],
),
(
['testA', 'testB', '@group'],
@@ -245,13 +242,10 @@ def test_resolve_checks_ok(names, all_checks, expected):
fake_check('from_group_2', ['preflight', 'group']),
],
['check', 'name', 'testA', 'testB'],
- ['tag', 'group', '@'],
),
])
-def test_resolve_checks_failure(names, all_checks, words_in_exception, words_not_in_exception):
+def test_resolve_checks_failure(names, all_checks, words_in_exception):
with pytest.raises(Exception) as excinfo:
resolve_checks(names, all_checks)
for word in words_in_exception:
assert word in str(excinfo.value)
- for word in words_not_in_exception:
- assert word not in str(excinfo.value)