simpler gen_draft_release and parse_target_release
This commit is contained in:
parent
cc8ccbf45e
commit
34c6712fde
6 changed files with 34 additions and 47 deletions
|
|
@ -297,8 +297,8 @@ DEFAULT_REQUEST_TIMEOUT = 60 * 60 * 12
|
|||
DEFAULT_AUTH_TIMEOUT = 60
|
||||
|
||||
# draft release constants
|
||||
DRAFT_RELEASE_FORMAT = '{release},draft_{id}'
|
||||
DRAFT_RELEASE_PARSING_REGEX = r'^(?P<release>.+),draft_(?P<id>[0-9]+)$'
|
||||
DRAFT_RELEASE_DELIMITER = ','
|
||||
DRAFT_RELEASE_FORMAT = '{release}' + DRAFT_RELEASE_DELIMITER + 'draft_{id}'
|
||||
|
||||
# BEGIN kojikamid dup #
|
||||
|
||||
|
|
@ -3930,50 +3930,33 @@ def fixEncodingRecurse(value, fallback='iso8859-15', remove_nonprintable=False):
|
|||
return walker.walk()
|
||||
|
||||
|
||||
def gen_draft_release(buildinfo):
|
||||
def gen_draft_release(release, id):
|
||||
"""Generate draft_release based on input build information
|
||||
|
||||
Currently, it's generated as {target_release},draft_{build_id}
|
||||
|
||||
:param buildinfo: buildinfo with target "release", used to generate draft_release
|
||||
:type buildinfo: dict
|
||||
:param str release: target "release", which is the release part of rpms' nvra,
|
||||
and will be the release of the build the draft build is going to be
|
||||
promoted to.
|
||||
:param int id: the build "id" part in draft_release (it's unchanged so it can be used to
|
||||
keep the uniqueness of build NVR)
|
||||
:return: draft release
|
||||
:rtype: str
|
||||
:raises GenericError: if missing any required field
|
||||
"""
|
||||
for k in ('id', 'release'):
|
||||
if not buildinfo.get(k):
|
||||
raise GenericError("key: '%s' not found in %s" % (k, buildinfo))
|
||||
return DRAFT_RELEASE_FORMAT.format(**buildinfo)
|
||||
return DRAFT_RELEASE_FORMAT.format(**locals())
|
||||
|
||||
|
||||
def parse_target_release(buildinfo):
|
||||
"""Generate target_release from a draft buildinfo reversely
|
||||
def parse_target_release(draft_release):
|
||||
"""Generate target_release from a draft release reversely
|
||||
|
||||
:param buildinfo: buildinfo of a draft build
|
||||
:type buildinfo: dict
|
||||
:param str draft_release: release of a draft build
|
||||
:rtype: str
|
||||
:raises GenericError: if missing draft field in buildinfo
|
||||
:raises GenericError: if cannot get a valid target_release
|
||||
"""
|
||||
draft_release = buildinfo.get('release')
|
||||
if not draft_release:
|
||||
raise GenericError("'release' not found in %s" % buildinfo)
|
||||
build_id = buildinfo.get('id')
|
||||
if build_id:
|
||||
build_id = str(build_id)
|
||||
else:
|
||||
raise GenericError("'id' not found in %s" % buildinfo)
|
||||
match = re.match(DRAFT_RELEASE_PARSING_REGEX, draft_release)
|
||||
if match:
|
||||
if build_id != match.group('id'):
|
||||
raise GenericError(
|
||||
"buildinfo.id: %s doesn't match build id part: %s in buildinfo.release: %s" %
|
||||
(build_id, match.group('id'), draft_release)
|
||||
)
|
||||
return match.group('release')
|
||||
else:
|
||||
parts = draft_release.split(DRAFT_RELEASE_DELIMITER, 1)
|
||||
if len(parts) != 2 or not parts[-1].startswith('draft_'):
|
||||
raise GenericError("draft release: %s is not in valid format" % draft_release)
|
||||
return parts[0]
|
||||
|
||||
|
||||
def add_file_logger(logger, fn):
|
||||
|
|
|
|||
|
|
@ -6118,7 +6118,9 @@ def new_build(data, strict=False):
|
|||
# handle draft suffix in release
|
||||
if data.get('draft'):
|
||||
target_release = data['release']
|
||||
data['release'] = insert_data['release'] = koji.gen_draft_release(data)
|
||||
data['release'] = insert_data['release'] = koji.gen_draft_release(
|
||||
data['release'], data['id']
|
||||
)
|
||||
# it's still possible to already have a build with the same nvr
|
||||
draft_nvr = dslice(data, ['name', 'version', 'release'])
|
||||
if find_build_id(draft_nvr):
|
||||
|
|
@ -6428,7 +6430,7 @@ def import_rpm(fn, buildinfo=None, brootid=None, wrapper=False, fileinfo=None, d
|
|||
nvrinfo = buildinfo.copy()
|
||||
if draft:
|
||||
# for draft build, change release to target_release
|
||||
nvrinfo['release'] = koji.parse_target_release(buildinfo)
|
||||
nvrinfo['release'] = koji.parse_target_release(buildinfo['release'])
|
||||
srpmname = "%(name)s-%(version)s-%(release)s.src.rpm" % nvrinfo
|
||||
# either the sourcerpm field should match the build, or the filename
|
||||
# itself (for the srpm)
|
||||
|
|
@ -7660,6 +7662,7 @@ def new_image_build(build_info):
|
|||
def new_typed_build(build_info, btype):
|
||||
"""Mark build as a given btype"""
|
||||
# add here in case disabling draft build for non-rpm is missing before calling this
|
||||
# TODO: remove it once draft build is expended to all types
|
||||
if btype != 'rpm':
|
||||
reject_draft(build_info)
|
||||
btype_id = lookup_name('btype', btype, strict=True)['id']
|
||||
|
|
@ -16024,7 +16027,7 @@ def _promote_build(build, user=None, strict=True, force=False):
|
|||
# get target release
|
||||
target_release = None
|
||||
try:
|
||||
target_release = koji.parse_target_release(binfo)
|
||||
target_release = koji.parse_target_release(old_release)
|
||||
except Exception:
|
||||
if strict:
|
||||
raise
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ class TestCliListTagged(utils.CliTestCase):
|
|||
{'id': 2,
|
||||
'name': 'packagename',
|
||||
'version': 'version',
|
||||
'release': '2.el6#draft_2',
|
||||
'release': '2.el6,draft_2',
|
||||
'nvr': 'n-v-r',
|
||||
'draft': True,
|
||||
'tag_name': 'tag',
|
||||
|
|
@ -129,7 +129,7 @@ n-v-r tag owner
|
|||
def test_list_tagged_rpms(self, event_from_opts_mock, stdout):
|
||||
expected = """sigkey rpmA-0.0.1-1.el6.noarch
|
||||
sigkey rpmA-0.0.1-1.el6.x86_64
|
||||
sigkey rpmA-0.0.1-2.el6.x86_64 (#draft_2)
|
||||
sigkey rpmA-0.0.1-2.el6.x86_64 (,draft_2)
|
||||
"""
|
||||
args = [self.tag, self.pkg, '--latest-n=3', '--rpms', '--sigs',
|
||||
'--arch=x86_64', '--arch=noarch']
|
||||
|
|
@ -150,7 +150,7 @@ sigkey rpmA-0.0.1-2.el6.x86_64 (#draft_2)
|
|||
def test_list_tagged_rpms_paths(self, event_from_opts_mock, stdout, os_path_exists, isdir):
|
||||
expected = """/mnt/koji/packages/packagename/version/1.el6/noarch/rpmA-0.0.1-1.el6.noarch.rpm
|
||||
/mnt/koji/packages/packagename/version/1.el6/x86_64/rpmA-0.0.1-1.el6.x86_64.rpm
|
||||
/mnt/koji/packages/packagename/version/2.el6#draft_2/x86_64/rpmA-0.0.1-2.el6.x86_64.rpm
|
||||
/mnt/koji/packages/packagename/version/2.el6,draft_2/x86_64/rpmA-0.0.1-2.el6.x86_64.rpm
|
||||
"""
|
||||
args = [self.tag, self.pkg, '--latest-n=3', '--rpms', '--arch=x86_64', '--paths']
|
||||
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ class TestImportRPM(unittest.TestCase):
|
|||
'state': koji.BUILD_STATES['COMPLETE'],
|
||||
'name': 'name',
|
||||
'version': 'version',
|
||||
'release': 'release#draft_12345',
|
||||
'release': 'release,draft_12345',
|
||||
'id': 12345,
|
||||
'draft': True,
|
||||
'extra': {
|
||||
|
|
@ -303,7 +303,7 @@ class TestImportRPM(unittest.TestCase):
|
|||
'state': koji.BUILD_STATES['COMPLETE'],
|
||||
'name': 'name',
|
||||
'version': 'version',
|
||||
'release': 'release#draft_12345',
|
||||
'release': 'release,draft_12345',
|
||||
'id': 12345,
|
||||
'draft': True
|
||||
}
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ class TestNewBuild(unittest.TestCase):
|
|||
'id': 108,
|
||||
'owner': 123,
|
||||
'pkg_id': 54,
|
||||
'release': 'test_release#draft_108',
|
||||
'release': 'test_release,draft_108',
|
||||
'source': None,
|
||||
'start_time': 'NOW',
|
||||
'state': 1,
|
||||
|
|
@ -202,5 +202,5 @@ class TestNewBuild(unittest.TestCase):
|
|||
{
|
||||
'name': 'test_name',
|
||||
'version': 'test_version',
|
||||
'release': 'test_release#draft_108'
|
||||
'release': 'test_release,draft_108'
|
||||
})
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class TestPromoteBuild(unittest.TestCase):
|
|||
'id': 1,
|
||||
'name': 'foo',
|
||||
'version': 'bar',
|
||||
'release': 'tgtrel#draft_1',
|
||||
'release': 'tgtrel,draft_1',
|
||||
'nvr': 'testnvr',
|
||||
'extra': {
|
||||
'draft': {
|
||||
|
|
@ -85,7 +85,7 @@ class TestPromoteBuild(unittest.TestCase):
|
|||
'draft': {
|
||||
'promoted': True,
|
||||
'target_release': 'tgtrel',
|
||||
'old_release': 'tgtrel#draft_1',
|
||||
'old_release': 'tgtrel,draft_1',
|
||||
'promotion_time': 'NOW',
|
||||
'promotion_ts': self._now.timestamp(),
|
||||
'promoter': self.user['name']
|
||||
|
|
@ -120,12 +120,13 @@ class TestPromoteBuild(unittest.TestCase):
|
|||
self.assertIsNone(ret)
|
||||
self.assertEqual(len(self.updates), 0)
|
||||
|
||||
def test_promote_build__target_release(self):
|
||||
def test_promote_build_target_release(self):
|
||||
draft = {
|
||||
'id': 1,
|
||||
'name': 'foo',
|
||||
'version': 'bar',
|
||||
'release': 'tgtrel#draft_2',
|
||||
# bad delimiter
|
||||
'release': 'tgtrel@draft_1',
|
||||
'extra': {
|
||||
'draft': {
|
||||
'promoted': False,
|
||||
|
|
@ -145,7 +146,7 @@ class TestPromoteBuild(unittest.TestCase):
|
|||
self.exports.promoteBuild('a-regular-build', strict=True)
|
||||
self.assertEqual(
|
||||
str(cm.exception),
|
||||
"buildinfo.id: 1 doesn't match build id part: 2 in buildinfo.release: tgtrel#draft_2"
|
||||
"draft release: tgtrel@draft_1 is not in valid format"
|
||||
)
|
||||
self.assertEqual(len(self.updates), 0)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue