cloudapi: collect RPMs from v2 result stages

Fix for v1 results: collect RPMs for main stages, not build.
Support for v2 results: filter out build stages from stage results,
which include stages from all pipelines (flattened).
This commit is contained in:
Achilleas Koutsou 2021-06-24 14:01:38 +02:00 committed by Tom Gundersen
parent b46addea5c
commit 51503cc000

View file

@ -544,7 +544,6 @@ func (server *Server) ComposeMetadata(w http.ResponseWriter, r *http.Request, id
return
}
var rpms []rpmmd.RPM
if status.Finished.IsZero() {
// job still running: empty response
if err := json.NewEncoder(w).Encode(new(ComposeMetadata)); err != nil {
@ -552,7 +551,46 @@ func (server *Server) ComposeMetadata(w http.ResponseWriter, r *http.Request, id
}
return
}
rpms = rpmmd.OSBuildStagesToRPMs(result.OSBuildOutput.Build.Stages)
manifestVer, err := job.Manifest.Version()
if err != nil {
panic("Failed to parse manifest version: " + err.Error())
}
var rpms []rpmmd.RPM
var ostreeCommitResult *osbuild1.StageResult
var coreStages []osbuild1.StageResult
switch manifestVer {
case "1":
coreStages = result.OSBuildOutput.Stages
if assemblerResult := result.OSBuildOutput.Assembler; assemblerResult.Name == "org.osbuild.ostree.commit" {
ostreeCommitResult = result.OSBuildOutput.Assembler
}
case "2":
// v2 manifest results store all stage output in the main stages
// here we filter out the build stages to collect only the RPMs for the
// core stages
// the filtering relies on two assumptions:
// 1. the build pipeline is named "build"
// 2. the stage results from v2 manifests when converted to v1 are
// named by prefixing the pipeline name
for _, stage := range result.OSBuildOutput.Stages {
if !strings.HasPrefix(stage.Name, "build") {
coreStages = append(coreStages, stage)
}
}
// find the ostree.commit stage
for idx, stage := range result.OSBuildOutput.Stages {
if strings.HasSuffix(stage.Name, "org.osbuild.ostree.commit") {
ostreeCommitResult = &result.OSBuildOutput.Stages[idx]
break
}
}
default:
panic("Unknown manifest version: " + manifestVer)
}
rpms = rpmmd.OSBuildStagesToRPMs(coreStages)
packages := make([]PackageMetadata, len(rpms))
for idx, rpm := range rpms {
@ -568,36 +606,13 @@ func (server *Server) ComposeMetadata(w http.ResponseWriter, r *http.Request, id
}
}
manifestVer, err := job.Manifest.Version()
if err != nil {
panic("Failed to parse manifest version: " + err.Error())
}
ostreeCommitResult := new(osbuild1.StageResult)
switch manifestVer {
case "1":
if assemblerResult := result.OSBuildOutput.Assembler; assemblerResult.Name == "org.osbuild.ostree.commit" {
ostreeCommitResult = result.OSBuildOutput.Assembler
}
case "2":
// find the ostree.commit stage
for idx, stage := range result.OSBuildOutput.Stages {
if stage.Name == "org.osbuild.ostree.commit" {
ostreeCommitResult = &result.OSBuildOutput.Stages[idx]
break
}
}
default:
panic("Unknown manifest version: " + manifestVer)
}
resp := new(ComposeMetadata)
resp.Packages = &packages
if ostreeCommitResult != nil {
commitMetadata, ok := ostreeCommitResult.Metadata.(*osbuild1.OSTreeCommitStageMetadata)
if !ok {
panic("Failed to parse ostree commit stage metadata")
panic("Failed to convert ostree commit stage metadata")
}
resp.OstreeCommit = &commitMetadata.Compose.OSTreeCommit
}