diff --git a/osbuild/formats/v2.py b/osbuild/formats/v2.py index 775be12c..0fd5bf73 100644 --- a/osbuild/formats/v2.py +++ b/osbuild/formats/v2.py @@ -166,6 +166,9 @@ def describe(manifest: Manifest, *, with_id=False) -> Dict: "pipelines": pipelines } + if manifest.metadata: + description["metadata"] = manifest.metadata + if sources: description["sources"] = sources @@ -355,10 +358,15 @@ def load(description: Dict, index: Index) -> Manifest: sources = description.get("sources", {}) pipelines = description.get("pipelines", []) + metadata = description.get("metadata", {}) manifest = Manifest() source_refs = set() + # metadata + for key, value in metadata.items(): + manifest.add_metadata(key, value) + # load the sources for name, desc in sources.items(): info = index.get_module_info("Source", name) diff --git a/osbuild/pipeline.py b/osbuild/pipeline.py index 84013740..c955033b 100644 --- a/osbuild/pipeline.py +++ b/osbuild/pipeline.py @@ -4,7 +4,7 @@ import hashlib import json import os from fnmatch import fnmatch -from typing import Dict, Generator, Iterable, Iterator, List, Optional +from typing import Any, Dict, Generator, Iterable, Iterator, List, Optional from . import buildroot, host, objectstore, remoteloop from .api import API @@ -388,9 +388,13 @@ class Manifest: """Representation of a pipeline and its sources""" def __init__(self): + self.metadata = {} self.pipelines = collections.OrderedDict() self.sources = [] + def add_metadata(self, name: str, data: Dict[str, Any]) -> None: + self.metadata[name] = data + def add_pipeline( self, name: str, diff --git a/test/mod/test_fmt_v2.py b/test/mod/test_fmt_v2.py index 65f7d3ba..6b570835 100644 --- a/test/mod/test_fmt_v2.py +++ b/test/mod/test_fmt_v2.py @@ -12,6 +12,14 @@ import osbuild.meta BASIC_PIPELINE = { "version": "2", + "metadata": { + "generators": [ + { + "name": "handcrafted", + "version": "NaN", + }, + ], + }, "sources": { "org.osbuild.curl": { "items": {