Skip to content

Commit 6d24df8

Browse files
author
Jeff Peeler
committed
fix(e2e): fix instability in test runs
TestCreateNewSubscriptionExistingCSV was occasionally flaking due to cleanupOLM not actually immediately deleting resources and initCatalog assuming that if a resource already existed that it would remain. My editor also cleaned up a lot of whitespacing in subscription_e2e_test.go.
1 parent 48efa74 commit 6d24df8

File tree

2 files changed

+61
-13
lines changed

2 files changed

+61
-13
lines changed

test/e2e/subscription_e2e_test.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@ package e2e
22

33
import (
44
"encoding/json"
5+
"fmt"
56
"testing"
6-
7+
78
"github.com/coreos/go-semver/semver"
89
"github.com/ghodss/yaml"
910
"github.com/stretchr/testify/require"
1011
appsv1 "k8s.io/api/apps/v1"
1112
corev1 "k8s.io/api/core/v1"
13+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
1214
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1315
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1416
"k8s.io/apimachinery/pkg/util/wait"
15-
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
1617

17-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
1818
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
19+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
1920
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
2021
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
2122
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
@@ -73,8 +74,8 @@ var (
7374
Name: outdated,
7475
},
7576
Spec: v1alpha1.ClusterServiceVersionSpec{
76-
Replaces: "",
77-
Version: *semver.New("0.1.0"),
77+
Replaces: "",
78+
Version: *semver.New("0.1.0"),
7879
MinKubeVersion: "0.0.0",
7980
InstallModes: []v1alpha1.InstallMode{
8081
{
@@ -103,8 +104,8 @@ var (
103104
Name: stable,
104105
},
105106
Spec: v1alpha1.ClusterServiceVersionSpec{
106-
Replaces: outdated,
107-
Version: *semver.New("0.2.0"),
107+
Replaces: outdated,
108+
Version: *semver.New("0.2.0"),
108109
MinKubeVersion: "0.0.0",
109110
InstallModes: []v1alpha1.InstallMode{
110111
{
@@ -260,13 +261,19 @@ func init() {
260261
func initCatalog(t *testing.T, c operatorclient.ClientInterface, crc versioned.Interface) error {
261262
// Create configmap containing catalog
262263
dummyCatalogConfigMap.SetNamespace(testNamespace)
263-
if _, err := c.KubernetesInterface().CoreV1().ConfigMaps(testNamespace).Create(dummyCatalogConfigMap); err != nil && !k8serrors.IsAlreadyExists(err) {
264+
if _, err := c.KubernetesInterface().CoreV1().ConfigMaps(testNamespace).Create(dummyCatalogConfigMap); err != nil {
265+
if k8serrors.IsAlreadyExists(err) {
266+
return fmt.Errorf("E2E bug detected: %v", err)
267+
}
264268
return err
265269
}
266270

267271
// Create catalog source custom resource pointing to ConfigMap
268272
dummyCatalogSource.SetNamespace(testNamespace)
269-
if _, err := crc.OperatorsV1alpha1().CatalogSources(testNamespace).Create(&dummyCatalogSource); err != nil && !k8serrors.IsAlreadyExists(err) {
273+
if _, err := crc.OperatorsV1alpha1().CatalogSources(testNamespace).Create(&dummyCatalogSource); err != nil {
274+
if k8serrors.IsAlreadyExists(err) {
275+
return fmt.Errorf("E2E bug detected: %v", err)
276+
}
270277
return err
271278
}
272279

@@ -384,7 +391,7 @@ func createSubscriptionForCatalog(t *testing.T, crc versioned.Interface, namespa
384391
CatalogSourceNamespace: testNamespace,
385392
Package: packageName,
386393
Channel: channel,
387-
StartingCSV: startingCSV,
394+
StartingCSV: startingCSV,
388395
InstallPlanApproval: approval,
389396
},
390397
}
@@ -521,7 +528,7 @@ func TestSusbcriptionWithStartingCSV(t *testing.T) {
521528
namedStrategy := newNginxInstallStrategy(genName("dep-"), nil, nil)
522529
csvA := newCSV("nginx-a", testNamespace, "", *semver.New("0.1.0"), []apiextensions.CustomResourceDefinition{crd}, nil, namedStrategy)
523530
csvB := newCSV("nginx-b", testNamespace, "nginx-a", *semver.New("0.2.0"), []apiextensions.CustomResourceDefinition{crd}, nil, namedStrategy)
524-
531+
525532
// Create PackageManifests
526533
manifests := []registry.PackageManifest{
527534
{
@@ -565,7 +572,7 @@ func TestSusbcriptionWithStartingCSV(t *testing.T) {
565572
for _, s := range fetchedInstallPlan.Status.Plan {
566573
require.Equal(t, csvA.GetName(), s.Resolving, "unexpected resolution found")
567574
require.Equal(t, v1alpha1.StepStatusUnknown, s.Status, "status should be unknown")
568-
require.Equal(t, catalogSourceName, s.Resource.CatalogSource, "incorrect catalogsource on step resource")
575+
require.Equal(t, catalogSourceName, s.Resource.CatalogSource, "incorrect catalogsource on step resource")
569576
switch kind := s.Resource.Kind; kind {
570577
case v1alpha1.ClusterServiceVersionKind:
571578
require.Equal(t, csvA.GetName(), s.Resource.Name, "unexpected csv found")

test/e2e/util_test.go

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package e2e
33
import (
44
"bytes"
55
"context"
6+
"encoding/json"
67
"fmt"
78
"strings"
89
"testing"
910
"time"
10-
"encoding/json"
1111

1212
"github.com/ghodss/yaml"
1313
"github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1"
@@ -167,6 +167,22 @@ func waitForDelete(checkResource checkResourceFunc) error {
167167
return err
168168
}
169169

170+
func waitForEmptyList(checkList func() (int, error)) error {
171+
var err error
172+
err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
173+
count, err := checkList()
174+
if err != nil {
175+
return false, err
176+
}
177+
if count == 0 {
178+
return true, nil
179+
}
180+
return false, nil
181+
})
182+
183+
return err
184+
}
185+
170186
type catalogSourceCheckFunc func(*v1alpha1.CatalogSource) bool
171187

172188
// This check is disabled for most test runs, but can be enabled for verifying pod health if the e2e tests are running
@@ -252,6 +268,31 @@ func cleanupOLM(t *testing.T, namespace string) {
252268
// error: the server does not allow this method on the requested resource
253269
// Cleanup non persistent configmaps
254270
require.NoError(t, c.KubernetesInterface().CoreV1().Pods(namespace).DeleteCollection(deleteOptions, metav1.ListOptions{}))
271+
272+
var err error
273+
err = waitForEmptyList(func() (int, error) {
274+
res, err := crc.OperatorsV1alpha1().ClusterServiceVersions(namespace).List(metav1.ListOptions{FieldSelector: nonPersistentCSVFieldSelector})
275+
return len(res.Items), err
276+
})
277+
require.NoError(t, err)
278+
279+
err = waitForEmptyList(func() (int, error) {
280+
res, err := crc.OperatorsV1alpha1().InstallPlans(namespace).List(metav1.ListOptions{})
281+
return len(res.Items), err
282+
})
283+
require.NoError(t, err)
284+
285+
err = waitForEmptyList(func() (int, error) {
286+
res, err := crc.OperatorsV1alpha1().Subscriptions(namespace).List(metav1.ListOptions{})
287+
return len(res.Items), err
288+
})
289+
require.NoError(t, err)
290+
291+
err = waitForEmptyList(func() (int, error) {
292+
res, err := crc.OperatorsV1alpha1().CatalogSources(namespace).List(metav1.ListOptions{FieldSelector: nonPersistentCatalogsFieldSelector})
293+
return len(res.Items), err
294+
})
295+
require.NoError(t, err)
255296
}
256297

257298
func buildCatalogSourceCleanupFunc(t *testing.T, crc versioned.Interface, namespace string, catalogSource *v1alpha1.CatalogSource) cleanupFunc {

0 commit comments

Comments
 (0)