@@ -204,6 +204,7 @@ func (r *ClusterExtensionReconciler) handleResolutionErrors(ext *ocv1alpha1.Clus
204204 setResolvedStatusConditionFailed (& ext .Status .Conditions , errorMessage , ext .Generation )
205205 ensureAllConditionsWithReason (ext , "InstallationStatusUnknown" , "" )
206206 }
207+ ext .Status .ResolvedBundle = nil
207208 return ctrl.Result {}, err
208209}
209210
@@ -411,6 +412,11 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
411412 channelName := ext .Spec .Channel
412413 versionRange := ext .Spec .Version
413414
415+ installedBundle , err := r .installedBundle (ctx , allBundles , & ext )
416+ if err != nil {
417+ return nil , err
418+ }
419+
414420 predicates := []catalogfilter.Predicate [catalogmetadata.Bundle ]{
415421 catalogfilter .WithPackageName (packageName ),
416422 }
@@ -427,35 +433,35 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
427433 predicates = append (predicates , catalogfilter .InMastermindsSemverRange (vr ))
428434 }
429435
430- var installedVersion string
431- var upgradeErrorPrefix string
432- if ext .Spec .UpgradeConstraintPolicy != ocv1alpha1 .UpgradeConstraintPolicyIgnore {
433- installedBundle , err := r .getInstalledVersion (ctx , ext )
436+ if ext .Spec .UpgradeConstraintPolicy != ocv1alpha1 .UpgradeConstraintPolicyIgnore && installedBundle != nil {
437+ upgradePredicate , err := SuccessorsPredicate (installedBundle )
434438 if err != nil {
435- return nil , utilerrors .NewAggregate ([]error {fmt .Errorf ("error fetching installed version: %w" , err )})
436- }
437- if installedBundle != nil {
438- installedVersion = installedBundle .String ()
439- upgradeErrorPrefix = fmt .Sprintf ("error upgrading from currently installed version %q: " , installedVersion )
440- wantedVersionRangeConstraint , err := mmsemver .NewConstraint (fmt .Sprintf ("^%s" , installedVersion ))
441- if err != nil {
442- return nil , utilerrors .NewAggregate ([]error {fmt .Errorf ("%serror creating version constraint: %w" , upgradeErrorPrefix , err )})
443- }
444- predicates = append (predicates , catalogfilter .InMastermindsSemverRange (wantedVersionRangeConstraint ))
439+ return nil , err
445440 }
441+
442+ predicates = append (predicates , upgradePredicate )
446443 }
447444
448445 resultSet := catalogfilter .Filter (allBundles , catalogfilter .And (predicates ... ))
446+
447+ var upgradeErrorPrefix string
448+ if installedBundle != nil {
449+ installedBundleVersion , err := installedBundle .Version ()
450+ if err != nil {
451+ return nil , err
452+ }
453+ upgradeErrorPrefix = fmt .Sprintf ("error upgrading from currently installed version %q: " , installedBundleVersion .String ())
454+ }
449455 if len (resultSet ) == 0 {
450456 switch {
451457 case versionRange != "" && channelName != "" :
452- return nil , fmt .Errorf ("no package %q matching version %q in channel %q found" , packageName , versionRange , channelName )
458+ return nil , fmt .Errorf ("%sno package %q matching version %q in channel %q found" , upgradeErrorPrefix , packageName , versionRange , channelName )
453459 case versionRange != "" :
454- return nil , fmt .Errorf ("no package %q matching version %q found" , packageName , versionRange )
460+ return nil , fmt .Errorf ("%sno package %q matching version %q found" , upgradeErrorPrefix , packageName , versionRange )
455461 case channelName != "" :
456- return nil , fmt .Errorf ("no package %q in channel %q found" , packageName , channelName )
462+ return nil , fmt .Errorf ("%sno package %q in channel %q found" , upgradeErrorPrefix , packageName , channelName )
457463 default :
458- return nil , fmt .Errorf ("no package %q found" , packageName )
464+ return nil , fmt .Errorf ("%sno package %q found" , upgradeErrorPrefix , packageName )
459465 }
460466 }
461467
@@ -682,32 +688,41 @@ func clusterExtensionRequestsForCatalog(c client.Reader, logger logr.Logger) crh
682688 }
683689}
684690
685- // getInstalledVersion fetches the installed version of a particular bundle from the cluster. To do so, we read the release label
686- // which are added during install.
687- func (r * ClusterExtensionReconciler ) getInstalledVersion (ctx context.Context , clusterExtension ocv1alpha1.ClusterExtension ) (* bsemver.Version , error ) {
688- cl , err := r .ActionClientGetter .ActionClientFor (ctx , & clusterExtension )
691+ func (r * ClusterExtensionReconciler ) installedBundle (ctx context.Context , allBundles []* catalogmetadata.Bundle , ext * ocv1alpha1.ClusterExtension ) (* catalogmetadata.Bundle , error ) {
692+ cl , err := r .ActionClientGetter .ActionClientFor (ctx , ext )
689693 if err != nil {
690694 return nil , err
691695 }
692696
693- release , err := cl .Get (clusterExtension .GetName ())
697+ release , err := cl .Get (ext .GetName ())
694698 if err != nil && ! errors .Is (err , driver .ErrReleaseNotFound ) {
695699 return nil , err
696700 }
697701 if release == nil {
698702 return nil , nil
699703 }
700704
701- existingVersion , ok := release .Labels [labels .BundleVersionKey ]
702- if ! ok {
703- return nil , fmt .Errorf ("release %q: missing bundle version" , release .Name )
705+ // Bundle must match installed version exactly
706+ vr , err := mmsemver .NewConstraint (release .Labels [labels .BundleVersionKey ])
707+ if err != nil {
708+ return nil , err
704709 }
705710
706- existingVersionSemver , err := bsemver .New (existingVersion )
707- if err != nil {
708- return nil , fmt .Errorf ("could not determine bundle version for the chart %q: %w" , release .Name , err )
711+ // find corresponding bundle for the installed content
712+ resultSet := catalogfilter .Filter (allBundles , catalogfilter .And (
713+ catalogfilter .WithPackageName (release .Labels [labels .PackageNameKey ]),
714+ catalogfilter .WithBundleName (release .Labels [labels .BundleNameKey ]),
715+ catalogfilter .InMastermindsSemverRange (vr ),
716+ ))
717+ if len (resultSet ) == 0 {
718+ return nil , fmt .Errorf ("bundle %q for package %q not found in available catalogs but is currently installed via helm chart %q in namespace %q" , release .Labels [labels .BundleNameKey ], ext .Spec .PackageName , release .Name , release .Namespace )
709719 }
710- return existingVersionSemver , nil
720+
721+ sort .SliceStable (resultSet , func (i , j int ) bool {
722+ return catalogsort .ByVersion (resultSet [i ], resultSet [j ])
723+ })
724+
725+ return resultSet [0 ], nil
711726}
712727
713728type releaseState string
0 commit comments