Skip to content

Commit 38247ae

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

File tree

5 files changed

+277
-106
lines changed

5 files changed

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

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)