debian-forge-composer/internal/osbuild2/result.go
Achilleas Koutsou 1dcaa26966 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)
2021-06-29 09:33:05 +01:00

89 lines
2.4 KiB
Go

package osbuild2
import (
"encoding/json"
)
type PipelineResult []StageResult
type StageResult struct {
ID string `json:"id"`
Type string `json:"type"`
Output string `json:"output"`
Success bool `json:"success,omitempty"`
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
// success field, see the comment inside the method.
func (sr *StageResult) UnmarshalJSON(data []byte) error {
// Create a StageResult-like object with the Success value set to true
// before json.Unmarshal is called. If the success field isn't in the
// input JSON, the json decoder will not touch it and thus it will still
// be true.
//
// The type alias is needed to prevent recursive calls of this method.
type stageResultAlias StageResult
stageResultDefault := stageResultAlias{
Success: true,
}
err := json.Unmarshal(data, &stageResultDefault)
if err != nil {
return err
}
*sr = StageResult(stageResultDefault)
return nil
}
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"`
}