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 { type OSTreeCommitStageMetadata struct {
Compose struct { Compose OSTreeCommitStageMetadataCompose `json:"compose"`
Ref string `json:"ref"` }
OSTreeNMetadataTotal int `json:"ostree-n-metadata-total"`
OSTreeNMetadataWritten int `json:"ostree-n-metadata-written"` type OSTreeCommitStageMetadataCompose struct {
OSTreeNContentTotal int `json:"ostree-n-content-total"` Ref string `json:"ref"`
OSTreeNContentWritten int `json:"ostree-n-content-written"` OSTreeNMetadataTotal int `json:"ostree-n-metadata-total"`
OSTreeNCacheHits int `json:"ostree-n-cache-hits"` OSTreeNMetadataWritten int `json:"ostree-n-metadata-written"`
OSTreeContentBytesWritten int `json:"ostree-content-bytes-written"` OSTreeNContentTotal int `json:"ostree-n-content-total"`
OSTreeCommit string `json:"ostree-commit"` OSTreeNContentWritten int `json:"ostree-n-content-written"`
OSTreeContentChecksum string `json:"ostree-content-checksum"` OSTreeNCacheHits int `json:"ostree-n-cache-hits"`
OSTreeTimestamp string `json:"ostree-timestamp"` OSTreeContentBytesWritten int `json:"ostree-content-bytes-written"`
RPMOSTreeInputHash string `json:"rpm-ostree-inputhash"` OSTreeCommit string `json:"ostree-commit"`
} `json:"compose"` OSTreeContentChecksum string `json:"ostree-content-checksum"`
OSTreeTimestamp string `json:"ostree-timestamp"`
RPMOSTreeInputHash string `json:"rpm-ostree-inputhash"`
} }
func (OSTreeCommitStageMetadata) isStageMetadata() {} func (OSTreeCommitStageMetadata) isStageMetadata() {}

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"io" "io"
"sort" "sort"
"strings"
"github.com/osbuild/osbuild-composer/internal/osbuild2" "github.com/osbuild/osbuild-composer/internal/osbuild2"
) )
@ -56,14 +57,14 @@ func (result *StageResult) UnmarshalJSON(data []byte) error {
return err return err
} }
var metadata StageMetadata var metadata StageMetadata
switch rawStageResult.Name { switch {
case "org.osbuild.rpm": case strings.HasSuffix(rawStageResult.Name, "org.osbuild.rpm"):
metadata = new(RPMStageMetadata) metadata = new(RPMStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata) err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil { if err != nil {
return err return err
} }
case "org.osbuild.ostree.commit": case strings.HasSuffix(rawStageResult.Name, "org.osbuild.ostree.commit"):
metadata = new(OSTreeCommitStageMetadata) metadata = new(OSTreeCommitStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata) err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil { if err != nil {
@ -230,17 +231,70 @@ func (cr *Result) fromV2(crv2 osbuild2.Result) {
return pipelineResults[i].pipelineName < pipelineResults[j].pipelineName return pipelineResults[i].pipelineName < pipelineResults[j].pipelineName
}) })
v2metadata := crv2.Metadata
// convert all stages logs from all pipelines into v1 StageResult objects // convert all stages logs from all pipelines into v1 StageResult objects
for _, pr := range pipelineResults { for _, pr := range pipelineResults {
pipelineMetadata := v2metadata[pr.pipelineName]
for idx, stage := range pr.stageResults { for idx, stage := range pr.stageResults {
stageMetadataV2 := pipelineMetadata[stage.Type]
stageMetadata, _ := convertStageMetadata(stageMetadataV2, stage.Type)
stageResult := StageResult{ stageResult := StageResult{
// Create uniquely identifiable name for the stage: // Create uniquely identifiable name for the stage:
// <pipeline name>:<stage index>-<stage type> // <pipeline name>:<stage index>-<stage type>
Name: fmt.Sprintf("%s:%d-%s", pr.pipelineName, idx, stage.Type), Name: fmt.Sprintf("%s:%d-%s", pr.pipelineName, idx, stage.Type),
Success: stage.Success, Success: stage.Success,
Output: stage.Output, Output: stage.Output,
Metadata: stageMetadata,
} }
cr.Stages = append(cr.Stages, stageResult) 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 ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -119,6 +120,19 @@ func TestUnmarshalV2Success(t *testing.T) {
assert.Len(t, result.Stages, 16) assert.Len(t, result.Stages, 16)
assert.True(t, result.Stages[15].Success) assert.True(t, result.Stages[15].Success)
assert.NotEmpty(t, result.Stages[0].Name) 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) { func TestUnmarshalV2Failure(t *testing.T) {