Skip to content

Commit edce8fb

Browse files
stbenjamclaude
andcommitted
Add feature gate changes to changelog JSON output
The changelog JSON output (`oc adm release info --changelog --output=json`) was missing feature gate change data that was only available in the markdown output. This adds a `featureGates` field to the ChangeLog JSON struct, populated using the existing `calculateFeatureSetDiff()` logic. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 12f8fce commit edce8fb

1 file changed

Lines changed: 39 additions & 5 deletions

File tree

pkg/cli/admin/release/info.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,6 +1777,32 @@ func describeChangelog(out, errOut io.Writer, releaseInfo *ReleaseInfo, diff *Re
17771777
})
17781778
}
17791779
}
1780+
if featureSetDiff, err := calculateFeatureSetDiff(diff); err != nil {
1781+
fmt.Fprintf(errOut, "error: unable to calculate feature gate diff: %v\n", err)
1782+
hasError = true
1783+
} else {
1784+
orderedFeatureGates := featureSetDiff.GetOrderedFeatureGates()
1785+
allFeatureSets := featureSetDiff.AllFeatureSets()
1786+
allFeatureSets.Delete("LatencySensitive") // this was a dead-end featureset we removed.
1787+
allClusterProfiles := featureSetDiff.AllClusterProfiles()
1788+
for _, fg := range orderedFeatureGates {
1789+
fgInfo := ChangeLogFeatureGateInfo{
1790+
Name: fg,
1791+
Status: map[string]map[string]string{},
1792+
}
1793+
for _, cp := range sets.List(allClusterProfiles) {
1794+
fgInfo.Status[cp] = map[string]string{}
1795+
for _, fs := range sets.List(allFeatureSets) {
1796+
if diffInfo := featureSetDiff.FeatureInfoFor(cp, fs); diffInfo != nil {
1797+
if change, ok := diffInfo.ChangedFeatureGates[fg]; ok {
1798+
fgInfo.Status[cp][fs] = change
1799+
}
1800+
}
1801+
}
1802+
}
1803+
changeLog.FeatureGates = append(changeLog.FeatureGates, fgInfo)
1804+
}
1805+
}
17801806
if len(added) > 0 {
17811807
for _, k := range added {
17821808
changeLog.NewImages = append(changeLog.NewImages, refToChangeInfo(diff.ChangedImages[k].To))
@@ -2712,11 +2738,19 @@ type ChangeLog struct {
27122738
From ChangeLogReleaseInfo `json:"from"`
27132739
To ChangeLogReleaseInfo `json:"to"`
27142740

2715-
Components []ChangeLogComponentInfo `json:"components,omitempty"`
2716-
NewImages []ChangeLogImageInfo `json:"newImages,omitempty"`
2717-
RemovedImages []ChangeLogImageInfo `json:"removedImages,omitempty"`
2718-
RebuiltImages []ChangeLogImageInfo `json:"rebuiltImages,omitempty"`
2719-
UpdatedImages []ChangeLogImageInfo `json:"updatedImages,omitempty"`
2741+
Components []ChangeLogComponentInfo `json:"components,omitempty"`
2742+
FeatureGates []ChangeLogFeatureGateInfo `json:"featureGates,omitempty"`
2743+
NewImages []ChangeLogImageInfo `json:"newImages,omitempty"`
2744+
RemovedImages []ChangeLogImageInfo `json:"removedImages,omitempty"`
2745+
RebuiltImages []ChangeLogImageInfo `json:"rebuiltImages,omitempty"`
2746+
UpdatedImages []ChangeLogImageInfo `json:"updatedImages,omitempty"`
2747+
}
2748+
2749+
// ChangeLogFeatureGateInfo describes the state of a feature gate across cluster profiles and feature sets.
2750+
type ChangeLogFeatureGateInfo struct {
2751+
Name string `json:"name"`
2752+
// Status maps clusterProfile -> featureSet -> status string (e.g. "Enabled (Changed)", "Disabled (New)")
2753+
Status map[string]map[string]string `json:"status"`
27202754
}
27212755

27222756
type ChangeLogReleaseInfo struct {

0 commit comments

Comments
 (0)