From cdbebd963d8f05076376d29473360b1ca4b06023 Mon Sep 17 00:00:00 2001 From: Yu Ming Zhu Date: Aug 16 2021 17:55:26 +0000 Subject: [hub] add non-host evalPolicy API --- diff --git a/hub/kojihub.py b/hub/kojihub.py index 7c7a535..3f50c1f 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -10099,6 +10099,20 @@ def check_policy(name, data, default='deny', strict=False, force=False): raise koji.ActionNotAllowed(err_str) +def eval_policy(name, data): + """Evaluate named policy with given data and return the result + + :param str name: the policy name + :param dict data: the policy data + :returns the action as a string + :raises koji.GenericError if the policy is empty or not found + """ + ruleset = context.policy.get(name) + if not ruleset: + raise koji.GenericError("no such policy: %s" % name) + return ruleset.apply(data) + + def policy_data_from_task(task_id): """Calculate policy data from task id @@ -10653,6 +10667,8 @@ class RootExports(object): q += """ ORDER BY id DESC LIMIT 1""" return _singleRow(q, values, fields, strict=True) + evalPolicy = staticmethod(eval_policy) + def makeTask(self, *args, **opts): """Creates task manually. This is mainly for debugging, only an admin can make arbitrary tasks. You need to supply all *args and **opts @@ -14622,10 +14638,7 @@ class HostExports(object): """Evaluate named policy with given data and return the result""" host = Host() host.verify() - ruleset = context.policy.get(name) - if not ruleset: - raise koji.GenericError("no such policy: %s" % name) - return ruleset.apply(data) + return eval_policy(name, data) def newBuildRoot(self, repo, arch, task_id=None): host = Host() diff --git a/koji/daemon.py b/koji/daemon.py index 774172e..786e03b 100644 --- a/koji/daemon.py +++ b/koji/daemon.py @@ -480,7 +480,7 @@ class SCM(object): for k, v in six.iteritems(self.get_info()): policy_data[re.sub(r'^(scm_?)?', 'scm_', k)] = v policy_data.update(extra_data) - result = (session.host.evalPolicy('build_from_scm', policy_data) or '').split() + result = (session.evalPolicy('build_from_scm', policy_data) or '').split() is_allowed = result and result[0].lower() in ('yes', 'true', 'allow', 'allowed') if not is_allowed: raise koji.BuildError( diff --git a/tests/test_scm.py b/tests/test_scm.py index 1a96143..abcda69 100644 --- a/tests/test_scm.py +++ b/tests/test_scm.py @@ -259,7 +259,7 @@ class TestSCM(unittest.TestCase): "git://maybeserver/..//badpath/project#1234", ] session = mock.MagicMock() - session.host.evalPolicy.side_effect = FakePolicy(policy['one']).evalPolicy + session.evalPolicy.side_effect = FakePolicy(policy['one']).evalPolicy for url in good: scm = SCM(url) scm.assert_allowed(session=session, by_config=False, by_policy=True) @@ -271,7 +271,7 @@ class TestSCM(unittest.TestCase): def test_opts_by_policy(self): session = mock.MagicMock() - session.host.evalPolicy.side_effect = FakePolicy(policy['two']).evalPolicy + session.evalPolicy.side_effect = FakePolicy(policy['two']).evalPolicy url = "git://default/koji.git#1234" scm = SCM(url) @@ -372,7 +372,7 @@ class TestSCM(unittest.TestCase): ''' session = mock.MagicMock() - session.host.evalPolicy.side_effect = FakePolicy(policy['two']).evalPolicy + session.evalPolicy.side_effect = FakePolicy(policy['two']).evalPolicy url = "git://default/koji.git#1234" scm = SCM(url)