osbuild2: copy Result types from osbuild1

Types, parsing functions and helpers copied from osbuild1 to
osbuild2/v1result.go.
The metadata handling is simplified: osbuild1 stage metadata for the RPM
and ostree-commit stages is identical to the osbuild2 counterparts.
This commit is contained in:
Achilleas Koutsou 2022-07-12 11:55:32 +02:00
parent c1956ba6e1
commit d68a95c533
2 changed files with 75 additions and 28 deletions

View file

@ -5,8 +5,6 @@ import (
"fmt" "fmt"
"io" "io"
"sort" "sort"
"github.com/osbuild/osbuild-composer/internal/osbuild1"
) )
type Result struct { type Result struct {
@ -95,10 +93,10 @@ func (md *PipelineMetadata) UnmarshalJSON(data []byte) error {
func (res *Result) UnmarshalJSON(data []byte) error { func (res *Result) UnmarshalJSON(data []byte) error {
// detect if the input is v1 result // detect if the input is v1 result
if v1Result, err := isV1Result(data); err != nil { if isV1, err := isV1Result(data); err != nil {
return err return err
} else if v1Result { } else if isV1 {
var resv1 osbuild1.Result var resv1 v1Result
if err := json.Unmarshal(data, &resv1); err != nil { if err := json.Unmarshal(data, &resv1); err != nil {
return err return err
} }

View file

@ -4,11 +4,74 @@ package osbuild2
import ( import (
"encoding/json" "encoding/json"
"strings"
"github.com/osbuild/osbuild-composer/internal/osbuild1"
) )
func (res *Result) fromV1(resv1 osbuild1.Result) { type v1StageResult struct {
Name string `json:"name"`
Options json.RawMessage `json:"options"`
Success bool `json:"success"`
Output string `json:"output"`
Metadata StageMetadata `json:"metadata"`
}
type v1RawStageResult struct {
Name string `json:"name"`
Options json.RawMessage `json:"options"`
Success bool `json:"success"`
Output string `json:"output"`
Metadata json.RawMessage `json:"metadata"`
}
type v1BuildResult struct {
Stages []v1StageResult `json:"stages"`
TreeID string `json:"tree_id"`
Success bool `json:"success"`
}
type v1Result struct {
TreeID string `json:"tree_id"`
OutputID string `json:"output_id"`
Build *v1BuildResult `json:"build"`
Stages []v1StageResult `json:"stages"`
Assembler *v1StageResult `json:"assembler"`
Success bool `json:"success"`
}
func (result *v1StageResult) UnmarshalJSON(data []byte) error {
var rawStageResult v1RawStageResult
err := json.Unmarshal(data, &rawStageResult)
if err != nil {
return err
}
var metadata StageMetadata
switch {
case strings.HasSuffix(rawStageResult.Name, "org.osbuild.rpm"):
metadata = new(RPMStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil {
return err
}
case strings.HasSuffix(rawStageResult.Name, "org.osbuild.ostree.commit"):
metadata = new(OSTreeCommitStageMetadata)
err = json.Unmarshal(rawStageResult.Metadata, metadata)
if err != nil {
return err
}
default:
metadata = RawStageMetadata(rawStageResult.Metadata)
}
result.Name = rawStageResult.Name
result.Options = rawStageResult.Options
result.Success = rawStageResult.Success
result.Output = rawStageResult.Output
result.Metadata = metadata
return nil
}
func (res *Result) fromV1(resv1 v1Result) {
res.Success = resv1.Success res.Success = resv1.Success
res.Type = "result" res.Type = "result"
@ -48,7 +111,7 @@ func (res *Result) fromV1(resv1 osbuild1.Result) {
res.Metadata = metadata res.Metadata = metadata
} }
func convertStageResults(v1Stages []osbuild1.StageResult) (PipelineResult, PipelineMetadata) { func convertStageResults(v1Stages []v1StageResult) (PipelineResult, PipelineMetadata) {
result := make([]StageResult, len(v1Stages)) result := make([]StageResult, len(v1Stages))
metadata := make(map[string]StageMetadata) metadata := make(map[string]StageMetadata)
for idx, srv1 := range v1Stages { for idx, srv1 := range v1Stages {
@ -63,7 +126,7 @@ func convertStageResults(v1Stages []osbuild1.StageResult) (PipelineResult, Pipel
return result, metadata return result, metadata
} }
func convertStageResult(sr1 *osbuild1.StageResult) (*StageResult, StageMetadata) { func convertStageResult(sr1 *v1StageResult) (*StageResult, StageMetadata) {
sr := &StageResult{ sr := &StageResult{
ID: "", ID: "",
Type: sr1.Name, Type: sr1.Name,
@ -72,24 +135,10 @@ func convertStageResult(sr1 *osbuild1.StageResult) (*StageResult, StageMetadata)
Error: "", Error: "",
} }
var md StageMetadata = nil // the two metadata types we care about (RPM and ostree-commit) share the
if sr1.Metadata != nil { // same structure across v1 and v2 result types, so no conversion is
switch md1 := sr1.Metadata.(type) { // necessary
case *osbuild1.RPMStageMetadata: return sr, sr1.Metadata
rpmmd := new(RPMStageMetadata)
rpmmd.Packages = make([]RPMPackageMetadata, len(md1.Packages))
for idx, pkg := range md1.Packages {
rpmmd.Packages[idx] = RPMPackageMetadata(pkg)
}
md = rpmmd
case *osbuild1.OSTreeCommitStageMetadata:
commitmd := new(OSTreeCommitStageMetadata)
commitmd.Compose = OSTreeCommitStageMetadataCompose(md1.Compose)
md = commitmd
}
}
return sr, md
} }
// isV1Result returns true if data contains a json-encoded osbuild result // isV1Result returns true if data contains a json-encoded osbuild result