osbuild2: add support for reading stage metadata

Metadata from stages in the output from osbuild in the v2 schema are
stored at the top level of the result structure.

Adding the same Metadata types from v1:
- org.osbuild.rpm stage
- org.osbuild.ostree.commit stage
- Raw metadata (for every other stage type)
This commit is contained in:
Achilleas Koutsou 2021-06-23 13:22:37 +02:00 committed by Tom Gundersen
parent 2212fedae3
commit 1dcaa26966
3 changed files with 85 additions and 5 deletions

View file

@ -39,3 +39,23 @@ func NewOSTreeCommitStage(options *OSTreeCommitStageOptions, inputs *OSTreeCommi
Inputs: inputs,
}
}
type OSTreeCommitStageMetadata struct {
Compose OSTreeCommitStageMetadataCompose `json:"compose"`
}
type OSTreeCommitStageMetadataCompose struct {
Ref string `json:"ref"`
OSTreeNMetadataTotal int `json:"ostree-n-metadata-total"`
OSTreeNMetadataWritten int `json:"ostree-n-metadata-written"`
OSTreeNContentTotal int `json:"ostree-n-content-total"`
OSTreeNContentWritten int `json:"ostree-n-content-written"`
OSTreeNCacheHits int `json:"ostree-n-cache-hits"`
OSTreeContentBytesWritten int `json:"ostree-content-bytes-written"`
OSTreeCommit string `json:"ostree-commit"`
OSTreeContentChecksum string `json:"ostree-content-checksum"`
OSTreeTimestamp string `json:"ostree-timestamp"`
RPMOSTreeInputHash string `json:"rpm-ostree-inputhash"`
}
func (OSTreeCommitStageMetadata) isStageMetadata() {}

View file

@ -14,6 +14,18 @@ type StageResult struct {
Error string `json:"string,omitempty"`
}
type PipelineMetadata map[string]StageMetadata
type StageMetadata interface {
isStageMetadata()
}
// RawStageMetadata is used to store the metadata from a stage that doesn't
// define its own structure
type RawStageMetadata json.RawMessage
func (RawStageMetadata) isStageMetadata() {}
// UnmarshalJSON decodes json-encoded StageResult.
//
// This method is here only as a workaround for the default value of the
@ -40,9 +52,38 @@ func (sr *StageResult) UnmarshalJSON(data []byte) error {
return nil
}
type Result struct {
Type string `json:"type"`
Success bool `json:"success"`
Error json.RawMessage `json:"error"`
Log map[string]PipelineResult `json:"log"`
func (md *PipelineMetadata) UnmarshalJSON(data []byte) error {
var rawPipelineMetadata map[string]json.RawMessage
if err := json.Unmarshal(data, &rawPipelineMetadata); err != nil {
return err
}
pmd := make(map[string]StageMetadata)
var metadata StageMetadata
for name, rawStageData := range rawPipelineMetadata {
switch name {
case "org.osbuild.rpm":
metadata = new(RPMStageMetadata)
if err := json.Unmarshal(rawStageData, metadata); err != nil {
return err
}
case "org.osbuild.ostree.commit":
metadata = new(OSTreeCommitStageMetadata)
if err := json.Unmarshal(rawStageData, metadata); err != nil {
return err
}
default:
metadata = RawStageMetadata(rawStageData)
}
pmd[name] = metadata
}
*md = pmd
return nil
}
type Result struct {
Type string `json:"type"`
Success bool `json:"success"`
Error json.RawMessage `json:"error"`
Log map[string]PipelineResult `json:"log"`
Metadata map[string]PipelineMetadata `json:"metadata"`
}

View file

@ -51,3 +51,22 @@ func NewRPMStage(options *RPMStageOptions, inputs *RPMStageInputs) *Stage {
Options: options,
}
}
// RPMStageMetadata gives the set of packages installed by the RPM stage
type RPMStageMetadata struct {
Packages []RPMPackageMetadata `json:"packages"`
}
// RPMPackageMetadata contains the metadata extracted from one RPM header
type RPMPackageMetadata struct {
Name string `json:"name"`
Version string `json:"version"`
Release string `json:"release"`
Epoch *string `json:"epoch"`
Arch string `json:"arch"`
SigMD5 string `json:"sigmd5"`
SigPGP string `json:"sigpgp"`
SigGPG string `json:"siggpg"`
}
func (RPMStageMetadata) isStageMetadata() {}