@@ -2,12 +2,14 @@ package payload
22
33import (
44 "bytes"
5+ "encoding/json"
56 "fmt"
67 "os"
78 "path/filepath"
89 "strings"
910 "text/template"
1011
12+ "github.com/blang/semver/v4"
1113 "github.com/openshift/api/config"
1214 configv1 "github.com/openshift/api/config/v1"
1315 "github.com/openshift/library-go/pkg/manifest"
@@ -40,6 +42,11 @@ func Render(outputDir, releaseImage, featureGateManifestPath, clusterProfile str
4042 return fmt .Errorf ("error parsing feature gate manifest: %w" , err )
4143 }
4244
45+ payloadVersion , err := loadReleaseVersion (releaseManifestsDir )
46+ if err != nil {
47+ return fmt .Errorf ("error loading release version: %w" , err )
48+ }
49+
4350 tasks := []struct {
4451 idir string
4552 odir string
@@ -70,7 +77,7 @@ func Render(outputDir, releaseImage, featureGateManifestPath, clusterProfile str
7077 }}
7178 var errs []error
7279 for _ , task := range tasks {
73- if err := renderDir (renderConfig , task .idir , task .odir , requiredFeatureSet , enabledFeatureGates , & clusterProfile , task .processTemplate , task .skipFiles , task .filterGroupKind ); err != nil {
80+ if err := renderDir (renderConfig , task .idir , task .odir , requiredFeatureSet , enabledFeatureGates , & clusterProfile , ptr . To ( payloadVersion . Major ), task .processTemplate , task .skipFiles , task .filterGroupKind ); err != nil {
7481 errs = append (errs , err )
7582 }
7683 }
@@ -82,8 +89,8 @@ func Render(outputDir, releaseImage, featureGateManifestPath, clusterProfile str
8289 return nil
8390}
8491
85- func renderDir (renderConfig manifestRenderConfig , idir , odir string , requiredFeatureSet * string , enabledFeatureGates sets.Set [string ], clusterProfile * string , processTemplate bool , skipFiles sets.Set [string ], filterGroupKind sets.Set [schema.GroupKind ]) error {
86- klog .Infof ("Filtering manifests in %s for feature set %v, cluster profile %v and enabled feature gates %v" , idir , * requiredFeatureSet , * clusterProfile , enabledFeatureGates .UnsortedList ())
92+ func renderDir (renderConfig manifestRenderConfig , idir , odir string , requiredFeatureSet * string , enabledFeatureGates sets.Set [string ], clusterProfile * string , majorVersion * uint64 , processTemplate bool , skipFiles sets.Set [string ], filterGroupKind sets.Set [schema.GroupKind ]) error {
93+ klog .Infof ("Filtering manifests in %s for feature set %v, cluster profile %v, enabled feature gates %v, and major version %v " , idir , * requiredFeatureSet , * clusterProfile , enabledFeatureGates .UnsortedList (), ptr . Deref ( majorVersion , 0 ))
8794
8895 if err := os .MkdirAll (odir , 0666 ); err != nil {
8996 return err
@@ -133,7 +140,7 @@ func renderDir(renderConfig manifestRenderConfig, idir, odir string, requiredFea
133140 for _ , manifest := range manifests {
134141 if len (filterGroupKind ) > 0 && ! filterGroupKind .Has (manifest .GVK .GroupKind ()) {
135142 klog .Infof ("excluding %s because we do not render that group/kind" , manifest .String ())
136- } else if err := manifest .Include (nil , requiredFeatureSet , clusterProfile , nil , nil , enabledFeatureGates ); err != nil {
143+ } else if err := manifest .Include (nil , requiredFeatureSet , clusterProfile , nil , nil , enabledFeatureGates , majorVersion ); err != nil {
137144 klog .Infof ("excluding %s: %v" , manifest .String (), err )
138145 } else {
139146 filteredManifests = append (filteredManifests , string (manifest .Raw ))
@@ -238,3 +245,27 @@ func parseFeatureGateManifest(featureGateManifestPath string) (*string, sets.Set
238245
239246 return requiredFeatureSet , enabledFeatureGates , nil
240247}
248+
249+ func loadReleaseVersion (releaseDir string ) (semver.Version , error ) {
250+ path := filepath .Join (releaseDir , cincinnatiJSONFile )
251+ data , err := os .ReadFile (path )
252+ if err != nil {
253+ return semver.Version {}, err
254+ }
255+
256+ var metadata metadata
257+ if err := json .Unmarshal (data , & metadata ); err != nil {
258+ return semver.Version {}, fmt .Errorf ("unmarshal Cincinnati metadata: %w" , err )
259+ }
260+
261+ if metadata .Version == "" {
262+ return semver.Version {}, errors .New ("missing required Cincinnati metadata version" )
263+ }
264+
265+ parsedVersion , err := semver .Parse (metadata .Version )
266+ if err != nil {
267+ return semver.Version {}, fmt .Errorf ("Cincinnati metadata version %q is not a valid semantic version: %v" , metadata .Version , err )
268+ }
269+
270+ return parsedVersion , nil
271+ }
0 commit comments