From d14e5f3ee84f487a4346dba6f3be52a5005fe75d Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Fri, 22 Apr 2022 17:40:40 +0200 Subject: [PATCH] meta: ability to specify capabilities for stages Add new stage metadata `CAPABILITIES` where stages can request additional capabilities that are not in the default set. Currently this is not used by any stage since the default set contains the sum of all needed capabilities. --- osbuild/meta.py | 16 ++++++++++++++-- osbuild/pipeline.py | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/osbuild/meta.py b/osbuild/meta.py index 3c083a6a..039d2858 100644 --- a/osbuild/meta.py +++ b/osbuild/meta.py @@ -296,6 +296,7 @@ class ModuleInfo: self.info = info["info"] self.desc = info["desc"] self.opts = info["schema"] + self.caps = info["caps"] def _load_opts(self, version, fallback=None): raw = self.opts[version] @@ -388,9 +389,16 @@ class ModuleInfo: detail = fullname, lineno, e.colno, line raise SyntaxError(msg, detail) from None + @classmethod + def _parse_caps(cls, _klass, _name, node): + if not node: + return set() + + return {e.s for e in node.value.elts} + @classmethod def load(cls, root, klass, name) -> Optional["ModuleInfo"]: - names = ["SCHEMA", "SCHEMA_2"] + names = ["SCHEMA", "SCHEMA_2", "CAPABILITIES"] def filter_type(lst, target): return [x for x in lst if isinstance(x, target)] @@ -425,13 +433,17 @@ class ModuleInfo: def parse_schema(node): return cls._parse_schema(klass, name, node) + def parse_caps(node): + return cls._parse_caps(klass, name, node) + info = { 'schema': { "1": parse_schema(values.get("SCHEMA")), "2": parse_schema(values.get("SCHEMA_2")), }, 'desc': doclist[0], - 'info': "\n".join(doclist[1:]) + 'info': "\n".join(doclist[1:]), + 'caps': parse_caps(values.get("CAPABILITIES")) } return cls(klass, name, path, info) diff --git a/osbuild/pipeline.py b/osbuild/pipeline.py index 80f08ced..36f88017 100644 --- a/osbuild/pipeline.py +++ b/osbuild/pipeline.py @@ -157,7 +157,7 @@ class Stage: build_root.mount_boot = bool(self.build) # drop capabilities other than `DEFAULT_CAPABILITIES` - build_root.caps = DEFAULT_CAPABILITIES + build_root.caps = DEFAULT_CAPABILITIES | self.info.caps tmpdir = store.tempdir(prefix="buildroot-tmp-") tmpdir = cm.enter_context(tmpdir)