@@ -140,12 +140,22 @@ type metadata struct {
140140
141141func LoadUpdate (dir , releaseImage , excludeIdentifier string , requiredFeatureSet string , profile string ,
142142 knownCapabilities []configv1.ClusterVersionCapability ) (* Update , error ) {
143+ klog .V (2 ).Infof ("Loading updatepayload from %q" , dir )
144+ if err := ValidateDirectory (dir ); err != nil {
145+ return nil , err
146+ }
147+ var (
148+ cvoDir = filepath .Join (dir , CVOManifestDir )
149+ releaseDir = filepath .Join (dir , ReleaseManifestDir )
150+ )
143151
144- payload , tasks , err := loadUpdatePayloadMetadata ( dir , releaseImage , profile )
152+ payload , err := loadPayloadMetadata ( releaseDir , releaseImage )
145153 if err != nil {
146154 return nil , err
147155 }
148156
157+ tasks := loadPayloadTasks (releaseDir , cvoDir , releaseImage , profile )
158+
149159 var onlyKnownCaps * configv1.ClusterVersionCapabilitiesStatus
150160
151161 if knownCapabilities != nil {
@@ -293,47 +303,42 @@ func ValidateDirectory(dir string) error {
293303 return nil
294304}
295305
296- type payloadTasks struct {
297- idir string
298- preprocess func ([]byte ) ([]byte , error )
299- skipFiles sets.Set [string ]
300- }
301-
302- func loadUpdatePayloadMetadata (dir , releaseImage , clusterProfile string ) (* Update , []payloadTasks , error ) {
303- klog .V (2 ).Infof ("Loading updatepayload from %q" , dir )
304- if err := ValidateDirectory (dir ); err != nil {
305- return nil , nil , err
306- }
307- var (
308- cvoDir = filepath .Join (dir , CVOManifestDir )
309- releaseDir = filepath .Join (dir , ReleaseManifestDir )
310- )
311-
312- release , arch , err := loadReleaseFromMetadata (releaseDir )
306+ func loadPayloadMetadata (releaseDir , releaseImage string ) (* Update , error ) {
307+ release , err := loadReleaseMetadata (releaseDir )
313308 if err != nil {
314- return nil , nil , err
309+ return nil , err
315310 }
316311 release .Image = releaseImage
317312
318313 imageRef , err := loadImageReferences (releaseDir )
319314 if err != nil {
320- return nil , nil , err
315+ return nil , err
321316 }
322317
323- if imageRef .Name != release .Version {
324- return nil , nil , fmt .Errorf ("Version from %s (%s) differs from %s (%s)" , imageReferencesFile , imageRef .Name , cincinnatiJSONFile , release .Version )
318+ arch := string (release .Architecture )
319+ if arch == "" {
320+ arch = runtime .GOARCH
321+ klog .V (2 ).Infof ("Architecture from %s (%s) retrieved from runtime: %q" , cincinnatiJSONFile , release .Version , arch )
325322 }
326323
327- tasks := getPayloadTasks (releaseDir , cvoDir , releaseImage , clusterProfile )
324+ if imageRef .Name != release .Version {
325+ return nil , fmt .Errorf ("Version from %s (%s) differs from %s (%s)" , imageReferencesFile , imageRef .Name , cincinnatiJSONFile , release .Version )
326+ }
328327
329328 return & Update {
330329 Release : release ,
331330 ImageRef : imageRef ,
332331 Architecture : arch ,
333- }, tasks , nil
332+ }, nil
333+ }
334+
335+ type payloadTasks struct {
336+ idir string
337+ preprocess func ([]byte ) ([]byte , error )
338+ skipFiles sets.Set [string ]
334339}
335340
336- func getPayloadTasks (releaseDir , cvoDir , releaseImage , clusterProfile string ) []payloadTasks {
341+ func loadPayloadTasks (releaseDir , cvoDir , releaseImage , clusterProfile string ) []payloadTasks {
337342 cjf := filepath .Join (releaseDir , cincinnatiJSONFile )
338343 irf := filepath .Join (releaseDir , imageReferencesFile )
339344
@@ -353,52 +358,49 @@ func getPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) []
353358 }}
354359}
355360
356- func loadReleaseFromMetadata (releaseDir string ) (configv1.Release , string , error ) {
361+ func loadReleaseMetadata (releaseDir string ) (configv1.Release , error ) {
357362 var release configv1.Release
358363 path := filepath .Join (releaseDir , cincinnatiJSONFile )
359364 data , err := os .ReadFile (path )
360365 if err != nil {
361- return release , "" , err
366+ return release , err
362367 }
363368
364369 var metadata metadata
365370 if err := json .Unmarshal (data , & metadata ); err != nil {
366- return release , "" , fmt .Errorf ("unmarshal Cincinnati metadata: %w" , err )
371+ return release , fmt .Errorf ("unmarshal Cincinnati metadata: %w" , err )
367372 }
368373
369374 if metadata .Kind != "cincinnati-metadata-v0" {
370- return release , "" , fmt .Errorf ("unrecognized Cincinnati metadata kind %q" , metadata .Kind )
375+ return release , fmt .Errorf ("unrecognized Cincinnati metadata kind %q" , metadata .Kind )
371376 }
372377
373378 if metadata .Version == "" {
374- return release , "" , errors .New ("missing required Cincinnati metadata version" )
379+ return release , errors .New ("missing required Cincinnati metadata version" )
375380 }
376381
377382 if _ , err := semver .Parse (metadata .Version ); err != nil {
378- return release , "" , fmt .Errorf ("Cincinnati metadata version %q is not a valid semantic version: %v" , metadata .Version , err )
383+ return release , fmt .Errorf ("Cincinnati metadata version %q is not a valid semantic version: %v" , metadata .Version , err )
379384 }
380385
381386 release .Version = metadata .Version
382387
383- var arch string
384- if archInterface , ok := metadata .Metadata ["release.openshift.io/architecture" ]; ok {
385- if archString , ok := archInterface .(string ); ok {
386- if archString == releaseMultiArchID {
387- release .Architecture = configv1 .ClusterVersionArchitectureMulti
388- arch = string (release .Architecture )
389- } else {
390- return release , "" , fmt .Errorf ("Architecture from %s (%s) contains invalid value: %q. Valid value is %q." ,
391- cincinnatiJSONFile , release .Version , archString , releaseMultiArchID )
392- }
393- klog .V (2 ).Infof ("Architecture from %s (%s) is multi: %q" , cincinnatiJSONFile , release .Version , archString )
394- } else {
395- return release , "" , fmt .Errorf ("Architecture from %s (%s) is not a string: %v" ,
396- cincinnatiJSONFile , release .Version , archInterface )
388+ if archRaw , hasArch := metadata .Metadata ["release.openshift.io/architecture" ]; hasArch {
389+ arch , isString := archRaw .(string )
390+ if ! isString {
391+ return release , fmt .Errorf ("Architecture from %s (%s) is not a string: %v" ,
392+ cincinnatiJSONFile , release .Version , archRaw )
397393 }
398- } else {
399- arch = runtime .GOARCH
400- klog .V (2 ).Infof ("Architecture from %s (%s) retrieved from runtime: %q" , cincinnatiJSONFile , release .Version , arch )
394+
395+ if arch != releaseMultiArchID {
396+ return release , fmt .Errorf ("Architecture from %s (%s) contains invalid value: %q. Valid value is %q." ,
397+ cincinnatiJSONFile , release .Version , arch , releaseMultiArchID )
398+ }
399+
400+ release .Architecture = configv1 .ClusterVersionArchitectureMulti
401+ klog .V (2 ).Infof ("Architecture from %s (%s) is multi: %q" , cincinnatiJSONFile , release .Version , arch )
401402 }
403+
402404 if urlInterface , ok := metadata .Metadata ["url" ]; ok {
403405 if urlString , ok := urlInterface .(string ); ok {
404406 release .URL = configv1 .URL (urlString )
@@ -415,7 +417,7 @@ func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error
415417 }
416418 }
417419
418- return release , arch , nil
420+ return release , nil
419421}
420422
421423func loadImageReferences (releaseDir string ) (* imagev1.ImageStream , error ) {
0 commit comments