From a2d589344badf30abeb3533a79e2849a381a569f Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Feb 03 2023 08:06:02 +0000 Subject: Fix using multiple RemoteRules (#131) --- diff --git a/greenwave/decision.py b/greenwave/decision.py index 0286587..ae76af3 100644 --- a/greenwave/decision.py +++ b/greenwave/decision.py @@ -32,7 +32,7 @@ class RuleContext: self.product_version = product_version self.subject = subject self.results_retriever = results_retriever - self.verified_rules = set() + self.verified_rules = [] def get_results(self, test_case_name): return self.results_retriever.retrieve(self.subject, test_case_name) @@ -41,7 +41,7 @@ class RuleContext: if rule in self.verified_rules: return [] - self.verified_rules.add(rule) + self.verified_rules.append(rule) return rule.check(policy, self) diff --git a/greenwave/policies.py b/greenwave/policies.py index e470136..81f40f4 100644 --- a/greenwave/policies.py +++ b/greenwave/policies.py @@ -562,10 +562,6 @@ class Rule(SafeYAMLObject): """ return True - def __hash__(self): - d = self.to_json() - return hash(tuple((k, d[k]) for k in sorted(d.keys()))) - def __eq__(self, other): return self.to_json() == other.to_json() @@ -675,6 +671,8 @@ class RemoteRule(Rule): def to_json(self): return { 'rule': self.__class__.__name__, + 'required': self.required, + 'sources': self.sources, } diff --git a/greenwave/tests/test_rules.py b/greenwave/tests/test_rules.py index c7c94e2..60d682d 100644 --- a/greenwave/tests/test_rules.py +++ b/greenwave/tests/test_rules.py @@ -387,3 +387,57 @@ def test_remote_rule_custom_sources(mock_retrieve_yaml_remote_rule, app): assert answer2["testcase"] == "some_test_case" assert len(decision.answers) == 2 + + +@mock.patch('greenwave.resources.retrieve_yaml_remote_rule') +def test_remote_rule_custom_sources_multiple_rules(mock_retrieve_yaml_remote_rule, app): + url1 = "http://gating.example.com/gating1.yml" + url2 = "http://gating.example.com/gating2.yml" + policy_yaml = dedent(f""" + --- + id: "some_policy" + product_versions: [rhel-9000] + decision_context: bodhi_update_push_stable + subject_type: koji_build + rules: + - !RemoteRule + sources: + - {url1} + - !RemoteRule + sources: + - {url2} + - !RemoteRule {{}} + """) + gating_yaml = dedent(""" + --- + decision_context: bodhi_update_push_stable + rules: + - !PassingTestCaseRule {test_case_name: some_test_case} + """) + mock_retrieve_yaml_remote_rule.side_effect = lambda url: gating_yaml if url == url2 else None + + policies = Policy.safe_load_all(policy_yaml) + assert len(policies) == 1 + assert len(policies[0].rules) == 3 + + nvr = 'nethack-1.2.3-1.el9000' + subject = create_subject('koji_build', nvr) + + decision = Decision('bodhi_update_push_stable', 'rhel-9000') + results_retriever = mock.MagicMock() + results_retriever.retrieve.return_value = [] + decision.check(subject, policies, results_retriever=results_retriever) + + answer1 = decision.answers[0].to_json() + assert answer1["type"] == "fetched-gating-yaml" + assert answer1["source"] == url2 + + answer2 = decision.answers[1].to_json() + assert answer2["type"] == "test-result-missing" + assert answer2["testcase"] == "some_test_case" + + answer2 = decision.answers[2].to_json() + assert answer2["type"] == "failed-fetch-gating-yaml" + assert answer2["sources"] == [] + + assert len(decision.answers) == 3