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("pipeline", runner=runner) noop_info = index.get_module_info("Stage", "org.osbuild.noop") pipeline.add_stage(noop_info, { "isthisthereallife": False }) pipeline.add_stage(noop_info, { "isthisjustfantasy": True }) with tempfile.TemporaryDirectory() as tmpdir: storedir = os.path.join(tmpdir, "store") tape = TapeMonitor() with ObjectStore(storedir) as store: res = pipeline.run(store, tape, libdir=os.path.abspath(os.curdir)) assert res self.assertEqual(tape.counter["begin"], 1) self.assertEqual(tape.counter["finish"], 1) self.assertEqual(tape.counter["stages"], 2) self.assertEqual(tape.counter["stages"], 2) self.assertEqual(tape.counter["result"], 2) self.assertIn(pipeline.stages[0].id, tape.stages) self.assertIn("isthisthereallife", tape.output) self.assertIn("isthisjustfantasy", tape.output)
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("pipeline", runner=runner) info = index.get_module_info("Stage", "org.osbuild.noop") pipeline.add_stage(info, { "isthisthereallife": False }) with tempfile.TemporaryDirectory() as tmpdir: storedir = os.path.join(tmpdir, "store") logfile = os.path.join(tmpdir, "log.txt") with open(logfile, "w") as log, ObjectStore(storedir) as store: monitor = LogMonitor(log.fileno()) res = pipeline.run(store, monitor, libdir=os.path.abspath(os.curdir)) with open(logfile) as f: log = f.read() assert res self.assertIn(pipeline.stages[0].id, log) self.assertIn("isthisthereallife", log)
def build_manifest(manifest: osbuild.pipeline.Manifest, tmpdir: str): """Build a manifest and return the result""" storedir = pathlib.Path(tmpdir, "store") monitor = NullMonitor(sys.stderr.fileno()) libdir = os.path.abspath(os.curdir) store = ObjectStore(storedir) res = manifest.build(store, manifest.pipelines, monitor, libdir) return res
def test_stage_run(self): 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: data = pathlib.Path(tmpdir, "data") storedir = pathlib.Path(tmpdir, "store") root = pathlib.Path("/") runner = detect_host_runner() monitor = NullMonitor(sys.stderr.fileno()) libdir = os.path.abspath(os.curdir) store = ObjectStore(storedir) data.mkdir() res = stage.run(data, runner, root, store, monitor, libdir) self.assertEqual(res.success, True) self.assertEqual(res.id, stage.id)
def osbuild_cli(): args = parse_arguments(sys.argv) desc = parse_manifest(args.manifest_path) index = osbuild.meta.Index(args.libdir) # detect the format from the manifest description info = index.detect_format_info(desc) if not info: print("Unsupported manifest format") return 2 fmt = info.module # first thing is validation of the manifest res = fmt.validate(desc, index) if not res: if args.json or args.inspect: json.dump(res.as_dict(), sys.stdout) sys.stdout.write("\n") else: show_validation(res, args.manifest_path) return 2 manifest = fmt.load(desc, index) if args.checkpoint: missed = manifest.mark_checkpoints(args.checkpoint) if missed: for checkpoint in missed: print(f"Checkpoint {BOLD}{checkpoint}{RESET} not found!") print(f"{RESET}{BOLD}{RED}Failed{RESET}") return 1 if args.inspect: result = fmt.describe(manifest, with_id=True) json.dump(result, sys.stdout) sys.stdout.write("\n") return 0 if not args.output_directory and not args.checkpoint: print( "No output directory or checkpoints specified, exited without building." ) return 0 monitor_name = "NullMonitor" if args.json else "LogMonitor" monitor = osbuild.monitor.make(monitor_name, sys.stdout.fileno()) try: output_directory = args.output_directory with ObjectStore(args.store) as object_store: manifest.download(object_store, monitor, args.libdir) r = manifest.build(object_store, monitor, args.libdir, output_directory=output_directory) if r["success"] and args.export: if not output_directory: raise ValueError("Need --output-directory for --export") for pid in args.export: export(pid, output_directory, object_store, manifest) except KeyboardInterrupt: print() print(f"{RESET}{BOLD}{RED}Aborted{RESET}") return 130 if args.json: r = fmt.output(manifest, r) json.dump(r, sys.stdout) sys.stdout.write("\n") else: if r["success"]: for name, pl in manifest.pipelines.items(): print(f"{name + ':': <10}\t{pl.id}") else: print() print(f"{RESET}{BOLD}{RED}Failed{RESET}") return 0 if r["success"] else 1