From df7f7057c593468c97eed1653d29184d7ca07b27 Mon Sep 17 00:00:00 2001 From: Matt Jia Date: Aug 31 2017 20:28:00 +0000 Subject: add sanity checks when loading the polices --- diff --git a/greenwave/tests/test_policies.py b/greenwave/tests/test_policies.py index 7925d50..0ebddc3 100644 --- a/greenwave/tests/test_policies.py +++ b/greenwave/tests/test_policies.py @@ -2,9 +2,11 @@ # SPDX-License-Identifier: GPL-2.0+ import json +import pytest from greenwave.app_factory import create_app from greenwave.policies import summarize_answers, RuleSatisfied, TestResultMissing, TestResultFailed +from greenwave.utils import load_policies def test_summarize_answers(): @@ -153,3 +155,35 @@ def test_invalid_decision_context(): assert output.status_code == 404 assert output.data == '{\n "message": "Cannot find any applicable '\ 'policies for fedora-26 and bodhi_update_push"\n}\n' + + +def test_misconfigured_policies(tmpdir): + p = tmpdir.join('fedora.yaml') + p.write(""" +--- +id: "taskotron_release_critical_tasks" +product_versions: + - fedora-26 +decision_context: bodhi_update_push_stable +rules: + - !PassingTestCaseRule {test_case_name: dist.abicheck} + """) + with pytest.raises(RuntimeError) as excinfo: + load_policies(tmpdir.strpath) + assert 'Policies are not configured properly' in str(excinfo.value) + + +def test_misconfigured_policy_rules(tmpdir): + p = tmpdir.join('fedora.yaml') + p.write(""" +--- !Policy +id: "taskotron_release_critical_tasks" +product_versions: + - fedora-26 +decision_context: bodhi_update_push_stable +rules: + - {test_case_name: dist.abicheck} + """) + with pytest.raises(RuntimeError) as excinfo: + load_policies(tmpdir.strpath) + assert 'Policies are not configured properly' in str(excinfo.value) diff --git a/greenwave/utils.py b/greenwave/utils.py index 8f9551c..9b1a3ba 100644 --- a/greenwave/utils.py +++ b/greenwave/utils.py @@ -6,6 +6,7 @@ import yaml from flask import jsonify, current_app from flask.config import Config from werkzeug.exceptions import HTTPException +from greenwave.policies import Policy, Rule def json_error(error): @@ -72,6 +73,14 @@ def load_policies(policies_dir): policies = [] for policy_pathname in policy_pathnames: policies.extend(yaml.safe_load_all(open(policy_pathname, 'r'))) + for policy in policies: + if not isinstance(policy, Policy): + raise RuntimeError('Policies are not configured properly as policy %s ' + 'is not an instance of Policy' % policy) + for rule in policy.rules: + if not isinstance(rule, Rule): + raise RuntimeError('Policies are not configured properly as rule %s ' + 'is not an instance of Rule' % rule) return policies