Skip to content

Commit 53577db

Browse files
authored
Helm POC e2e fixes (#870)
Fixes the e2e tests in helm-poc branch and restores feature-gate switching. Signed-off-by: dtfranz <[email protected]>
1 parent 570b89f commit 53577db

File tree

5 files changed

+75
-68
lines changed

5 files changed

+75
-68
lines changed

internal/catalogmetadata/filter/bundle_predicates.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ func WithBundleImage(bundleImage string) Predicate[catalogmetadata.Bundle] {
6060
}
6161
}
6262

63+
func WithBundleName(bundleName string) Predicate[catalogmetadata.Bundle] {
64+
return func(bundle *catalogmetadata.Bundle) bool {
65+
return bundle.Name == bundleName
66+
}
67+
}
68+
6369
func LegacySuccessor(installedBundle *catalogmetadata.Bundle) Predicate[catalogmetadata.Bundle] {
6470
isSuccessor := func(candidateBundleEntry declcfg.ChannelEntry) bool {
6571
if candidateBundleEntry.Replaces == installedBundle.Name {

internal/catalogmetadata/filter/bundle_predicates_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,16 @@ func TestWithDeprecation(t *testing.T) {
201201
assert.True(t, f(b1))
202202
assert.False(t, f(b2))
203203
}
204+
205+
func TestWithBundleName(t *testing.T) {
206+
b1 := &catalogmetadata.Bundle{
207+
Bundle: declcfg.Bundle{Name: "package1.v0.0.1"},
208+
}
209+
b2 := &catalogmetadata.Bundle{
210+
Bundle: declcfg.Bundle{Name: "package1.v0.0.2"},
211+
}
212+
213+
f := filter.WithBundleName("package1.v0.0.1")
214+
assert.True(t, f(b1))
215+
assert.False(t, f(b2))
216+
}

internal/controllers/clusterextension_controller.go

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

713728
type releaseState string

test/e2e/cluster_extension_install_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ func TestClusterExtensionInstallReResolvesWhenNewCatalog(t *testing.T) {
183183
}
184184

185185
func TestClusterExtensionBlockInstallNonSuccessorVersion(t *testing.T) {
186-
t.Skip("Skipping tests related to upgrades")
187186
t.Log("When a cluster extension is installed from a catalog")
188187
t.Log("When resolving upgrade edges")
189188

@@ -229,7 +228,6 @@ func TestClusterExtensionBlockInstallNonSuccessorVersion(t *testing.T) {
229228
}
230229

231230
func TestClusterExtensionForceInstallNonSuccessorVersion(t *testing.T) {
232-
t.Skip("Skipping tests related to upgrades")
233231
t.Log("When a cluster extension is installed from a catalog")
234232
t.Log("When resolving upgrade edges")
235233

@@ -276,7 +274,6 @@ func TestClusterExtensionForceInstallNonSuccessorVersion(t *testing.T) {
276274
}
277275

278276
func TestClusterExtensionInstallSuccessorVersion(t *testing.T) {
279-
t.Skip("Skipping tests related to upgrades")
280277
t.Log("When a cluster extension is installed from a catalog")
281278
t.Log("When resolving upgrade edges")
282279
clusterExtension, extensionCatalog := testInit(t)

test/e2e/cluster_extension_registryV1_limitations_test.go

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,36 @@ package e2e
22

33
import (
44
"context"
5-
"os"
65
"testing"
76

87
"github.com/stretchr/testify/assert"
98
"github.com/stretchr/testify/require"
10-
"k8s.io/apimachinery/pkg/api/errors"
119
apimeta "k8s.io/apimachinery/pkg/api/meta"
1210
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1311
"k8s.io/apimachinery/pkg/types"
1412

15-
catalogd "github.com/operator-framework/catalogd/api/core/v1alpha1"
16-
1713
ocv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
1814
)
1915

2016
func TestClusterExtensionPackagesWithWebhooksAreNotAllowed(t *testing.T) {
2117
ctx := context.Background()
22-
catalog, err := createTestCatalog(ctx, testCatalogName, os.Getenv(testCatalogRefEnvVar))
23-
defer func(cat *catalogd.Catalog) {
24-
require.NoError(t, c.Delete(context.Background(), cat))
25-
require.Eventually(t, func() bool {
26-
err := c.Get(context.Background(), types.NamespacedName{Name: cat.Name}, &catalogd.Catalog{})
27-
return errors.IsNotFound(err)
28-
}, pollDuration, pollInterval)
29-
}(catalog)
30-
require.NoError(t, err)
31-
32-
deleteClusterExtension := func(clusterExtension *ocv1alpha1.ClusterExtension) {
33-
require.NoError(t, c.Delete(ctx, clusterExtension))
34-
require.Eventually(t, func() bool {
35-
err := c.Get(ctx, types.NamespacedName{Name: clusterExtension.Name}, &ocv1alpha1.ClusterExtension{})
36-
return errors.IsNotFound(err)
37-
}, pollDuration, pollInterval)
38-
}
18+
clusterExtension, catalog := testInit(t)
3919

40-
clusterExtension := &ocv1alpha1.ClusterExtension{
41-
ObjectMeta: metav1.ObjectMeta{
42-
GenerateName: "package-with-webhooks-",
43-
},
44-
Spec: ocv1alpha1.ClusterExtensionSpec{
45-
PackageName: "package-with-webhooks",
46-
Version: "1.0.0",
47-
InstallNamespace: "default",
48-
},
20+
clusterExtension.Spec = ocv1alpha1.ClusterExtensionSpec{
21+
PackageName: "package-with-webhooks",
22+
Version: "1.0.0",
23+
InstallNamespace: "default",
4924
}
50-
err = c.Create(ctx, clusterExtension)
51-
defer deleteClusterExtension(clusterExtension)
52-
require.NoError(t, err)
25+
require.NoError(t, c.Create(ctx, clusterExtension))
26+
defer testCleanup(t, catalog, clusterExtension)
27+
defer getArtifactsOutput(t)
5328

5429
require.EventuallyWithT(t, func(ct *assert.CollectT) {
5530
assert.NoError(ct, c.Get(ctx, types.NamespacedName{Name: clusterExtension.Name}, clusterExtension))
56-
5731
cond := apimeta.FindStatusCondition(clusterExtension.Status.Conditions, ocv1alpha1.TypeInstalled)
58-
assert.NotNil(ct, cond)
32+
if !assert.NotNil(ct, cond) {
33+
return
34+
}
5935
assert.Equal(ct, metav1.ConditionFalse, cond.Status)
6036
assert.Equal(ct, ocv1alpha1.ReasonInstallationFailed, cond.Reason)
6137
assert.Contains(ct, cond.Message, "webhookDefinitions are not supported")

0 commit comments

Comments
 (0)