@@ -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
27222756type ChangeLogReleaseInfo struct {
0 commit comments