diff --git a/osbuild/formats/v1.py b/osbuild/formats/v1.py index 3088176f..32f8e5aa 100644 --- a/osbuild/formats/v1.py +++ b/osbuild/formats/v1.py @@ -43,20 +43,20 @@ def describe(manifest: Manifest, *, with_id=False) -> Dict: return description -def load_build(description: Dict, result: List[Pipeline]): +def load_build(description: Dict, index: Index, result: List[Pipeline]): pipeline = description.get("pipeline") if pipeline: - build_pipeline = load_pipeline(pipeline, result) + build_pipeline = load_pipeline(pipeline, index, result) else: build_pipeline = None return build_pipeline, description["runner"] -def load_pipeline(description: Dict, result: List[Pipeline]) -> Pipeline: +def load_pipeline(description: Dict, index: Index, result: List[Pipeline]) -> Pipeline: build = description.get("build") if build: - build_pipeline, runner = load_build(build, result) + build_pipeline, runner = load_build(build, index, result) else: build_pipeline, runner = None, detect_host_runner() @@ -64,7 +64,8 @@ def load_pipeline(description: Dict, result: List[Pipeline]) -> Pipeline: pipeline = Pipeline(runner, build_id) for s in description.get("stages", []): - pipeline.add_stage(s["name"], s.get("options", {})) + info = index.get_module_info("Stage", s["name"]) + pipeline.add_stage(info, s.get("options", {})) a = description.get("assembler") if a: @@ -75,7 +76,7 @@ def load_pipeline(description: Dict, result: List[Pipeline]) -> Pipeline: return pipeline -def load(description: Dict) -> Manifest: +def load(description: Dict, index: Index) -> Manifest: """Load a manifest description""" pipeline = description.get("pipeline", {}) @@ -83,7 +84,7 @@ def load(description: Dict) -> Manifest: pipelines = [] - load_pipeline(pipeline, pipelines) + load_pipeline(pipeline, index, pipelines) for pipeline in pipelines: for stage in pipeline.stages: diff --git a/osbuild/main_cli.py b/osbuild/main_cli.py index 789a8ea6..c1b913de 100644 --- a/osbuild/main_cli.py +++ b/osbuild/main_cli.py @@ -90,7 +90,7 @@ def osbuild_cli(): show_validation(res, args.manifest_path) return 2 - manifest = fmt.load(desc) + manifest = fmt.load(desc, index) if args.checkpoint: missed = manifest.mark_checkpoints(args.checkpoint) diff --git a/osbuild/pipeline.py b/osbuild/pipeline.py index f2d50489..311e8992 100644 --- a/osbuild/pipeline.py +++ b/osbuild/pipeline.py @@ -33,14 +33,18 @@ class BuildResult: class Stage: - def __init__(self, name, source_options, build, base, options): - self.name = name + def __init__(self, info, source_options, build, base, options): + self.info = info self.sources = source_options self.build = build self.base = base self.options = options self.checkpoint = False + @property + def name(self): + return self.info.name + @property def id(self): m = hashlib.sha256() @@ -159,8 +163,8 @@ class Pipeline: def output_id(self): return self.assembler.id if self.assembler else None - def add_stage(self, name, options, sources_options=None): - stage = Stage(name, sources_options, self.build, self.tree_id, options or {}) + def add_stage(self, info, options, sources_options=None): + stage = Stage(info, sources_options, self.build, self.tree_id, options or {}) self.stages.append(stage) if self.assembler: self.assembler.base = stage.id diff --git a/test/mod/test_monitor.py b/test/mod/test_monitor.py index dd92c40e..7d7010b4 100644 --- a/test/mod/test_monitor.py +++ b/test/mod/test_monitor.py @@ -55,9 +55,12 @@ class TestMonitor(unittest.TestCase): @unittest.skipUnless(test.TestBase.can_bind_mount(), "root-only") def test_log_monitor_vfuncs(self): # Checks the basic functioning of the LogMonitor + index = osbuild.meta.Index(os.curdir) + runner = detect_host_runner() pipeline = osbuild.Pipeline(runner=runner) - pipeline.add_stage("org.osbuild.noop", { + info = index.get_module_info("Stage", "org.osbuild.noop") + pipeline.add_stage(info, { "isthisthereallife": False }) pipeline.set_assembler("org.osbuild.noop") @@ -87,11 +90,14 @@ class TestMonitor(unittest.TestCase): def test_monitor_integration(self): # Checks the monitoring API is called properly from the pipeline runner = detect_host_runner() + index = osbuild.meta.Index(os.curdir) + pipeline = osbuild.Pipeline(runner=runner) - pipeline.add_stage("org.osbuild.noop", { + noop_info = index.get_module_info("Stage", "org.osbuild.noop") + pipeline.add_stage(noop_info, { "isthisthereallife": False }) - pipeline.add_stage("org.osbuild.noop", { + pipeline.add_stage(noop_info, { "isthisjustfantasy": True }) pipeline.set_assembler("org.osbuild.noop") diff --git a/test/mod/test_osbuild.py b/test/mod/test_osbuild.py index 79950578..9124aaee 100644 --- a/test/mod/test_osbuild.py +++ b/test/mod/test_osbuild.py @@ -22,6 +22,8 @@ class TestDescriptions(unittest.TestCase): """Degenerate case. Make sure we always return the same canonical description when passing empty or null values.""" + index = osbuild.meta.Index(os.curdir) + cases = [ {}, {"assembler": None}, @@ -32,12 +34,14 @@ class TestDescriptions(unittest.TestCase): for pipeline in cases: manifest = {"pipeline": pipeline} with self.subTest(pipeline): - desc = fmt.describe(fmt.load(manifest)) + desc = fmt.describe(fmt.load(manifest, index)) self.assertEqual(desc["pipeline"], {}) @unittest.skipUnless(test.TestBase.can_bind_mount(), "root-only") def test_stage_run(self): - stage = osbuild.Stage("org.osbuild.noop", {}, None, None, {}) + index = osbuild.meta.Index(os.curdir) + info = index.get_module_info("Stage", "org.osbuild.noop") + stage = osbuild.Stage(info, {}, None, None, {}) with tempfile.TemporaryDirectory() as tmpdir: @@ -79,11 +83,14 @@ class TestDescriptions(unittest.TestCase): self.assertEqual(res.id, asm.id) def test_pipeline(self): + index = osbuild.meta.Index(os.curdir) + + test_info = index.get_module_info("Stage", "org.osbuild.test") build = osbuild.Pipeline("org.osbuild.test") - build.add_stage("org.osbuild.test", {"one": 1}) + build.add_stage(test_info, {"one": 1}) pipeline = osbuild.Pipeline("org.osbuild.test", build.tree_id) - pipeline.add_stage("org.osbuild.test", {"one": 2}) + pipeline.add_stage(test_info, {"one": 2}) pipeline.set_assembler("org.osbuild.test") manifest = osbuild.Manifest([build, pipeline], {}) diff --git a/test/test.py b/test/test.py index 9a2e1a8b..755d377b 100644 --- a/test/test.py +++ b/test/test.py @@ -11,6 +11,7 @@ import sys import tempfile import unittest +import osbuild.meta from osbuild.formats import v1 as fmt from osbuild.util import linux @@ -352,9 +353,11 @@ class OSBuild(contextlib.AbstractContextManager): are defined. """ + index = osbuild.meta.Index(os.curdir) + manifest_json = json.loads(manifest_data) - manifest = fmt.load(manifest_json) + manifest = fmt.load(manifest_json, index) tree_id, _ = fmt.get_ids(manifest) return tree_id