diff --git a/cmd/release-controller-api/http.go b/cmd/release-controller-api/http.go index 6ee33fd2b..a4ce29474 100644 --- a/cmd/release-controller-api/http.go +++ b/cmd/release-controller-api/http.go @@ -668,6 +668,7 @@ func (c *Controller) apiReleaseInfo(w http.ResponseWriter, req *http.Request) { var changeLog []byte var changeLogJson releasecontroller.ChangeLog + var nodeImageStreams []releasecontroller.APINodeImageStream if tagInfo.Info.Previous != nil && len(tagInfo.PreviousTagPullSpec) > 0 && len(tagInfo.TagPullSpec) > 0 { var wg sync.WaitGroup @@ -686,6 +687,48 @@ func (c *Controller) apiReleaseInfo(w http.ResponseWriter, req *http.Request) { c.changeLogWorker(result, tagInfo, format) }() } + + wg.Add(1) + go func() { + defer wg.Done() + streams, err := c.releaseInfo.ListMachineOSStreams(tagInfo.TagPullSpec) + if err != nil { + klog.V(4).Infof("Unable to list machine-OS streams for %s: %v", tagInfo.Tag, err) + } + + if len(streams) == 0 { + diff, err := c.releaseInfo.RpmDiff(tagInfo.PreviousTagPullSpec, tagInfo.TagPullSpec) + if err != nil { + klog.V(4).Infof("Unable to retrieve RPM diff for %s: %v", tagInfo.Tag, err) + return + } + nodeImageStreams = []releasecontroller.APINodeImageStream{{ + Name: "Red Hat Enterprise Linux CoreOS", + Tag: "rhel-coreos", + RpmDiff: &diff, + }} + return + } + + result := make([]releasecontroller.APINodeImageStream, 0, len(streams)) + for _, stream := range streams { + entry := releasecontroller.APINodeImageStream{ + Name: stream.DisplayName, + Tag: stream.Tag, + } + if _, errFrom := c.releaseInfo.ImageReferenceForComponent(tagInfo.PreviousTagPullSpec, stream.Tag); errFrom == nil { + diff, err := c.releaseInfo.RpmDiffForStream(tagInfo.PreviousTagPullSpec, tagInfo.TagPullSpec, stream.Tag) + if err != nil { + klog.V(4).Infof("Unable to retrieve RPM diff for stream %s in %s: %v", stream.Tag, tagInfo.Tag, err) + } else { + entry.RpmDiff = &diff + } + } + result = append(result, entry) + } + nodeImageStreams = result + }() + wg.Wait() if renderHTML.err == nil { @@ -706,13 +749,14 @@ func (c *Controller) apiReleaseInfo(w http.ResponseWriter, req *http.Request) { } summary := releasecontroller.APIReleaseInfo{ - Name: tagInfo.Tag, - Phase: tagInfo.Info.Tag.Annotations[releasecontroller.ReleaseAnnotationPhase], - Results: verificationJobs, - UpgradesTo: c.graph.UpgradesTo(tagInfo.Tag), - UpgradesFrom: c.graph.UpgradesFrom(tagInfo.Tag), - ChangeLog: changeLog, - ChangeLogJson: changeLogJson, + Name: tagInfo.Tag, + Phase: tagInfo.Info.Tag.Annotations[releasecontroller.ReleaseAnnotationPhase], + Results: verificationJobs, + UpgradesTo: c.graph.UpgradesTo(tagInfo.Tag), + UpgradesFrom: c.graph.UpgradesFrom(tagInfo.Tag), + ChangeLog: changeLog, + ChangeLogJson: changeLogJson, + NodeImageStreams: nodeImageStreams, } data, err := json.MarshalIndent(&summary, "", " ") diff --git a/pkg/release-controller/types.go b/pkg/release-controller/types.go index 771ff0828..db380ec54 100644 --- a/pkg/release-controller/types.go +++ b/pkg/release-controller/types.go @@ -54,6 +54,18 @@ type APIReleaseInfo struct { ChangeLog []byte `json:"changeLog,omitempty"` //ChangeLogJson is the json representation of the changes included in this release tag ChangeLogJson ChangeLog `json:"changeLogJson,omitempty"` + // NodeImageStreams contains per-stream RPM diffs for each machine-OS image (e.g. rhel-coreos, rhel-coreos-10). + NodeImageStreams []APINodeImageStream `json:"nodeImageStreams,omitempty"` +} + +// APINodeImageStream holds RPM diff information for a single machine-OS stream in a release payload. +type APINodeImageStream struct { + // Name is the human-readable display name (e.g. "Red Hat Enterprise Linux CoreOS"). + Name string `json:"name"` + // Tag is the payload component tag (e.g. "rhel-coreos", "rhel-coreos-10"). + Tag string `json:"tag"` + // RpmDiff is the RPM package diff between previous and current releases for this stream. + RpmDiff *RpmDiff `json:"rpmDiff,omitempty"` } // Release holds information about the release used during processing.