From a6109090e6c85a970c24096cad287e7ab3f8665c Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: May 10 2018 14:57:39 +0000 Subject: Backport "special relevance" from dist-git. https://src.fedoraproject.org/rpms/greenwave/blob/3b12bdd78258ab1d63976b5beddc0b98bbb4b9b2/f/0002-Special-relevance.patch See the commit message of that linked patch for the original logic going into this. The problem now is that I left it as a dist-git patch for so long, it doesn't apply nicely. The API v2 stuff that @dcallagh is working on should let us delete this work, but we need this upstreamed to simplify the release process in the meantime. --- diff --git a/greenwave/api_v1.py b/greenwave/api_v1.py index 3fcb1bb..a68f9c6 100644 --- a/greenwave/api_v1.py +++ b/greenwave/api_v1.py @@ -259,7 +259,10 @@ def make_decision(): answers = [] for item in subjects: - for policy in applicable_policies: + relevant_policies = [ + policy for policy in applicable_policies + if policy.is_relevant_to(item)] + for policy in relevant_policies: answers.extend(policy.check(item, results, waivers)) res = { diff --git a/greenwave/policies.py b/greenwave/policies.py index ba750cf..00ffb2e 100644 --- a/greenwave/policies.py +++ b/greenwave/policies.py @@ -322,6 +322,21 @@ class Policy(yaml.YAMLObject): return (decision_context == self.decision_context and self._applies_to_product_version(product_version)) + def is_relevant_to(self, item): + relevance_key = getattr(self, 'relevance_key', None) + relevance_value = getattr(self, 'relevance_value', None) + + if relevance_key and relevance_value: + return item.get(relevance_key) == relevance_value + + if relevance_key: + return relevance_key in item + + if relevance_value: + return relevance_value in item.values() + + return True + def check(self, item, results, waivers): # If an item is about a package and it is in the blacklist, return RuleSatisfied() for package in self.blacklist: @@ -350,6 +365,8 @@ class Policy(yaml.YAMLObject): 'decision_context': self.decision_context, 'rules': [rule.to_json() for rule in self.rules], 'blacklist': self.blacklist, + 'relevance_key': getattr(self, 'relevance_key', None), + 'relevance_value': getattr(self, 'relevance_value', None), } def _applies_to_product_version(self, product_version):