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

View file

@ -4,11 +4,74 @@ package osbuild2
import (
"encoding/json"
"github.com/osbuild/osbuild-composer/internal/osbuild1"
"strings"
)
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.Type = "result"
@ -48,7 +111,7 @@ func (res *Result) fromV1(resv1 osbuild1.Result) {
res.Metadata = metadata
}
func convertStageResults(v1Stages []osbuild1.StageResult) (PipelineResult, PipelineMetadata) {
func convertStageResults(v1Stages []v1StageResult) (PipelineResult, PipelineMetadata) {
result := make([]StageResult, len(v1Stages))
metadata := make(map[string]StageMetadata)
for idx, srv1 := range v1Stages {
@ -63,7 +126,7 @@ func convertStageResults(v1Stages []osbuild1.StageResult) (PipelineResult, Pipel
return result, metadata
}
func convertStageResult(sr1 *osbuild1.StageResult) (*StageResult, StageMetadata) {
func convertStageResult(sr1 *v1StageResult) (*StageResult, StageMetadata) {
sr := &StageResult{
ID: "",
Type: sr1.Name,
@ -72,24 +135,10 @@ func convertStageResult(sr1 *osbuild1.StageResult) (*StageResult, StageMetadata)
Error: "",
}
var md StageMetadata = nil
if sr1.Metadata != nil {
switch md1 := sr1.Metadata.(type) {
case *osbuild1.RPMStageMetadata:
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
// the two metadata types we care about (RPM and ostree-commit) share the
// same structure across v1 and v2 result types, so no conversion is
// necessary
return sr, sr1.Metadata
}
// isV1Result returns true if data contains a json-encoded osbuild result