@@ -140,12 +140,22 @@ type metadata struct {
140
140
141
141
func LoadUpdate (dir , releaseImage , excludeIdentifier string , requiredFeatureSet string , profile string ,
142
142
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
+ )
143
151
144
- payload , tasks , err := loadUpdatePayloadMetadata ( dir , releaseImage , profile )
152
+ payload , err := loadPayloadMetadata ( releaseDir , releaseImage )
145
153
if err != nil {
146
154
return nil , err
147
155
}
148
156
157
+ tasks := loadPayloadTasks (releaseDir , cvoDir , releaseImage , profile )
158
+
149
159
var onlyKnownCaps * configv1.ClusterVersionCapabilitiesStatus
150
160
151
161
if knownCapabilities != nil {
@@ -293,47 +303,42 @@ func ValidateDirectory(dir string) error {
293
303
return nil
294
304
}
295
305
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 )
313
308
if err != nil {
314
- return nil , nil , err
309
+ return nil , err
315
310
}
316
311
release .Image = releaseImage
317
312
318
313
imageRef , err := loadImageReferences (releaseDir )
319
314
if err != nil {
320
- return nil , nil , err
315
+ return nil , err
321
316
}
322
317
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 )
325
322
}
326
323
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
+ }
328
327
329
328
return & Update {
330
329
Release : release ,
331
330
ImageRef : imageRef ,
332
331
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 ]
334
339
}
335
340
336
- func getPayloadTasks (releaseDir , cvoDir , releaseImage , clusterProfile string ) []payloadTasks {
341
+ func loadPayloadTasks (releaseDir , cvoDir , releaseImage , clusterProfile string ) []payloadTasks {
337
342
cjf := filepath .Join (releaseDir , cincinnatiJSONFile )
338
343
irf := filepath .Join (releaseDir , imageReferencesFile )
339
344
@@ -353,52 +358,49 @@ func getPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) []
353
358
}}
354
359
}
355
360
356
- func loadReleaseFromMetadata (releaseDir string ) (configv1.Release , string , error ) {
361
+ func loadReleaseMetadata (releaseDir string ) (configv1.Release , error ) {
357
362
var release configv1.Release
358
363
path := filepath .Join (releaseDir , cincinnatiJSONFile )
359
364
data , err := os .ReadFile (path )
360
365
if err != nil {
361
- return release , "" , err
366
+ return release , err
362
367
}
363
368
364
369
var metadata metadata
365
370
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 )
367
372
}
368
373
369
374
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 )
371
376
}
372
377
373
378
if metadata .Version == "" {
374
- return release , "" , errors .New ("missing required Cincinnati metadata version" )
379
+ return release , errors .New ("missing required Cincinnati metadata version" )
375
380
}
376
381
377
382
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 )
379
384
}
380
385
381
386
release .Version = metadata .Version
382
387
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 )
397
393
}
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 )
401
402
}
403
+
402
404
if urlInterface , ok := metadata .Metadata ["url" ]; ok {
403
405
if urlString , ok := urlInterface .(string ); ok {
404
406
release .URL = configv1 .URL (urlString )
@@ -415,7 +417,7 @@ func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error
415
417
}
416
418
}
417
419
418
- return release , arch , nil
420
+ return release , nil
419
421
}
420
422
421
423
func loadImageReferences (releaseDir string ) (* imagev1.ImageStream , error ) {
0 commit comments