From 054fea3d83717475d68e8ebe376e84ac3a2e2acc Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Fri, 2 Aug 2019 19:23:08 +0200 Subject: [PATCH] osbuild: add description() methods We already allow loading from a description. This adds the opposite direction to export Pipelines, Stages, and Assemblers. --- .travis.yml | 2 ++ osbuild/__init__.py | 26 +++++++++++++++ test/__init__.py | 0 test/test_osbuild.py | 77 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 test/__init__.py create mode 100644 test/test_osbuild.py diff --git a/.travis.yml b/.travis.yml index dcf6d97c..06789556 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ jobs: - name: pylint install: pip install pylint script: pylint osbuild osbuild-run assemblers/* stages/* + - name: unit-tests + script: python3 -m unittest test.test_osbuild - name: rpm before_install: - sudo apt-get install -y rpm python3-setuptools diff --git a/osbuild/__init__.py b/osbuild/__init__.py index 714779b5..099c5c9e 100644 --- a/osbuild/__init__.py +++ b/osbuild/__init__.py @@ -287,6 +287,13 @@ class Stage: self.name = name self.options = options + def description(self): + description = {} + description["name"] = self.name + if self.options: + description["options"] = self.options + return description + def run(self, tree, build_tree, interactive=False, check=True, libdir=None): with BuildRoot(build_tree) as buildroot: if interactive: @@ -322,6 +329,13 @@ class Assembler: self.name = name self.options = options + def description(self): + description = {} + description["name"] = self.name + if self.options: + description["options"] = self.options + return description + def run(self, tree, build_tree, output_dir=None, interactive=False, check=True, libdir=None): with BuildRoot(build_tree) as buildroot: if interactive: @@ -382,6 +396,18 @@ class Pipeline: def set_assembler(self, name, options=None): self.assembler = Assembler(name, options or {}) + def description(self): + description = {} + if self.base: + description["base"] = self.base + if self.build: + description["build"] = self.build.description() + if self.stages: + description["stages"] = [s.description() for s in self.stages] + if self.assembler: + description["assembler"] = self.assembler.description() + return description + @contextlib.contextmanager def get_buildtree(self, object_store): if self.build: diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/test_osbuild.py b/test/test_osbuild.py new file mode 100644 index 00000000..1142bb28 --- /dev/null +++ b/test/test_osbuild.py @@ -0,0 +1,77 @@ + +import osbuild +import unittest + + +class TestDescriptions(unittest.TestCase): + def test_canonical(self): + """Degenerate case. Make sure we always return the same canonical + description when passing empty or null values.""" + + cases = [ + {}, + { "assembler": None }, + { "stages": [] }, + { "build": {} }, + { "build": None } + ] + for pipeline in cases: + with self.subTest(pipeline): + self.assertEqual(osbuild.load(pipeline).description(), {}) + + def test_stage(self): + name = "org.osbuild.test" + options = { "one": 1 } + cases = [ + (osbuild.Stage(name, None, None, {}), {"name": name}), + (osbuild.Stage(name, None, None, None), {"name": name}), + (osbuild.Stage(name, None, None, options), {"name": name, "options": options}), + ] + for stage, description in cases: + with self.subTest(description): + self.assertEqual(stage.description(), description) + + def test_assembler(self): + name = "org.osbuild.test" + options = { "one": 1 } + cases = [ + (osbuild.Assembler(name, {}), {"name": name}), + (osbuild.Assembler(name, None), {"name": name}), + (osbuild.Assembler(name, options), {"name": name, "options": options}), + ] + for assembler, description in cases: + with self.subTest(description): + self.assertEqual(assembler.description(), description) + + def test_pipeline(self): + build = osbuild.Pipeline() + build.add_stage("org.osbuild.test", { "one": 1 }) + + pipeline = osbuild.Pipeline() + pipeline.set_build(build) + pipeline.add_stage("org.osbuild.test", { "one": 2 }) + pipeline.set_assembler("org.osbuild.test") + + self.assertEqual(pipeline.description(), { + "build": { + "stages": [ + { + "name": "org.osbuild.test", + "options": { "one": 1 } + } + ] + }, + "stages": [ + { + "name": "org.osbuild.test", + "options": { "one": 2 } + } + ], + "assembler": { + "name": "org.osbuild.test" + } + }) + + +if __name__ == "__main__": + unittest.main()