Retrieve task_id for older OSBS builds

Related: https://pagure.io/koji/issue/3906
This commit is contained in:
Tomas Kopecek 2023-09-06 16:45:14 +02:00
parent 268d07caf4
commit 0c58cd954d
5 changed files with 43 additions and 12 deletions

View file

@ -24,7 +24,7 @@ import six.moves.xmlrpc_client
from six.moves import filter, map, range, zip from six.moves import filter, map, range, zip
import koji import koji
from koji.util import base64encode, md5_constructor, to_list from koji.util import base64encode, extract_build_task, md5_constructor, to_list
from koji_cli.lib import ( from koji_cli.lib import (
TimeOption, TimeOption,
DatetimeJSONEncoder, DatetimeJSONEncoder,
@ -3600,8 +3600,9 @@ def anon_handle_buildinfo(goptions, session, args):
error_hit = True error_hit = True
continue continue
task = None task = None
if info['task_id']: task_id = extract_build_task(info)
task = session.getTaskInfo(info['task_id'], request=True) if task_id:
task = session.getTaskInfo(task_id, request=True)
taglist = [] taglist = []
for tag in session.listTags(build): for tag in session.listTags(build):
taglist.append(tag['name']) taglist.append(tag['name'])

View file

@ -970,3 +970,19 @@ def format_shell_cmd(cmd, text_width=80):
if line: if line:
s.append(line) s.append(line)
return ' \\\n'.join(s) return ' \\\n'.join(s)
def extract_build_task(binfo):
"""
Helper for extracting task id from buildinfo. CGs and older OSBS approach
can put it into different places in binfo
:param dict binfo: buildinfo
:returns int: task id
"""
task_id = binfo.get('task_id')
if task_id is None:
# legacy OSBS task id location
task_id = binfo.get('extra', {}).get('container_koji_task_id')
return task_id

View file

@ -68,6 +68,7 @@ from koji.util import (
base64encode, base64encode,
decode_bytes, decode_bytes,
dslice, dslice,
extract_build_task,
joinpath, joinpath,
md5_constructor, md5_constructor,
move_and_symlink, move_and_symlink,
@ -5968,7 +5969,7 @@ def apply_volume_policy(build, strict=False):
volume we be retained. volume we be retained.
""" """
policy_data = {'build': build} policy_data = {'build': build}
task_id = build['task_id'] task_id = extract_build_task(build)
if task_id: if task_id:
policy_data.update(policy_data_from_task(task_id)) policy_data.update(policy_data_from_task(task_id))
volume = check_volume_policy(policy_data, strict=strict) volume = check_volume_policy(policy_data, strict=strict)
@ -9690,14 +9691,15 @@ class SourceTest(koji.policy.MatchTest):
data[self.field] = data['source'] data[self.field] = data['source']
elif 'build' in data: elif 'build' in data:
build = get_build(data['build']) build = get_build(data['build'])
task_id = extract_build_task(build)
if build['source'] is not None: if build['source'] is not None:
data[self.field] = build['source'] data[self.field] = build['source']
elif build['task_id'] is None: elif task_id is None:
# no source to match against # no source to match against
return False return False
else: else:
# crack open the build task # crack open the build task
task = Task(build['task_id']) task = Task(task_id)
info = task.getInfo(request=True) info = task.getInfo(request=True)
method = info['method'] method = info['method']
request = info['request'] request = info['request']
@ -9718,8 +9720,7 @@ class SourceTest(koji.policy.MatchTest):
elif 'url' in params: elif 'url' in params:
data[self.field] = params['url'] data[self.field] = params['url']
else: else:
print("Unable to determine source from task '{}'".format( print("Unable to determine source from task '{}'".format(task_id))
build['task_id']))
return False return False
else: else:
return False return False

View file

@ -1634,6 +1634,16 @@ class TestFormatShellCmd(unittest.TestCase):
for inp, out in cases: for inp, out in cases:
self.assertEqual(koji.util.format_shell_cmd(inp, text_width=40), out) self.assertEqual(koji.util.format_shell_cmd(inp, text_width=40), out)
class TestExtractBuildTask(unittest.TestCase):
def test_valid_binfos(self):
binfos = [
{'id': 1, 'task_id': 123},
{'id': 1, 'extra': {'container_koji_task_id': 123}},
]
for binfo in binfos:
res = koji.util.extract_build_task(binfo)
self.assertEqual(res, 123)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -37,6 +37,7 @@ from koji.tasks import parse_task_params
import kojiweb.util import kojiweb.util
from koji.server import ServerRedirect from koji.server import ServerRedirect
from kojiweb.util import _genHTML, _getValidTokens, _initValues from kojiweb.util import _genHTML, _getValidTokens, _initValues
from koji.util import extract_build_task
# Convenience definition of a commonly-used sort function # Convenience definition of a commonly-used sort function
@ -1295,8 +1296,9 @@ def buildinfo(environ, buildID):
values[header] = koji.fixEncoding(result.get(header)) values[header] = koji.fixEncoding(result.get(header))
values['changelog'] = server.getChangelogEntries(build['id']) values['changelog'] = server.getChangelogEntries(build['id'])
if build['task_id']: task_id = extract_build_task(build)
task = server.getTaskInfo(build['task_id'], request=True) if task_id:
task = server.getTaskInfo(task_id, request=True)
# get the summary, description, and changelogs from the built srpm # get the summary, description, and changelogs from the built srpm
# if the build is not yet complete # if the build is not yet complete
if build['state'] != koji.BUILD_STATES['COMPLETE']: if build['state'] != koji.BUILD_STATES['COMPLETE']:
@ -2510,8 +2512,9 @@ def recentbuilds(environ, user=None, tag=None, package=None):
server.multicall = True server.multicall = True
for build in builds: for build in builds:
if build['task_id']: task_id = extract_build_task(build)
server.getTaskInfo(build['task_id'], request=True) if task_id:
server.getTaskInfo(task_id, request=True)
else: else:
server.echo(None) server.echo(None)
tasks = server.multiCall() tasks = server.multiCall()