Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/cvo/cvo.go
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,7 @@ func hasReachedLevel(cv *configv1.ClusterVersion, desired configv1.Update) bool

func (optr *Operator) defaultPreconditionChecks() precondition.List {
return []precondition.Precondition{
preconditioncv.NewRollback(optr.currentVersion),
preconditioncv.NewMetadataUpdate(optr.currentVersion),
preconditioncv.NewUpgradeable(optr.cvLister),
preconditioncv.NewRecentEtcdBackup(optr.cvLister, optr.coLister),
preconditioncv.NewRecommendedUpdate(optr.cvLister),
Expand Down
1 change: 1 addition & 0 deletions pkg/cvo/sync_worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ func (w *SyncWorker) syncPayload(ctx context.Context, work *SyncWork,
} else {
if block, err := precondition.Summarize(w.preconditions.RunAll(ctx, precondition.ReleaseContext{
DesiredVersion: payloadUpdate.Release.Version,
Previous: payloadUpdate.Previous,
}), work.Desired.Force); err != nil {
klog.V(2).Infof("Precondition error (force %t, block %t): %v", work.Desired.Force, block, err)
if block {
Expand Down
12 changes: 9 additions & 3 deletions pkg/payload/payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ type Update struct {

Architecture string

// Previous is a slice of valid previous versions.
Previous []string

// manifestHash is a hash of the manifests included in this payload
ManifestHash string
Manifests []manifest.Manifest
Expand Down Expand Up @@ -313,7 +316,7 @@ func loadUpdatePayloadMetadata(dir, releaseImage, clusterProfile string) (*Updat
releaseDir = filepath.Join(dir, ReleaseManifestDir)
)

release, arch, err := loadReleaseFromMetadata(releaseDir)
release, arch, previous, err := loadReleaseFromMetadata(releaseDir)
if err != nil {
return nil, nil, err
}
Expand All @@ -334,6 +337,7 @@ func loadUpdatePayloadMetadata(dir, releaseImage, clusterProfile string) (*Updat
Release: release,
ImageRef: imageRef,
Architecture: arch,
Previous: previous,
}, tasks, nil
}

Expand All @@ -357,7 +361,7 @@ func getPayloadTasks(releaseDir, cvoDir, releaseImage, clusterProfile string) []
}}
}

func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error) {
func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, []string, error) {
var release configv1.Release
path := filepath.Join(releaseDir, cincinnatiJSONFile)
data, err := os.ReadFile(path)
Expand Down Expand Up @@ -418,7 +422,9 @@ func loadReleaseFromMetadata(releaseDir string) (configv1.Release, string, error
}
}

return release, arch, nil
// FIXME: load Metadata["previous"]

return release, arch, previous, nil
}

func loadImageReferences(releaseDir string) (*imagev1.ImageStream, error) {
Expand Down
50 changes: 50 additions & 0 deletions pkg/payload/precondition/clusterversion/metadata_update.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package clusterversion

import (
"context"
"fmt"

configv1 "github.com/openshift/api/config/v1"

precondition "github.com/openshift/cluster-version-operator/pkg/payload/precondition"
)

// currentRelease is a callback for returning the version that is currently being reconciled.
type currentRelease func() configv1.Release

// MetadataUpdate blocks metadataUpdates from the version that is currently being reconciled.
type MetadataUpdate struct {
currentRelease
}

// NewMetadataUpdate returns a new MetadataUpdate precondition check.
func NewMetadataUpdate(fn currentRelease) *MetadataUpdate {
return &MetadataUpdate{
currentRelease: fn,
}
}

// Name returns Name for the precondition.
func (pf *MetadataUpdate) Name() string { return "ClusterVersionMetadataUpdate" }

// Run runs the MetadataUpdate precondition, blocking metadataUpdates from the
// version that is currently being reconciled. It returns a
// PreconditionError when possible.
func (p *MetadataUpdate) Run(ctx context.Context, releaseContext precondition.ReleaseContext) error {
currentRelease := p.currentRelease()
if releaseContext.DesiredVersion == currentRelease {
return nil
}

for _, previous in := range releaseContext.Previous {
if currentRelease == previous {
return nil
}
}

return &precondition.Error{
Reason: "InvalidDesiredVersion",
Message: fmt.Sprintf("The current version %q is neither the desired version %q nor a version declared in the desired version's previous-release update metadata: %v", currentVersion, releaseContext.DesiredVersion, releaseContext.Previous)
Name: p.Name(),
}
}
65 changes: 0 additions & 65 deletions pkg/payload/precondition/clusterversion/rollback.go

This file was deleted.

3 changes: 3 additions & 0 deletions pkg/payload/precondition/precondition.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ type ReleaseContext struct {
// where the author decided to use a different naming scheme, or
// to leave the version completely unset.
DesiredVersion string

// Previous is a slice of valid previous versions.
Previous []string
}

// Precondition defines the precondition check for a payload.
Expand Down