From 32cee04b4358e7821daf81efaf0e92b3396b4163 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Aug 03 2022 11:05:46 +0000 Subject: www: more generic taskinfo parameter handling Related: https://pagure.io/koji/issue/3454 --- diff --git a/tests/test_www/test_taskinfo.py b/tests/test_www/test_taskinfo.py index 4648bcb..daf270f 100644 --- a/tests/test_www/test_taskinfo.py +++ b/tests/test_www/test_taskinfo.py @@ -267,18 +267,27 @@ class TestTaskInfo(unittest.TestCase): server = self.__get_server(task) self.get_server.return_value = server webidx.taskinfo(self.environ, self.task_id) - server.getTag.assert_called_with('testTag') + server.getTag.assert_called_with('testTag', strict=True) server.getBuild.assert_called_with('testBuild') # case 5. newRepo, distRepo, createdstrepo - for m in ('newRepo', 'distRepo', 'createdistrepo'): + for m in ('newRepo', 'distRepo'): task = copy.deepcopy(self.task) task.update({'method': m}) - task.update({'request': ['RepoTag']}) + task.update({'request': ['RepoTag', 'repo_id', 'keys', 'task_opts']}) server = self.__get_server(task) self.get_server.return_value = server webidx.taskinfo(self.environ, self.task_id) - server.getTag.assert_called_with('RepoTag') + server.getTag.assert_called_with('RepoTag', strict=True) + + for m in ('createdistrepo',): + task = copy.deepcopy(self.task) + task.update({'method': m}) + task.update({'request': ['RepoTag', 'repo_id', 'arch', 'keys', 'opts']}) + server = self.__get_server(task) + self.get_server.return_value = server + webidx.taskinfo(self.environ, self.task_id) + server.getTag.assert_called_with('RepoTag', strict=True) # case 6. tagNotification task = copy.deepcopy(self.task) @@ -287,18 +296,17 @@ class TestTaskInfo(unittest.TestCase): server = self.__get_server(task) self.get_server.return_value = server webidx.taskinfo(self.environ, self.task_id) - server.getTag.assert_has_calls([call('destTag'), call('srcTag')]) + server.getTag.assert_has_calls([call('destTag', strict=True), call('srcTag', strict=True)]) server.getBuild.assert_called_with('theBuild') server.getUser.assert_called_with('user') # case 7. dependentTask task = copy.deepcopy(self.task) task.update({'method': 'dependantTask'}) - task.update({'request': [[]]}) + task.update({'request': [[], []]}) server = self.__get_server(task) self.get_server.return_value = server webidx.taskinfo(self.environ, self.task_id) - self.assertEqual(self.environ['koji.values']['deps'], []) # case 8. wrapperRPM task = copy.deepcopy(self.task) @@ -311,13 +319,15 @@ class TestTaskInfo(unittest.TestCase): 'wrapTask' ] self.get_server.return_value = server + server.getBuildTarget.return_value = 'tgt' webidx.taskinfo(self.environ, self.task_id) - self.assertEqual(self.environ['koji.values']['wrapTask'], 'wrapTask') + self.assertEqual(self.environ['koji.values']['params'], + {'build': '', 'build_target': 'tgt', 'spec_url': '', 'task': {'id': 999}}) # case 7. restartVerify task = copy.deepcopy(self.task) task.update({'method': 'restartVerify'}) - task.update({'request': [[]]}) + task.update({'request': ['task_id', 'host']}) server = self.__get_server(task) server.getTaskInfo.side_effect = [ task, @@ -326,7 +336,8 @@ class TestTaskInfo(unittest.TestCase): ] self.get_server.return_value = server webidx.taskinfo(self.environ, self.task_id) - self.assertEqual(self.environ['koji.values']['rtask'], 'restartVerify') + self.assertEqual(self.environ['koji.values']['params'], + {'host': 'host', 'task': 'restartVerify'}) def test_taskinfo_sorting_compare(self): """Test taskinfo function sorting results""" diff --git a/www/kojiweb/index.py b/www/kojiweb/index.py index e3ec3b3..fe69ecf 100644 --- a/www/kojiweb/index.py +++ b/www/kojiweb/index.py @@ -33,6 +33,7 @@ import time import itertools import koji +from koji.tasks import parse_task_params import kojiweb.util from koji.server import ServerRedirect from kojiweb.util import _genHTML, _getValidTokens, _initValues @@ -641,9 +642,17 @@ def taskinfo(environ, taskID): values['title'] = koji.taskLabel(task) + ' | Task Info' + try: + params = parse_task_params(task['method'], task['request']) + except TypeError: + # unknown tasks/plugins + params = {'args': task['request']} values['task'] = task - params = task['request'] values['params'] = params + if 'opts' in params: + values['opts'] = params.pop('opts') + else: + values['opts'] = {} if task['channel_id']: channel = server.getChannel(task['channel_id']) @@ -687,49 +696,55 @@ def taskinfo(environ, taskID): buildroots = server.listBuildroots(taskID=task['id']) values['buildroots'] = buildroots - if task['method'] in ('buildArch', 'buildMaven', 'buildSRPMFromSCM'): - if len(params) > 1: - tag_id = params[1] + def _get_tag(tag_id): + if not tag_id: + return None + elif isinstance(tag_id, dict): + return tag_id + else: try: - values['buildTag'] = server.getTag(tag_id, strict=True) + return server.getTag(tag_id, strict=True) except koji.GenericError: - values['buildTag'] = {'name': "%d (deleted)" % tag_id, 'id': None} - elif task['method'] == 'tagBuild': - destTag = server.getTag(params[0]) - build = server.getBuild(params[1]) - values['destTag'] = destTag - values['build'] = build - elif task['method'] in ('newRepo', 'distRepo', 'createdistrepo'): - tag = server.getTag(params[0]) - values['tag'] = tag - elif task['method'] == 'tagNotification': - destTag = None - if params[2]: - destTag = server.getTag(params[2]) - srcTag = None - if params[3]: - srcTag = server.getTag(params[3]) - build = server.getBuild(params[4]) - user = server.getUser(params[5]) - values['destTag'] = destTag - values['srcTag'] = srcTag - values['build'] = build - values['user'] = user - elif task['method'] == 'dependantTask': - deps = [server.getTaskInfo(depID, request=True) for depID in params[0]] - values['deps'] = deps - elif task['method'] == 'wrapperRPM': - buildTarget = params[1] - values['buildTarget'] = buildTarget - if params[3]: - wrapTask = server.getTaskInfo(params[3]['id'], request=True) - values['wrapTask'] = wrapTask - elif task['method'] == 'restartVerify': - values['rtask'] = server.getTaskInfo(params[0], request=True) - elif task['method'] == 'build': - if len(params) > 1: - if isinstance(params[1], dict): - params[1] = params[1].get('name') + return {'name': "%d (deleted)" % tag_id, 'id': None} + + if 'root' in params: + params['build_tag'] = _get_tag(params.pop('root')) + if 'tag_id' in params: + params['destination_tag'] = _get_tag(params.pop('tag_id')) + if 'tag' in params: + params['tag'] = _get_tag(params.pop('tag')) + if 'tag_info' in params: + params['destination_tag'] = _get_tag(params.pop('tag_info')) + if 'from_info' in params: + params['source tag'] = _get_tag(params.pop('from_info')) + if 'build_info' in params: + params['build'] = server.getBuild(params.pop('build_info')) + if 'build_id' in params: + params['build'] = server.getBuild(params.pop('build_id')) + if 'user_info' in params: + params['user'] = server.getUser(params.pop('user_info')) + if 'task_list' in params: + tmp = [] + for t in params.pop('task_list'): + base = parse_task_params(t[0], t[1]) + base['method'] = t[0] + base['opts'] = t[2] + tmp.append(base) + params['task_list'] = tmp + if 'wait_list' in params: + params['wait_list'] = [server.getTaskInfo(t) for t in params['wait_list']] + if 'target' in params: + params['build_target'] = server.getBuildTarget(params.pop('target')) + if 'build_target' in params: + params['build_target'] = server.getBuildTarget(params.pop('build_target')) + if 'build_tag' in params: + params['build_tag'] = _get_tag(params.pop('build_tag')) + if 'task_id' in params: + params['task'] = server.getTaskInfo(params.pop('task_id'), request=True) + if 'repo_id' in params: + params['repo'] = server.repoInfo(params.pop('repo_id')) + if 'buildrootID' in params: + params['buildroot'] = server.getBuildroot(params.pop('buildrootID')) values['taskBuilds'] = [] if task['state'] in (koji.TASK_STATES['CLOSED'], koji.TASK_STATES['FAILED']): @@ -767,10 +782,6 @@ def taskinfo(environ, taskID): else: values['perms'] = [] - try: - values['params_parsed'] = _genHTML(environ, 'taskinfo_params.chtml') - except Exception: - values['params_parsed'] = None return _genHTML(environ, 'taskinfo.chtml') diff --git a/www/kojiweb/taskinfo.chtml b/www/kojiweb/taskinfo.chtml index 45e736b..d966a5a 100644 --- a/www/kojiweb/taskinfo.chtml +++ b/www/kojiweb/taskinfo.chtml @@ -30,6 +30,65 @@ #end if #end def +#def printMap($vals, $prefix='') + #for $key, $value in $vals.items() + #if $key == 'properties' + ${prefix}properties = $printProperties($value)
+ #elif $key != '__starstar' + $prefix$key = $printValue($key, $value)
+ #end if + #end for +#end def + +#def printOpts($opts) + #if $opts + Options:
+ $printMap($opts, '  ') + #end if +#end def + +#def printValue($key, $value, $sep=', ') + #if $value is None +None + #elif $key == 'user' +$value['name'] + #elif $key == 'task' +$value['id'] + #elif $key == 'host' +$value['name'] + #elif $key == 'build' +$value['nvr'] + #elif $key == 'buildroot' +$value['id'] + #elif $key in ('tag', 'destination_tag', 'build_tag') +$value['name'] + #elif $key in ('build_target', 'target_info') +$value['name'] + #elif $key in ('repo_info', 'oldrepo', 'repo') + #if $key == 'repo' and isinstance($value, list) +$sep.join([$str($val) for $val in $value]) + #else +$value.id ($koji.formatTimeLong($value.create_ts)) + #end if + #elif $key == 'task_list' + #for $task in $params['task_list'] +
 Task:
+ $printMap($task, '  ') + #end for + #elif $isinstance($value, list) +$sep.join([$str($val) for $val in $value]) + #elif $isinstance($value, dict) +$sep.join(['%s=%s' % (($n == '' and "''" or $n), $v) for $n, $v in $value.items()]) + #else +$value + #end if +#end def + +#def printProperties($props) + #echo ', '.join([$v is not None and '%s=%s' % ($n, $v) or $str($n) for $n, $v in $props.items()]) +#end def + + #include "includes/header.chtml"

Information for task $util.escapeHTML($koji.taskLabel($task))

@@ -44,12 +103,12 @@ Parameters - #if $params_parsed - $params_parsed - #else -
Parameters are not correct for this method.
- $params - #end if + #for key in $sorted($params) + #if $params[$key] is not None + $key.capitalize().replace('_', ' '): $printValue($key, $params[$key])
+ #end if + #end for + $printOpts($opts) diff --git a/www/kojiweb/taskinfo_params.chtml b/www/kojiweb/taskinfo_params.chtml deleted file mode 100644 index 6cdd371..0000000 --- a/www/kojiweb/taskinfo_params.chtml +++ /dev/null @@ -1,279 +0,0 @@ -#from urllib.parse import quote -#import koji -#from kojiweb import util - -#def printValue($key, $value, $sep=', ') - #if $key in ('brootid', 'buildroot_id') -$value - #elif $isinstance($value, list) -$sep.join([$str($val) for $val in $value]) - #elif $isinstance($value, dict) -$sep.join(['%s=%s' % (($n == '' and "''" or $n), $v) for $n, $v in $value.items()]) - #else -$value - #end if -#end def - -#def printProperties($props) - #echo ', '.join([$v is not None and '%s=%s' % ($n, $v) or $str($n) for $n, $v in $props.items()]) -#end def - -#def printMap($vals, $prefix='') - #for $key, $value in $vals.items() - #if $key == 'properties' - ${prefix}properties = $printProperties($value)
- #elif $key != '__starstar' - $prefix$key = $printValue($key, $value)
- #end if - #end for -#end def - -#def printOpts($opts) - #if $opts - Options:
- $printMap($opts, '  ') - #end if -#end def - -#if $task.method == 'buildSRPMFromSCM' -SCM URL: $params[0]
-#if $len($params) > 1 -Build Tag: -#if $buildTag.id -$util.escapeHTML($buildTag.name) -#else -$util.escapeHTML($buildTag.name) -#end if -
-#end if -#if $len($params) > 2 -$printOpts($params[2]) -#end if -#elif $task.method == 'buildSRPMFromCVS' -CVS URL: $params[0] -#elif $task.method == 'buildArch' -SRPM: $params[0]
-Build Tag: -#if $buildTag.id -$util.escapeHTML($buildTag.name) -#else -$util.escapeHTML($buildTag.name) -#end if -
-Arch: $params[2]
-Keep SRPM? #if $params[3] then 'yes' else 'no'#
-#if $len($params) > 4 -$printOpts($params[4]) -#end if -#elif $task.method == 'tagBuild' -Destination Tag: $util.escapeHTML($destTag.name)
-Build: $util.escapeHTML($koji.buildLabel($build)) -#elif $task.method == 'buildNotification' -#set $build = $params[1] -#set $buildTarget = $params[2] -Recipients: $printValue('', $params[0])
-Build: $util.escapeHTML($koji.buildLabel($build))
-#if $buildTarget -Build Target: $util.escapeHTML($buildTarget.name)
-#else -Build Target: (no build target)
-#end if -Web URL: $params[3] -#elif $task.method == 'tagNotification' -Recipients: $printValue('', $params[0])
-Successful?: #if $params[1] then 'yes' else 'no'#
-#if $destTag -Tagged Into: $util.escapeHTML($destTag.name)
-#end if -#if $srcTag -#if $destTag then 'Moved From:' else 'Untagged From:'# $util.escapeHTML($srcTag.name)
-#end if -Build: $util.escapeHTML($koji.buildLabel($build))
-#if $destTag then 'Tagged By:' else 'Untagged By:'# $util.escapeHTML($user.name)
-Ignore Success?: #if $params[6] then 'yes' else 'no'#
-#if $params[7] -Failure Message: $params[7] -#end if -#elif $task.method == 'build' -Source: $params[0]
-Build Target: $util.escapeHTML($params[1])
-$printOpts($params[2]) -#elif $task.method == 'maven' -SCM URL: $util.escapeHTML($params[0])
-Build Target: $util.escapeHTML($params[1])
-$printOpts($params[2]) -#elif $task.method == 'buildMaven' -SCM URL: $util.escapeHTML($params[0])
-Build Tag: -#if $buildTag.id -$util.escapeHTML($buildTag.name) -#else -$util.escapeHTML($buildTag.name) -#end if -
-#if $len($params) > 2 -$printOpts($params[2]) -#end if -#elif $task.method == 'wrapperRPM' -Spec File URL: $params[0]
-#if 'locked' in $buildTarget -#set $buildTag = $buildTarget.name -Build Tag: -#if $buildTag.id -$util.escapeHTML($buildTag.name) -#else -$util.escapeHTML($buildTag.name) -#end if -
-#else -Build Target: $util.escapeHTML($buildTarget.name)
-#end if -#if $params[2] -Build: $koji.buildLabel($params[2])
-#end if -#if $params[3] -Task: $koji.taskLabel($wrapTask)
-#end if -#if $len($params) > 4 -$printOpts($params[4]) -#end if -#elif $task.method == 'chainmaven' -Builds:
- -#for $key, $val in $params[0].items() - -#end for -
$key:$printMap($val)
-Build Target: $util.escapeHTML($params[1])
-#if $len($params) > 2 -$printOpts($params[2]) -#end if -#elif $task.method == 'livecd' or $task.method == 'appliance' or $task.method == 'livemedia' -Name: $util.escapeHTML($params[0])
-Version: $util.escapeHTML($params[1])
-Arch: $util.escapeHTML($params[2])
-Build Target: $util.escapeHTML($params[3])
-Kickstart File: $util.escapeHTML($params[4])
-$printOpts($params[5]) -#elif $task.method == 'image' -Arches: #echo ', '.join($params[2])#
-Build Target: $util.escapeHTML($params[3])
-Installation Tree: $params[4]
-$printOpts($params[5]) -#elif $task.method == 'createLiveCD' or $task.method == 'createAppliance' or $task.method == 'createLiveMedia' -#if $len($params) > 4: -## new method signature -Arch: $util.escapeHTML($params[3])
-Kickstart File: $util.escapeHTML($params[7])
-#if $len($params) > 8 -$printOpts($params[8]) -#end if -#else -## old method signature -Arch: $util.escapeHTML($params[0])
-Build Target: $util.escapeHTML($params[1])
-Kickstart File: $util.escapeHTML($params[2])
-#if $len($params) > 3 -$printOpts($params[3]) -#end if -#end if -#elif $task.method == 'createImage' -#set $target = $params[4] -Build Target: $util.escapeHTML($target.name)
-Install Tree: $util.escapeHTML($params[7])
-$printOpts($params[8]) -#elif $task.method == 'winbuild' -VM: $util.escapeHTML($params[0])
-SCM URL: $util.escapeHTML($params[1])
-Build Target: $util.escapeHTML($params[2])
-#if $len($params) > 3 -$printOpts($params[3]) -#end if -#elif $task.method == 'vmExec' -VM: $util.escapeHTML($params[0])
-Exec Params:
-#for $info in $params[1] -#if $isinstance($info, dict) -$printMap($info, '    ') -#else -  $info
-#end if -#end for -#if $len($params) > 2 -$printOpts($params[2]) -#end if -#elif $task.method == 'newRepo' -Tag: $util.escapeHTML($tag.name)
-#if $len($params) > 1 - $printOpts($params[1]) -#end if -#elif $task.method == 'distRepo' -Tag: $util.escapeHTML($tag.name)
-Repo ID: $params[1]
-Keys: $printValue(0, $params[2])
-$printOpts($params[3]) -#elif $task.method == 'prepRepo' -Tag: $util.escapeHTML($params[0].name) -#elif $task.method == 'createrepo' -Repo ID: $params[0]
-Arch: $util.escapeHTML($params[1])
-#set $oldrepo = $params[2] -#if $oldrepo - Old Repo ID: $oldrepo.id
- Old Repo Creation: $koji.formatTimeLong($oldrepo.create_ts)
-#end if -#if $len($params) > 4 and $params[4] - External Repos: $printValue(None, [ext['external_repo_name'] for ext in $params[3]])
-#end if -#elif $task.method == 'createdistrepo' -Tag: $util.escapeHTML($tag.name)
-Repo ID: $params[1]
-Arch: $printValue(0, $params[2])
-Keys: $printValue(0, $params[3])
-Options: $printMap($params[4], '    ') -#elif $task.method == 'dependantTask' -Dependant Tasks:
-#for $dep in $deps -  $koji.taskLabel($dep)
-#end for -Subtasks:
-#for $subtask in $params[1] -  Method: $subtask[0]
-  Parameters: #echo ', '.join([$str($subparam) for $subparam in $subtask[1]])#
-#if $len($subtask) > 2 and $subtask[2] -  Options:
-$printMap($subtask[2], '    ') -#end if -
-#end for -#elif $task.method == 'chainbuild' -Build Groups:
-#set $groupNum = 0 -#for $urls in $params[0] -#set $groupNum += 1 -  $groupNum: #echo ', '.join($urls)#
-#end for -Build Target: $util.escapeHTML($params[1])
-$printOpts($params[2]) -#elif $task.method == 'waitrepo' -Build Tag: $util.escapeHTML($params[0])
-#if $params[1] -Newer Than: $util.escapeHTML($params[1])
-#end if -#if $params[2] -NVRs: $printValue('', $params[2]) -#end if -#elif $task.method == 'restart' -Host: $util.escapeHTML($params[0].name)
-#elif $task.method == 'restartVerify' -Host: $util.escapeHTML($params[1].name)
-Restart Task: - $koji.taskLabel($rtask)
-#elif $task.method == 'runroot' -Build Tag: $params[0]
-Arch: $util.escapeHTML($params[1])
-$printOpts($params[3]) -Commands: $util.escapeHTML($params[2])
-#else -$params -#end if