From 282058dafe1e57860910c4b4f1911632095e2cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubom=C3=ADr=20Sedl=C3=A1=C5=99?= Date: Mon, 21 Mar 2016 10:58:36 +0100 Subject: [PATCH] [atomic] Add a script to create ostree repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a wrapper over ostree and rpm-ostree. It is intended to be run in either Koji or Mock chroot. Signed-off-by: Lubomír Sedlář --- bin/pungi-make-ostree | 15 +++++++++++ pungi/atomic.py | 51 +++++++++++++++++++++++++++++++++++++ tests/test_atomic_script.py | 38 +++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100755 bin/pungi-make-ostree create mode 100644 pungi/atomic.py create mode 100755 tests/test_atomic_script.py diff --git a/bin/pungi-make-ostree b/bin/pungi-make-ostree new file mode 100755 index 00000000..4066bdc6 --- /dev/null +++ b/bin/pungi-make-ostree @@ -0,0 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys + +here = sys.path[0] +if here != '/usr/bin': + sys.path.insert(0, os.path.dirname(here)) + +from pungi import atomic + + +if __name__ == '__main__': + atomic.main() diff --git a/pungi/atomic.py b/pungi/atomic.py new file mode 100644 index 00000000..95ccfe0c --- /dev/null +++ b/pungi/atomic.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +""" +This module contains functions required by pungi-make-atomic. +It is expected to be runnable in Koji runroot. +""" + +import argparse +import os +from kobo import shortcuts + + +def make_log_file(log_dir, filename): + """Return path to log file with given name, if log_dir is set.""" + if not log_dir: + return None + return os.path.join(log_dir, '{}.log'.format(filename)) + + +def init_atomic_repo(repo, log_dir=None): + """If the atomic repo does not exist, initialize it.""" + log_file = make_log_file(log_dir, 'init-atomic-repo') + if not os.path.isdir(repo): + shortcuts.run(['ostree', 'init', '--repo={}'.format(repo), '--mode=archive-z2'], + log_file=log_file) + + +def make_ostree_repo(repo, config, log_dir=None): + log_file = make_log_file(log_dir, 'create-atomic-repo') + shortcuts.run(['rpm-ostree', 'compose', 'tree', '--repo={}'.format(repo), config], + log_file=log_file) + + +def run(opts): + init_atomic_repo(opts.atomic_repo, log_dir=opts.log_dir) + make_ostree_repo(opts.atomic_repo, opts.treefile, log_dir=opts.log_dir) + + +def main(args=None): + parser = argparse.ArgumentParser() + parser.add_argument('--log-dir', + help='where to log output') + + parser.add_argument('atomic_repo', metavar='ATOMIC_REPO', + help='where to put the atomic repo') + parser.add_argument('--treefile', required=True, + help='treefile for rpm-ostree') + + opts = parser.parse_args(args) + + run(opts) diff --git a/tests/test_atomic_script.py b/tests/test_atomic_script.py new file mode 100755 index 00000000..13aa825f --- /dev/null +++ b/tests/test_atomic_script.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + + +import unittest +import mock + +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'bin')) + +from tests import helpers +from pungi import atomic + + +class OstreeScriptTest(helpers.PungiTestCase): + + @mock.patch('kobo.shortcuts.run') + def test_full_run(self, run): + atomic.main([ + '--log-dir={}'.format(os.path.join(self.topdir, 'logs', 'Atomic')), + '--treefile={}'.format(os.path.join(self.topdir, 'work', 'fedora-atomic-docker-host.json')), + os.path.join(self.topdir, 'atomic'), + ]) + self.maxDiff = None + self.assertItemsEqual( + run.call_args_list, + [mock.call(['ostree', 'init', '--repo={}/atomic'.format(self.topdir), '--mode=archive-z2'], + log_file=self.topdir + '/logs/Atomic/init-atomic-repo.log'), + mock.call(['rpm-ostree', 'compose', 'tree', '--repo={}/atomic'.format(self.topdir), + self.topdir + '/work/fedora-atomic-docker-host.json'], + log_file=self.topdir + '/logs/Atomic/create-atomic-repo.log')]) + + +if __name__ == '__main__': + unittest.main()