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:
parent
1dcaa26966
commit
b46addea5c
3 changed files with 89 additions and 19 deletions
|
|
@ -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() {}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue