From dd5425f23ea6b4875ee9979a458a587e0590c180 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Wed, 26 Oct 2016 10:55:39 +0200 Subject: [PATCH] Basic functionality for save_failed_tree plugin --- plugins/builder/save_failed_tree.py | 40 +++++++++++++++++++++++++++++ plugins/hub/save_failed_tree.py | 29 +++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 plugins/builder/save_failed_tree.py create mode 100644 plugins/hub/save_failed_tree.py diff --git a/plugins/builder/save_failed_tree.py b/plugins/builder/save_failed_tree.py new file mode 100644 index 00000000..784bf205 --- /dev/null +++ b/plugins/builder/save_failed_tree.py @@ -0,0 +1,40 @@ +import fnmatch +import os +import tarfile +import koji.tasks as tasks +from __main__ import BuildRoot + +__all__ = ('SaveFailedTreeTask',) + +def omit_ccache(tarinfo): + if fnmatch.fnmatch(tarinfo.name, '*/tmp/krb5cc') or \ + fnmatch.fnmatch(tarinfo.name, '*/etc/*.keytab'): + return None + else: + return tarinfo + + + +class SaveFailedTreeTask(tasks.BaseTaskHandler): + Methods = ['saveFailedTree'] + _taskWeight = 3.0 + + + def handler(self, taskID, full=False): + self.logger.debug("Starting saving buildroots for task %d [full=%s]" % (taskID, full)) + tar_path = os.path.join(self.workdir, 'broots-task-%s.tar.gz' % taskID) + f = tarfile.open(tar_path, "w:gz") + for broot in self.session.listBuildroots(taskID=taskID): + broot = BuildRoot(self.session, self.options, broot['id']) + path = broot.rootdir() + if full: + self.logger.debug("Adding buildroot (full): %s" % path) + else: + path = os.path.join(path, 'builddir') + self.logger.debug("Adding buildroot: %s" % path) + f.add(path, filter=omit_ccache) + f.close() + self.logger.debug("Uploading %s to hub." % tar_path) + self.uploadFile(tar_path) + os.unlink(tar_path) + self.logger.debug("Finished saving buildroots for task %d" % taskID) diff --git a/plugins/hub/save_failed_tree.py b/plugins/hub/save_failed_tree.py new file mode 100644 index 00000000..9eccca64 --- /dev/null +++ b/plugins/hub/save_failed_tree.py @@ -0,0 +1,29 @@ +import koji +from koji.plugin import export + +import sys +sys.path.insert(0, '/usr/share/koji-hub/') +import kojihub + +__all__ = ('saveFailedTree',) + +@export +def saveFailedTree(taskID, full=False, **opts): + # let it raise errors + taskID = int(taskID) + full = bool(full) + + task_info = kojihub.Task(taskID).getInfo() + if task_info['state'] != koji.TASK_STATES['FAILED']: + return 'Task %s has not failed.' % taskID + elif task_info['method'] != 'buildArch': + # TODO: allowed tasks could be defined in plugin hub config + return 'Only buildArch tasks can upload buildroot (Task %(id)s is %(method)s).' % task_info + # owner? + # permissions? + + args = koji.encode_args(taskID, full, **opts) + taskopts = { + 'assign': task_info['host_id'], + } + return kojihub.make_task('saveFailedTree', args, **taskopts)