Skip to content

Commit 5ed9ee9

Browse files
committed
Add tests for GC assumptions.
The ClusterRoles that OLM creates per provided API now have owner references to their respective CRD or APIService instead of owner labels to a providing OperatorGroup. These tests verify that the Kubernetes garbage collector behaves as expected.
1 parent 915c118 commit 5ed9ee9

File tree

4 files changed

+139
-6
lines changed

4 files changed

+139
-6
lines changed

test/e2e/convert_suite_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package e2e
22

33
import (
44
"flag"
5-
v1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1"
6-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
75
"testing"
8-
9-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client"
6+
"time"
107

118
. "github.com/onsi/ginkgo"
129
. "github.com/onsi/gomega"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
12+
v1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1"
13+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client"
1314
)
1415

1516
var (
@@ -39,6 +40,8 @@ var (
3940

4041
func TestConvert(t *testing.T) {
4142
RegisterFailHandler(Fail)
43+
SetDefaultEventuallyTimeout(1 * time.Minute)
44+
SetDefaultEventuallyPollingInterval(1 * time.Second)
4245
RunSpecs(t, "Convert Suite")
4346
}
4447

test/e2e/dsl/dsl.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dsl
2+
3+
import (
4+
"fmt"
5+
6+
. "github.com/onsi/ginkgo"
7+
)
8+
9+
// IgnoreError acknowledges that an error value is being intentionally
10+
// disregarded.
11+
//
12+
// In general, errors should not be ignored, however, errors may be
13+
// unimportant in certain test scenarios. IgnoreError accepts a
14+
// variable-length argument list, like Expect(), as a convenience for
15+
// functions returning values and an error, e.g. `func DoSomething()
16+
// (string, error)`. IgnoreError will fail the current test if the
17+
// last argument is neither nil nor a non-nil error.
18+
func IgnoreError(vals ...interface{}) {
19+
if len(vals) == 0 {
20+
return
21+
}
22+
err := vals[len(vals)-1]
23+
if err == nil {
24+
return
25+
}
26+
if _, ok := err.(error); ok {
27+
return
28+
}
29+
Fail(fmt.Sprintf("the last argument to IgnoreError must be an error, but it was %T", err))
30+
}

test/e2e/gc_e2e_test.go

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,115 @@
11
package e2e
22

33
import (
4+
"fmt"
5+
46
"github.com/blang/semver"
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
59
"github.com/stretchr/testify/require"
610
corev1 "k8s.io/api/core/v1"
11+
rbacv1 "k8s.io/api/rbac/v1"
12+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
713
k8serrors "k8s.io/apimachinery/pkg/api/errors"
814
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
"k8s.io/apimachinery/pkg/util/rand"
16+
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
917

10-
. "github.com/onsi/ginkgo"
1118
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
19+
. "github.com/operator-framework/operator-lifecycle-manager/test/e2e/dsl"
1220
)
1321

14-
var _ = Describe("Garbage Collection", func() {
22+
var _ = Describe("Garbage collector", func() {
23+
It("should delete a ClusterRole owned by a CustomResourceDefinition when the owner is deleted", func() {
24+
c := newKubeClient(GinkgoT())
25+
26+
group := fmt.Sprintf("%s.com", rand.String(16))
27+
crd, err := c.ApiextensionsV1beta1Interface().ApiextensionsV1().CustomResourceDefinitions().Create(&apiextensionsv1.CustomResourceDefinition{
28+
ObjectMeta: metav1.ObjectMeta{
29+
Name: fmt.Sprintf("plural.%s", group),
30+
},
31+
Spec: apiextensionsv1.CustomResourceDefinitionSpec{
32+
Group: group,
33+
Scope: apiextensionsv1.ClusterScoped,
34+
Versions: []apiextensionsv1.CustomResourceDefinitionVersion{
35+
apiextensionsv1.CustomResourceDefinitionVersion{
36+
Name: "v1",
37+
Served: true,
38+
Storage: true,
39+
Schema: &apiextensionsv1.CustomResourceValidation{
40+
&apiextensionsv1.JSONSchemaProps{Type: "object"},
41+
},
42+
},
43+
},
44+
Names: apiextensionsv1.CustomResourceDefinitionNames{
45+
Plural: "plural",
46+
Singular: "singular",
47+
Kind: "Kind",
48+
ListKind: "KindList",
49+
},
50+
},
51+
})
52+
Expect(err).NotTo(HaveOccurred())
53+
defer func() {
54+
IgnoreError(c.ApiextensionsV1beta1Interface().ApiextensionsV1().CustomResourceDefinitions().Delete(crd.GetName(), &metav1.DeleteOptions{}))
55+
}()
56+
57+
cr, err := c.CreateClusterRole(&rbacv1.ClusterRole{
58+
ObjectMeta: metav1.ObjectMeta{
59+
GenerateName: "clusterrole-",
60+
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(crd)},
61+
},
62+
})
63+
Expect(err).NotTo(HaveOccurred())
64+
defer func() {
65+
IgnoreError(c.DeleteClusterRole(cr.GetName(), &metav1.DeleteOptions{}))
66+
}()
67+
68+
Expect(c.ApiextensionsV1beta1Interface().ApiextensionsV1().CustomResourceDefinitions().Delete(crd.GetName(), &metav1.DeleteOptions{})).To(Succeed())
69+
Eventually(func() bool {
70+
_, err := c.GetClusterRole(cr.GetName())
71+
return k8serrors.IsNotFound(err)
72+
}).Should(BeTrue(), "get cluster role should eventually return \"not found\"")
73+
})
74+
75+
It("should delete a ClusterRole owned by an APIService when the owner is deleted", func() {
76+
c := newKubeClient(GinkgoT())
77+
78+
group := rand.String(16)
79+
as, err := c.CreateAPIService(&apiregistrationv1.APIService{
80+
ObjectMeta: metav1.ObjectMeta{
81+
Name: fmt.Sprintf("v1.%s", group),
82+
},
83+
Spec: apiregistrationv1.APIServiceSpec{
84+
Group: group,
85+
Version: "v1",
86+
GroupPriorityMinimum: 1,
87+
VersionPriority: 1,
88+
},
89+
})
90+
Expect(err).NotTo(HaveOccurred())
91+
defer func() {
92+
IgnoreError(c.DeleteAPIService(as.GetName(), &metav1.DeleteOptions{}))
93+
}()
94+
95+
cr, err := c.CreateClusterRole(&rbacv1.ClusterRole{
96+
ObjectMeta: metav1.ObjectMeta{
97+
GenerateName: "clusterrole-",
98+
OwnerReferences: []metav1.OwnerReference{ownerutil.NonBlockingOwner(as)},
99+
},
100+
})
101+
Expect(err).NotTo(HaveOccurred())
102+
defer func() {
103+
IgnoreError(c.DeleteClusterRole(cr.GetName(), &metav1.DeleteOptions{}))
104+
}()
105+
106+
Expect(c.DeleteAPIService(as.GetName(), &metav1.DeleteOptions{})).To(Succeed())
107+
Eventually(func() bool {
108+
_, err := c.GetClusterRole(cr.GetName())
109+
return k8serrors.IsNotFound(err)
110+
}).Should(BeTrue(), "get cluster role should eventually return \"not found\"")
111+
})
112+
15113
It("owner reference GC behavior", func() {
16114

17115
// TestOwnerReferenceGCBehavior runs a simple check on OwnerReference behavior to ensure

vendor/github.com/onsi/gomega/go.mod

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)