Skip to content

Commit d17f42c

Browse files
Merge pull request #1411 from benluddy/clusterscoped-gc-tests
Add tests for GC assumptions.
2 parents 915c118 + 5ed9ee9 commit d17f42c

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)