@@ -204,6 +204,7 @@ func (r *ClusterExtensionReconciler) handleResolutionErrors(ext *ocv1alpha1.Clus
204
204
setResolvedStatusConditionFailed (& ext .Status .Conditions , errorMessage , ext .Generation )
205
205
ensureAllConditionsWithReason (ext , "InstallationStatusUnknown" , "" )
206
206
}
207
+ ext .Status .ResolvedBundle = nil
207
208
return ctrl.Result {}, err
208
209
}
209
210
@@ -411,6 +412,11 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
411
412
channelName := ext .Spec .Channel
412
413
versionRange := ext .Spec .Version
413
414
415
+ installedBundle , err := r .installedBundle (ctx , allBundles , & ext )
416
+ if err != nil {
417
+ return nil , err
418
+ }
419
+
414
420
predicates := []catalogfilter.Predicate [catalogmetadata.Bundle ]{
415
421
catalogfilter .WithPackageName (packageName ),
416
422
}
@@ -427,35 +433,35 @@ func (r *ClusterExtensionReconciler) resolve(ctx context.Context, ext ocv1alpha1
427
433
predicates = append (predicates , catalogfilter .InMastermindsSemverRange (vr ))
428
434
}
429
435
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 )
434
438
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
445
440
}
441
+
442
+ predicates = append (predicates , upgradePredicate )
446
443
}
447
444
448
445
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
+ }
449
455
if len (resultSet ) == 0 {
450
456
switch {
451
457
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 )
453
459
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 )
455
461
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 )
457
463
default :
458
- return nil , fmt .Errorf ("no package %q found" , packageName )
464
+ return nil , fmt .Errorf ("%sno package %q found" , upgradeErrorPrefix , packageName )
459
465
}
460
466
}
461
467
@@ -682,32 +688,41 @@ func clusterExtensionRequestsForCatalog(c client.Reader, logger logr.Logger) crh
682
688
}
683
689
}
684
690
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 )
689
693
if err != nil {
690
694
return nil , err
691
695
}
692
696
693
- release , err := cl .Get (clusterExtension .GetName ())
697
+ release , err := cl .Get (ext .GetName ())
694
698
if err != nil && ! errors .Is (err , driver .ErrReleaseNotFound ) {
695
699
return nil , err
696
700
}
697
701
if release == nil {
698
702
return nil , nil
699
703
}
700
704
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
704
709
}
705
710
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 )
709
719
}
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
711
726
}
712
727
713
728
type releaseState string
0 commit comments