Skip to content

Commit e8648c7

Browse files
committed
refactor(payload): separate arch load from metadata and runtime
The architecture is either read from release metadata when present (and in that case it must be a string and must be multi) or determined from runtime in all other cases. Refactor `loadReleaseFromMetadata` so that it only really reads the metadata, and move the "when metadata does not have architecture, read from runtime" logic to `loadPayloadMetadata` above (the `loadReleaseFromMetadata` caller). This will allow to reuse the release metadata loading code without involving more logic than necessary. This also simplifies `loadReleaseFromMetadata` signature, improving readability. Also turn some nested conditionals into guard clauses for readability.
1 parent 76e78a0 commit e8648c7

File tree

1 file changed

+28
-25
lines changed

1 file changed

+28
-25
lines changed

pkg/payload/payload.go

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ func ValidateDirectory(dir string) error {
304304
}
305305

306306
func loadPayloadMetadata(releaseDir, releaseImage string) (*Update, error) {
307-
release, arch, err := loadReleaseFromMetadata(releaseDir)
307+
release, err := loadReleaseFromMetadata(releaseDir)
308308
if err != nil {
309309
return nil, err
310310
}
@@ -315,6 +315,12 @@ func loadPayloadMetadata(releaseDir, releaseImage string) (*Update, error) {
315315
return nil, err
316316
}
317317

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)
322+
}
323+
318324
if imageRef.Name != release.Version {
319325
return nil, fmt.Errorf("Version from %s (%s) differs from %s (%s)", imageReferencesFile, imageRef.Name, cincinnatiJSONFile, release.Version)
320326
}
@@ -352,52 +358,49 @@ func loadPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) [
352358
}}
353359
}
354360

355-
func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error) {
361+
func loadReleaseFromMetadata(releaseDir string) (configv1.Release, error) {
356362
var release configv1.Release
357363
path := filepath.Join(releaseDir, cincinnatiJSONFile)
358364
data, err := os.ReadFile(path)
359365
if err != nil {
360-
return release, "", err
366+
return release, err
361367
}
362368

363369
var metadata metadata
364370
if err := json.Unmarshal(data, &metadata); err != nil {
365-
return release, "", fmt.Errorf("unmarshal Cincinnati metadata: %w", err)
371+
return release, fmt.Errorf("unmarshal Cincinnati metadata: %w", err)
366372
}
367373

368374
if metadata.Kind != "cincinnati-metadata-v0" {
369-
return release, "", fmt.Errorf("unrecognized Cincinnati metadata kind %q", metadata.Kind)
375+
return release, fmt.Errorf("unrecognized Cincinnati metadata kind %q", metadata.Kind)
370376
}
371377

372378
if metadata.Version == "" {
373-
return release, "", errors.New("missing required Cincinnati metadata version")
379+
return release, errors.New("missing required Cincinnati metadata version")
374380
}
375381

376382
if _, err := semver.Parse(metadata.Version); err != nil {
377-
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)
378384
}
379385

380386
release.Version = metadata.Version
381387

382-
var arch string
383-
if archInterface, ok := metadata.Metadata["release.openshift.io/architecture"]; ok {
384-
if archString, ok := archInterface.(string); ok {
385-
if archString == releaseMultiArchID {
386-
release.Architecture = configv1.ClusterVersionArchitectureMulti
387-
arch = string(release.Architecture)
388-
} else {
389-
return release, "", fmt.Errorf("Architecture from %s (%s) contains invalid value: %q. Valid value is %q.",
390-
cincinnatiJSONFile, release.Version, archString, releaseMultiArchID)
391-
}
392-
klog.V(2).Infof("Architecture from %s (%s) is multi: %q", cincinnatiJSONFile, release.Version, archString)
393-
} else {
394-
return release, "", fmt.Errorf("Architecture from %s (%s) is not a string: %v",
395-
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)
396393
}
397-
} else {
398-
arch = runtime.GOARCH
399-
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)
400402
}
403+
401404
if urlInterface, ok := metadata.Metadata["url"]; ok {
402405
if urlString, ok := urlInterface.(string); ok {
403406
release.URL = configv1.URL(urlString)
@@ -414,7 +417,7 @@ func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error
414417
}
415418
}
416419

417-
return release, arch, nil
420+
return release, nil
418421
}
419422

420423
func loadImageReferences(releaseDir string) (*imagev1.ImageStream, error) {

0 commit comments

Comments
 (0)