Allow hub policy to match version and release

Fixes https://pagure.io/koji/issue/1134

Based on work from https://pagure.io/koji/pull-request/1135
This commit is contained in:
Mikolaj Izdebski 2018-10-23 18:03:25 +02:00 committed by Mike McLean
parent 4ef89a4ae2
commit de161628b0
3 changed files with 72 additions and 0 deletions

View file

@ -179,6 +179,12 @@ Available tests
``package``
* Matches its arguments against the package name. Accepts glob patterns.
``version``
* Matches its arguments against the build version. Accepts glob patterns.
``release``
* Matches its arguments against the build release. Accepts glob patterns.
``tag``
* matches its arguments against the tag name. Accepts glob patterns.
* for move operations, the tag name tested is the destination tag (see

View file

@ -5388,6 +5388,8 @@ def import_build(srpm, rpms, brmap=None, task_id=None, build_id=None, logs=None)
policy_data = {
'package': build['name'],
'version': build['version'],
'release': build['release'],
'buildroots': to_list(brmap.values()),
'import': True,
'import_type': 'rpm',
@ -5651,6 +5653,8 @@ class CG_Importer(object):
# we have to be careful and provide sufficient data
policy_data = {
'package': self.buildinfo['name'],
'version': self.buildinfo['version'],
'release': self.buildinfo['release'],
'source': self.buildinfo['source'],
'cg_list': list(self.cgs),
'import': True,
@ -8301,6 +8305,32 @@ def policy_get_pkg(data):
raise koji.GenericError("policy requires package data")
def policy_get_version(data):
"""Determine version from policy data
returns version as string
"""
if 'version' in data:
return data['version']
if 'build' in data:
return get_build(data['build'], strict=True)['version']
#else
raise koji.GenericError("policy requires version data")
def policy_get_release(data):
"""Determine release from policy data
returns release as string
"""
if 'release' in data:
return data['release']
if 'build' in data:
return get_build(data['build'], strict=True)['release']
#else
raise koji.GenericError("policy requires release data")
def policy_get_brs(data):
"""Determine content generators from policy data"""
@ -8373,6 +8403,26 @@ class PackageTest(koji.policy.MatchTest):
data[self.field] = policy_get_pkg(data)['name']
return super(PackageTest, self).run(data)
class VersionTest(koji.policy.MatchTest):
"""Checks version against glob patterns"""
name = 'version'
field = '_version'
def run(self, data):
data[self.field] = policy_get_version(data)
return super(VersionTest, self).run(data)
class ReleaseTest(koji.policy.MatchTest):
"""Checks release against glob patterns"""
name = 'release'
field = '_release'
def run(self, data):
#we need to find the build NVR from the base data
data[self.field] = policy_get_release(data)
return super(ReleaseTest, self).run(data)
class VolumeTest(koji.policy.MatchTest):
"""Checks storage volume against glob patterns"""
name = 'volume'

View file

@ -24,6 +24,22 @@ class TestBasicTests(unittest.TestCase):
policy_get_pkg.return_value = {'name': 'foobar'}
self.assertTrue(obj.run({}))
@mock.patch('kojihub.policy_get_version')
def test_version_test(self, policy_get_version):
obj = kojihub.VersionTest('version 1.2.*')
policy_get_version.return_value = '0.0.1'
self.assertFalse(obj.run({}))
policy_get_version.return_value = '1.2.1'
self.assertTrue(obj.run({}))
@mock.patch('kojihub.policy_get_release')
def test_release_test(self, policy_get_release):
obj = kojihub.ReleaseTest('release 1.2.*')
policy_get_release.return_value = '0.0.1'
self.assertFalse(obj.run({}))
policy_get_release.return_value = '1.2.1'
self.assertTrue(obj.run({}))
@mock.patch('kojihub.policy_get_pkg')
def test_new_package_test(self, policy_get_pkg):
obj = kojihub.NewPackageTest('is_new_package')