From 1f961fd05fe97868d6cbd40c04707265ac87cf4b Mon Sep 17 00:00:00 2001 From: redref Date: Wed, 1 Feb 2017 17:35:59 +0100 Subject: [PATCH] Fix reports_status criterions --- puppetboard/app.py | 49 +++++++++++++++++++++++------- puppetboard/templates/_macros.html | 1 + 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/puppetboard/app.py b/puppetboard/app.py index cab3aba63..0011d5242 100644 --- a/puppetboard/app.py +++ b/puppetboard/app.py @@ -90,6 +90,38 @@ def environments(): return x +def reports_noop_query(): + """Compatibility function building a query string + to select noop reports. + Direct access fields 'noop' and 'noop_pending' are not set + by 3.X clients on a 4.X database. + """ + noop_event_query = EqualsOperator('status', 'noop') + noop_subquery = SubqueryOperator('events') + noop_subquery.add_query(noop_event_query) + noop_extract = ExtractOperator() + noop_extract.add_field(str('certname')) + noop_extract.add_query(noop_subquery) + noop_in_query = InOperator('certname') + noop_in_query.add_query(noop_extract) + + other_event_query = NotOperator() + other_event_query.add(EqualsOperator('status', 'noop')) + other_subquery = SubqueryOperator('events') + other_subquery.add_query(other_event_query) + other_extract = ExtractOperator() + other_extract.add_field(str('certname')) + other_extract.add_query(other_subquery) + other_in_query = InOperator('certname') + other_in_query.add_query(other_extract) + other_not_in = NotOperator() + other_not_in.add(other_in_query) + + result = AndOperator() + result.add([noop_in_query, other_not_in]) + return result + + def check_env(env, envs): if env != '*' and env not in envs: abort(404) @@ -461,7 +493,7 @@ def reports_ajax(env, node_name): order_column = int(request.args.get('order[0][column]', 0)) order_filter = REPORTS_COLUMNS[order_column].get( 'filter', REPORTS_COLUMNS[order_column]['attr']) - order_dir = request.args.get('order[0][dir]') + order_dir = request.args.get('order[0][dir]', 'desc') order_args = '[{"field": "%s", "order": "%s"}]' % (order_filter, order_dir) status_args = request.args.get('columns[1][search][value]', '').split('|') max_col = len(REPORTS_COLUMNS) @@ -492,18 +524,13 @@ def reports_ajax(env, node_name): if status_arg in ['failed', 'changed', 'unchanged']: arg_query = AndOperator() arg_query.add(EqualsOperator('status', status_arg)) - arg_query.add(EqualsOperator('noop', False)) - status_query.add(arg_query) if status_arg == 'unchanged': - arg_query = AndOperator() - arg_query.add(EqualsOperator('noop', True)) - arg_query.add(EqualsOperator('noop_pending', False)) - status_query.add(arg_query) - elif status_arg == 'noop': - arg_query = AndOperator() - arg_query.add(EqualsOperator('noop', True)) - arg_query.add(EqualsOperator('noop_pending', True)) + noop_query = NotOperator() + noop_query.add(reports_noop_query()) + arg_query.add(noop_query) status_query.add(arg_query) + elif status_arg == 'noop': + status_query.add(reports_noop_query()) if len(status_query.operations) == 0: if len(reports_query.operations) == 0: diff --git a/puppetboard/templates/_macros.html b/puppetboard/templates/_macros.html index b39fadb68..7fd00656f 100644 --- a/puppetboard/templates/_macros.html +++ b/puppetboard/templates/_macros.html @@ -58,6 +58,7 @@ {%- endmacro %} {% macro report_status(caller, status, node_name, metrics, current_env, unreported_time=False, report_hash=False) -%} + {% if status == 'unchanged' and metrics.events and metrics.events.noop and metrics.events.noop > 0 %}{% set status = 'noop' %}{% endif %} {{ status|upper }} {% if status == 'unreported' %} {{ unreported_time|upper }}