debian-koji/plugins/hub/save_failed_tree.py
2022-12-08 09:57:35 +01:00

51 lines
1.9 KiB
Python

import koji
from koji.context import context
from koji.plugin import export
import kojihub
__all__ = ('saveFailedTree',)
CONFIG_FILE = '/etc/koji-hub/plugins/save_failed_tree.conf'
config = None
allowed_methods = None
@export
def saveFailedTree(buildrootID, full=False, **opts):
"""Create saveFailedTree task
If arguments are invalid, error message is returned. Otherwise task id of
newly created task is returned."""
global config, allowed_methods
# let it raise errors
buildrootID = kojihub.convert_value(buildrootID, cast=int)
full = bool(full)
# read configuration only once
if config is None:
config = koji.read_config_files([(CONFIG_FILE, True)])
allowed_methods = config.get('permissions', 'allowed_methods').split(',')
if len(allowed_methods) == 1 and allowed_methods[0] == '*':
allowed_methods = '*'
brinfo = kojihub.get_buildroot(buildrootID, strict=True)
taskID = brinfo['task_id']
task_info = kojihub.Task(taskID).getInfo()
if task_info['state'] != koji.TASK_STATES['FAILED']:
raise koji.PreBuildError(
"Task %s has not failed. Only failed tasks can upload their buildroots." % taskID)
elif allowed_methods != '*' and task_info['method'] not in allowed_methods:
raise koji.PreBuildError(
"Only %s tasks can upload their buildroots (Task %s is %s)." %
(', '.join(allowed_methods), task_info['id'], task_info['method']))
elif task_info["owner"] != context.session.user_id and not context.session.hasPerm('admin'):
raise koji.ActionNotAllowed("Only owner of failed task or 'admin' can run this task.")
elif not kojihub.get_host(task_info['host_id'])['enabled']:
raise koji.PreBuildError("Host is disabled.")
args = koji.encode_args(buildrootID, full, **opts)
taskopts = {
'assign': brinfo['host_id'],
}
return kojihub.make_task('saveFailedTree', args, **taskopts)