osbuild1: convert stage metadata from v2

While unmarshalling osbuild output and converting from v1 to v2, convert
the metadata as well.

Added checks to successful parsing and conversion test.
This commit is contained in:
Achilleas Koutsou 2021-06-23 16:46:22 +02:00 committed by Tom Gundersen
parent 1dcaa26966
commit b46addea5c
3 changed files with 89 additions and 19 deletions

View file

@ -23,19 +23,21 @@ func NewOSTreeCommitAssembler(options *OSTreeCommitAssemblerOptions) *Assembler
}
type OSTreeCommitStageMetadata struct {
Compose 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"`
} `json:"compose"`
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

@ -5,6 +5,7 @@ import (
"fmt"
"io"
"sort"
"strings"
"github.com/osbuild/osbuild-composer/internal/osbuild2"
)
@ -56,14 +57,14 @@ func (result *StageResult) UnmarshalJSON(data []byte) error {
return err
}
var metadata StageMetadata
switch rawStageResult.Name {
case "org.osbuild.rpm":
switch {
case strings.HasSuffix(rawStageResult.Name, "org.osbuild.rpm"):
metadata = new(RPMStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil {
return err
}
case "org.osbuild.ostree.commit":
case strings.HasSuffix(rawStageResult.Name, "org.osbuild.ostree.commit"):
metadata = new(OSTreeCommitStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil {
@ -230,17 +231,70 @@ func (cr *Result) fromV2(crv2 osbuild2.Result) {
return pipelineResults[i].pipelineName < pipelineResults[j].pipelineName
})
v2metadata := crv2.Metadata
// convert all stages logs from all pipelines into v1 StageResult objects
for _, pr := range pipelineResults {
pipelineMetadata := v2metadata[pr.pipelineName]
for idx, stage := range pr.stageResults {
stageMetadataV2 := pipelineMetadata[stage.Type]
stageMetadata, _ := convertStageMetadata(stageMetadataV2, stage.Type)
stageResult := StageResult{
// Create uniquely identifiable name for the stage:
// <pipeline name>:<stage index>-<stage type>
Name: fmt.Sprintf("%s:%d-%s", pr.pipelineName, idx, stage.Type),
Success: stage.Success,
Output: stage.Output,
Name: fmt.Sprintf("%s:%d-%s", pr.pipelineName, idx, stage.Type),
Success: stage.Success,
Output: stage.Output,
Metadata: stageMetadata,
}
cr.Stages = append(cr.Stages, stageResult)
}
}
}
func convertStageMetadata(v2md osbuild2.StageMetadata, stageType string) (StageMetadata, error) {
if v2md == nil {
return nil, nil
}
switch metadata := v2md.(type) {
case *osbuild2.RPMStageMetadata:
packages := make([]RPMPackageMetadata, len(metadata.Packages))
for idx, pkg := range metadata.Packages {
packages[idx] = RPMPackageMetadata{
Name: pkg.Name,
Version: pkg.Version,
Release: pkg.Release,
Epoch: pkg.Epoch,
Arch: pkg.Arch,
SigMD5: pkg.SigMD5,
SigPGP: pkg.SigPGP,
SigGPG: pkg.SigGPG,
}
}
return RPMStageMetadata{Packages: packages}, nil
case *osbuild2.OSTreeCommitStageMetadata:
v2compose := metadata.Compose
commitMetadata := OSTreeCommitStageMetadata{
Compose: OSTreeCommitStageMetadataCompose{
Ref: v2compose.Ref,
OSTreeNMetadataTotal: v2compose.OSTreeNMetadataTotal,
OSTreeNMetadataWritten: v2compose.OSTreeNMetadataWritten,
OSTreeNContentTotal: v2compose.OSTreeNContentTotal,
OSTreeNContentWritten: v2compose.OSTreeNContentWritten,
OSTreeNCacheHits: v2compose.OSTreeNCacheHits,
OSTreeContentBytesWritten: v2compose.OSTreeContentBytesWritten,
OSTreeCommit: v2compose.OSTreeCommit,
OSTreeContentChecksum: v2compose.OSTreeContentChecksum,
OSTreeTimestamp: v2compose.OSTreeTimestamp,
RPMOSTreeInputHash: v2compose.RPMOSTreeInputHash,
},
}
return commitMetadata, nil
}
// any other type, return raw
raw, err := json.Marshal(v2md)
if err != nil {
return nil, err
}
return RawStageMetadata(raw), nil
}

View file

@ -3,6 +3,7 @@ package osbuild1
import (
"bytes"
"encoding/json"
"strings"
"testing"
"github.com/stretchr/testify/assert"
@ -119,6 +120,19 @@ func TestUnmarshalV2Success(t *testing.T) {
assert.Len(t, result.Stages, 16)
assert.True(t, result.Stages[15].Success)
assert.NotEmpty(t, result.Stages[0].Name)
// check metadata
for _, stage := range result.Stages {
if strings.HasSuffix(stage.Name, "org.osbuild.rpm") {
rpmMd, convOk := stage.Metadata.(RPMStageMetadata)
assert.True(t, convOk)
assert.Greater(t, len(rpmMd.Packages), 0)
} else if strings.HasSuffix(stage.Name, "org.osbuild.ostree.commit") {
commitMd, convOk := stage.Metadata.(OSTreeCommitStageMetadata)
assert.True(t, convOk)
assert.NotEmpty(t, commitMd.Compose.Ref)
}
}
}
func TestUnmarshalV2Failure(t *testing.T) {