Skip to content

Commit f93ddb6

Browse files
committed
fake reconciler for catalog sync tests
Signed-off-by: Ankita Thomas <[email protected]>
1 parent e8738fb commit f93ddb6

File tree

5 files changed

+289
-106
lines changed

5 files changed

+289
-106
lines changed

cmd/manager/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ func main() {
9393
os.Exit(1)
9494
}
9595

96-
if err = (&controllers.OperatorReconciler{
96+
if err = controllers.SetupWithManager(&controllers.OperatorReconciler{
9797
Client: mgr.GetClient(),
9898
Scheme: mgr.GetScheme(),
9999
Resolver: resolution.NewOperatorResolver(mgr.GetClient(), entitysources.NewCatalogdEntitySource(mgr.GetClient())),
100-
}).SetupWithManager(mgr); err != nil {
100+
}, mgr); err != nil {
101101
setupLog.Error(err, "unable to create controller", "controller", "Operator")
102102
os.Exit(1)
103103
}

internal/controllers/catalog_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package controllers_test
2+
3+
import (
4+
"context"
5+
"strings"
6+
7+
. "github.com/onsi/ginkgo/v2"
8+
. "github.com/onsi/gomega"
9+
"github.com/operator-framework/operator-controller/internal/controllers"
10+
11+
catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1"
12+
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
ctrl "sigs.k8s.io/controller-runtime"
15+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
16+
)
17+
18+
var _ = Describe("SetupWithManager", func() {
19+
When("catalog events occur", func() {
20+
var cancel context.CancelFunc
21+
var ctx context.Context
22+
var opNames = []string{"prometheus", "project-quay"}
23+
var reqChan = make(chan string, 4*len(opNames))
24+
BeforeEach(func() {
25+
ctx = context.Background()
26+
mgr, err := ctrl.NewManager(cfg, ctrl.Options{Scheme: sch})
27+
Expect(err).To(BeNil())
28+
29+
var fakeReconciler reconcile.Func = func(_ context.Context, request ctrl.Request) (ctrl.Result, error) {
30+
// ignore reconcile requests from other tests
31+
if !strings.HasPrefix(request.Name, "operator-test") {
32+
reqChan <- request.Name
33+
}
34+
return ctrl.Result{}, nil
35+
}
36+
37+
err = controllers.SetupWithManager(fakeReconciler, mgr)
38+
Expect(err).To(BeNil())
39+
40+
var mgrCtx context.Context
41+
mgrCtx, cancel = context.WithCancel(ctx)
42+
43+
go func() {
44+
err := mgr.Start(mgrCtx)
45+
Expect(err).To(BeNil())
46+
}()
47+
48+
for _, p := range opNames {
49+
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
50+
err := cl.Create(ctx, op)
51+
Expect(err).To(BeNil())
52+
}
53+
By("verifying initial reconcile logs for operator creation")
54+
var reqNames []string
55+
for range opNames {
56+
var req string
57+
Eventually(reqChan).Should(Receive(&req))
58+
reqNames = append(reqNames, req)
59+
}
60+
Expect(reqNames).To(ConsistOf(opNames))
61+
})
62+
It("reconciles all affected operators on cluster", func() {
63+
By("creating a new catalog")
64+
catalog := &catalogd.Catalog{ObjectMeta: metav1.ObjectMeta{Name: "t"}, Spec: catalogd.CatalogSpec{Source: catalogd.CatalogSource{Type: catalogd.SourceTypeImage, Image: &catalogd.ImageSource{}}}}
65+
err := cl.Create(ctx, catalog)
66+
Expect(err).To(BeNil())
67+
By("verifying operator reconcile logs on catalog create")
68+
var reqNames []string
69+
for range opNames {
70+
var req string
71+
Eventually(reqChan).Should(Receive(&req))
72+
reqNames = append(reqNames, req)
73+
}
74+
Expect(reqNames).To(ConsistOf(opNames))
75+
76+
By("updating a catalog")
77+
catalog.Spec.Source.Image.Ref = "s"
78+
err = cl.Update(ctx, catalog)
79+
Expect(err).To(BeNil())
80+
By("verifying operator reconcile logs on catalog update")
81+
reqNames = []string{}
82+
for range opNames {
83+
var req string
84+
Eventually(reqChan).Should(Receive(&req))
85+
reqNames = append(reqNames, req)
86+
}
87+
Expect(reqNames).To(ConsistOf(opNames))
88+
89+
By("deleting a catalog")
90+
err = cl.Delete(ctx, catalog)
91+
Expect(err).To(BeNil())
92+
By("verifying operator reconcile logs on catalog delete")
93+
reqNames = []string{}
94+
for range opNames {
95+
var req string
96+
Eventually(reqChan).Should(Receive(&req))
97+
reqNames = append(reqNames, req)
98+
}
99+
Expect(reqNames).To(ConsistOf(opNames))
100+
})
101+
AfterEach(func() {
102+
for _, p := range opNames {
103+
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
104+
Expect(cl.Delete(ctx, op)).To(Succeed())
105+
}
106+
cancel() // stop manager
107+
})
108+
})
109+
})

internal/controllers/operator_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ func (r *OperatorReconciler) generateExpectedBundleDeployment(o operatorsv1alpha
289289
}
290290

291291
// SetupWithManager sets up the controller with the Manager.
292-
func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
292+
func SetupWithManager(r reconcile.Reconciler, mgr ctrl.Manager) error {
293293
err := ctrl.NewControllerManagedBy(mgr).
294294
For(&operatorsv1alpha1.Operator{}).
295295
Watches(source.NewKindWithCache(&catalogd.Catalog{}, mgr.GetCache()),

internal/controllers/operator_controller_test.go

Lines changed: 5 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,11 @@ package controllers_test
33
import (
44
"context"
55
"fmt"
6-
"strings"
7-
"time"
86

9-
"github.com/go-logr/logr/funcr"
107
. "github.com/onsi/ginkgo/v2"
118
. "github.com/onsi/gomega"
12-
catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1"
139
"github.com/operator-framework/deppy/pkg/deppy"
1410
"github.com/operator-framework/deppy/pkg/deppy/input"
15-
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
16-
"github.com/operator-framework/operator-controller/internal/conditionsets"
17-
"github.com/operator-framework/operator-controller/internal/controllers"
18-
"github.com/operator-framework/operator-controller/internal/resolution"
1911
rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1"
2012
apimeta "k8s.io/apimachinery/pkg/api/meta"
2113
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -25,7 +17,11 @@ import (
2517
ctrl "sigs.k8s.io/controller-runtime"
2618
"sigs.k8s.io/controller-runtime/pkg/client"
2719
"sigs.k8s.io/controller-runtime/pkg/client/fake"
28-
"sigs.k8s.io/controller-runtime/pkg/log"
20+
21+
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
22+
"github.com/operator-framework/operator-controller/internal/conditionsets"
23+
"github.com/operator-framework/operator-controller/internal/controllers"
24+
"github.com/operator-framework/operator-controller/internal/resolution"
2925
)
3026

3127
var _ = Describe("Operator Controller Test", func() {
@@ -1022,94 +1018,6 @@ var _ = Describe("Operator Controller Test", func() {
10221018
Expect(cond.Message).To(Equal("installation has not been attempted as spec is invalid"))
10231019
})
10241020
})
1025-
When("a catalog changes on cluster", func() {
1026-
var testLogs, opNames []string
1027-
var cancel context.CancelFunc
1028-
var logCount int
1029-
BeforeEach(func() {
1030-
l := funcr.New(func(prefix, args string) {
1031-
if prefix == "operator-controller" &&
1032-
strings.Contains(args, `"controller"="operator"`) &&
1033-
strings.Contains(args, `"msg"="ending"`) {
1034-
// filter for only relevant logs
1035-
testLogs = append(testLogs, fmt.Sprintf("%s", args))
1036-
}
1037-
}, funcr.Options{Verbosity: 1})
1038-
mgr, err := ctrl.NewManager(cfg, ctrl.Options{Scheme: sch, Logger: l})
1039-
Expect(err).To(BeNil())
1040-
1041-
err = reconciler.SetupWithManager(mgr)
1042-
Expect(err).To(BeNil())
1043-
var mgrCtx context.Context
1044-
mgrCtx, cancel = context.WithCancel(log.IntoContext(ctx, l))
1045-
1046-
go func() {
1047-
err := mgr.Start(mgrCtx)
1048-
Expect(err).To(BeNil())
1049-
}()
1050-
1051-
opNames = []string{"prometheus", "project-quay"}
1052-
for _, p := range opNames {
1053-
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
1054-
err := cl.Create(ctx, op)
1055-
Expect(err).To(BeNil())
1056-
}
1057-
Eventually(func(g Gomega) {
1058-
By("verifying initial reconcile logs for operator creation")
1059-
g.Expect(len(testLogs) >= len(opNames)).To(BeTrue())
1060-
for _, p := range opNames {
1061-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1062-
}
1063-
logCount = len(testLogs)
1064-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1065-
})
1066-
1067-
It("reconciles all affected operators on cluster", func() {
1068-
By("creating a new catalog")
1069-
catalog := &catalogd.Catalog{ObjectMeta: metav1.ObjectMeta{Name: "t"}, Spec: catalogd.CatalogSpec{Source: catalogd.CatalogSource{Type: catalogd.SourceTypeImage, Image: &catalogd.ImageSource{}}}}
1070-
err := cl.Create(ctx, catalog)
1071-
Expect(err).To(BeNil())
1072-
Eventually(func(g Gomega) {
1073-
By("verifying operator reconcile logs on catalog create")
1074-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1075-
for _, p := range opNames {
1076-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1077-
}
1078-
logCount = len(testLogs)
1079-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1080-
1081-
By("updating a catalog")
1082-
catalog.Spec.Source.Image.Ref = "s"
1083-
err = cl.Update(ctx, catalog)
1084-
Expect(err).To(BeNil())
1085-
Eventually(func(g Gomega) {
1086-
By("verifying operator reconcile logs on catalog update")
1087-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1088-
for _, p := range opNames {
1089-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1090-
}
1091-
logCount = len(testLogs)
1092-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1093-
1094-
By("deleting a catalog")
1095-
err = cl.Delete(ctx, catalog)
1096-
Expect(err).To(BeNil())
1097-
Eventually(func(g Gomega) {
1098-
By("verifying operator reconcile logs on catalog delete")
1099-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1100-
for _, p := range opNames {
1101-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1102-
}
1103-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1104-
})
1105-
AfterEach(func() {
1106-
for _, p := range opNames {
1107-
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
1108-
Expect(cl.Delete(ctx, op)).To(BeNil())
1109-
}
1110-
cancel() // stop manager
1111-
})
1112-
})
11131021
})
11141022

11151023
func verifyInvariants(ctx context.Context, op *operatorsv1alpha1.Operator) {
@@ -1148,12 +1056,6 @@ var testEntitySource = input.NewCacheQuerier(map[deppy.Identifier]input.Entity{
11481056
"olm.package": `{"packageName":"prometheus","version":"0.47.0"}`,
11491057
"olm.gvk": `[]`,
11501058
}),
1151-
"operatorhub/project-quay/3.8.3": *input.NewEntity("operatorhub/project-quay/3.8.3", map[string]string{
1152-
"olm.bundle.path": `"quay.io/openshift-community-operators/project-quay@sha256:4f5698b5fec2e5f9a4df78b5ef9609b3a697c81cdb137b98e82e79104f0eb3b5"`,
1153-
"olm.channel": `{"channelName":"stable","priority":0}`,
1154-
"olm.package": `{"packageName":"project-quay","version":"3.8.3"}`,
1155-
"olm.gvk": `[]`,
1156-
}),
11571059
"operatorhub/badimage/0.1.0": *input.NewEntity("operatorhub/badimage/0.1.0", map[string]string{
11581060
"olm.bundle.path": `{"name": "quay.io/operatorhubio/badimage:v0.1.0"}`,
11591061
"olm.package": `{"packageName":"badimage","version":"0.1.0"}`,

0 commit comments

Comments
 (0)