From b46addea5c3bc884c03042e248ff326fd4e920e5 Mon Sep 17 00:00:00 2001 From: Achilleas Koutsou Date: Wed, 23 Jun 2021 16:46:22 +0200 Subject: [PATCH] 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. --- internal/osbuild1/ostree_commit_assembler.go | 28 +++++---- internal/osbuild1/result.go | 66 ++++++++++++++++++-- internal/osbuild1/result_test.go | 14 +++++ 3 files changed, 89 insertions(+), 19 deletions(-) diff --git a/internal/osbuild1/ostree_commit_assembler.go b/internal/osbuild1/ostree_commit_assembler.go index f7b0e4b71..c54ab4729 100644 --- a/internal/osbuild1/ostree_commit_assembler.go +++ b/internal/osbuild1/ostree_commit_assembler.go @@ -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() {} diff --git a/internal/osbuild1/result.go b/internal/osbuild1/result.go index 89c6a30d2..1f17ed51e 100644 --- a/internal/osbuild1/result.go +++ b/internal/osbuild1/result.go @@ -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: // :- - 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 +} diff --git a/internal/osbuild1/result_test.go b/internal/osbuild1/result_test.go index cdb2cc996..b8357d04f 100644 --- a/internal/osbuild1/result_test.go +++ b/internal/osbuild1/result_test.go @@ -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) {