Skip to content

Commit

Permalink
Fix using multiple RemoteRules (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
hluk committed Feb 3, 2023
1 parent 746cbd8 commit a2d5893
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 6 deletions.
4 changes: 2 additions & 2 deletions greenwave/decision.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def __init__(self, product_version, subject, results_retriever):
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)
Expand All @@ -41,7 +41,7 @@ def verify(self, policy, rule):
if rule in self.verified_rules:
return []

self.verified_rules.add(rule)
self.verified_rules.append(rule)

return rule.check(policy, self)

Expand Down
6 changes: 2 additions & 4 deletions greenwave/policies.py
Original file line number Diff line number Diff line change
Expand Up @@ -562,10 +562,6 @@ def matches(self, policy, **attributes):
"""
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()

Expand Down Expand Up @@ -675,6 +671,8 @@ def matches(self, policy, **attributes):
def to_json(self):
return {
'rule': self.__class__.__name__,
'required': self.required,
'sources': self.sources,
}


Expand Down
54 changes: 54 additions & 0 deletions greenwave/tests/test_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit a2d5893

Please sign in to comment.