Skip to content

Commit 5d71fb4

Browse files
Merge pull request #1185 from petr-muller/ocpbugs-30080-02-payload-metadata-load-refactor
OTA-1531: [2/x] cvo: refactor `LoadUpdate`
2 parents c410434 + 4fe21f6 commit 5d71fb4

File tree

1 file changed

+51
-49
lines changed

1 file changed

+51
-49
lines changed

pkg/payload/payload.go

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,22 @@ type metadata struct {
140140

141141
func 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

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

0 commit comments

Comments
 (0)