Skip to content

Commit c2819f4

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

File tree

6 files changed

+244
-103
lines changed

6 files changed

+244
-103
lines changed

cmd/manager/main.go

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

97-
if err = (&controllers.OperatorReconciler{
97+
if err = controllers.SetupWithManager(&controllers.OperatorReconciler{
9898
Client: mgr.GetClient(),
9999
Scheme: mgr.GetScheme(),
100100
Resolver: solver.NewDeppySolver(
101101
entitysources.NewCatalogdEntitySource(mgr.GetClient()),
102102
olm.NewOLMVariableSource(mgr.GetClient()),
103103
),
104-
}).SetupWithManager(mgr); err != nil {
104+
}, mgr); err != nil {
105105
setupLog.Error(err, "unable to create controller", "controller", "Operator")
106106
os.Exit(1)
107107
}

internal/controllers/catalog_test.go

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

internal/controllers/operator_controller.go

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

300300
// SetupWithManager sets up the controller with the Manager.
301-
func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
301+
func SetupWithManager(r reconcile.Reconciler, mgr ctrl.Manager) error {
302302
err := ctrl.NewControllerManagedBy(mgr).
303303
For(&operatorsv1alpha1.Operator{}).
304304
Watches(source.NewKindWithCache(&catalogd.Catalog{}, mgr.GetCache()),

internal/controllers/operator_controller_test.go

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@ 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/api/core/v1alpha1"
139
"github.com/operator-framework/deppy/pkg/deppy"
1410
"github.com/operator-framework/deppy/pkg/deppy/input"
1511
"github.com/operator-framework/deppy/pkg/deppy/solver"
@@ -22,7 +18,6 @@ import (
2218
ctrl "sigs.k8s.io/controller-runtime"
2319
"sigs.k8s.io/controller-runtime/pkg/client"
2420
"sigs.k8s.io/controller-runtime/pkg/client/fake"
25-
"sigs.k8s.io/controller-runtime/pkg/log"
2621

2722
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
2823
"github.com/operator-framework/operator-controller/internal/conditionsets"
@@ -1062,94 +1057,6 @@ var _ = Describe("Operator Controller Test", func() {
10621057
})
10631058
})
10641059
})
1065-
When("a catalog changes on cluster", func() {
1066-
var testLogs, opNames []string
1067-
var cancel context.CancelFunc
1068-
var logCount int
1069-
BeforeEach(func() {
1070-
l := funcr.New(func(prefix, args string) {
1071-
if prefix == "operator-controller" &&
1072-
strings.Contains(args, `"controller"="operator"`) &&
1073-
strings.Contains(args, `"msg"="ending"`) {
1074-
// filter for only relevant logs
1075-
testLogs = append(testLogs, fmt.Sprintf("%s", args))
1076-
}
1077-
}, funcr.Options{Verbosity: 1})
1078-
mgr, err := ctrl.NewManager(cfg, ctrl.Options{Scheme: sch, Logger: l})
1079-
Expect(err).To(BeNil())
1080-
1081-
err = reconciler.SetupWithManager(mgr)
1082-
Expect(err).To(BeNil())
1083-
var mgrCtx context.Context
1084-
mgrCtx, cancel = context.WithCancel(log.IntoContext(ctx, l))
1085-
1086-
go func() {
1087-
err := mgr.Start(mgrCtx)
1088-
Expect(err).To(BeNil())
1089-
}()
1090-
1091-
opNames = []string{"prometheus", "project-quay"}
1092-
for _, p := range opNames {
1093-
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
1094-
err := cl.Create(ctx, op)
1095-
Expect(err).To(BeNil())
1096-
}
1097-
Eventually(func(g Gomega) {
1098-
By("verifying initial reconcile logs for operator creation")
1099-
g.Expect(len(testLogs) >= len(opNames)).To(BeTrue())
1100-
for _, p := range opNames {
1101-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1102-
}
1103-
logCount = len(testLogs)
1104-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1105-
})
1106-
1107-
It("reconciles all affected operators on cluster", func() {
1108-
By("creating a new catalog")
1109-
catalog := &catalogd.Catalog{ObjectMeta: metav1.ObjectMeta{Name: "t"}, Spec: catalogd.CatalogSpec{Source: catalogd.CatalogSource{Type: catalogd.SourceTypeImage, Image: &catalogd.ImageSource{}}}}
1110-
err := cl.Create(ctx, catalog)
1111-
Expect(err).To(BeNil())
1112-
Eventually(func(g Gomega) {
1113-
By("verifying operator reconcile logs on catalog create")
1114-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1115-
for _, p := range opNames {
1116-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1117-
}
1118-
logCount = len(testLogs)
1119-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1120-
1121-
By("updating a catalog")
1122-
catalog.Spec.Source.Image.Ref = "s"
1123-
err = cl.Update(ctx, catalog)
1124-
Expect(err).To(BeNil())
1125-
Eventually(func(g Gomega) {
1126-
By("verifying operator reconcile logs on catalog update")
1127-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1128-
for _, p := range opNames {
1129-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1130-
}
1131-
logCount = len(testLogs)
1132-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1133-
1134-
By("deleting a catalog")
1135-
err = cl.Delete(ctx, catalog)
1136-
Expect(err).To(BeNil())
1137-
Eventually(func(g Gomega) {
1138-
By("verifying operator reconcile logs on catalog delete")
1139-
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
1140-
for _, p := range opNames {
1141-
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
1142-
}
1143-
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
1144-
})
1145-
AfterEach(func() {
1146-
for _, p := range opNames {
1147-
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
1148-
Expect(cl.Delete(ctx, op)).To(BeNil())
1149-
}
1150-
cancel() // stop manager
1151-
})
1152-
})
11531060
})
11541061

11551062
func verifyInvariants(ctx context.Context, c client.Client, op *operatorsv1alpha1.Operator) {
@@ -1188,12 +1095,6 @@ var testEntitySource = input.NewCacheQuerier(map[deppy.Identifier]input.Entity{
11881095
"olm.package": `{"packageName":"prometheus","version":"0.47.0"}`,
11891096
"olm.gvk": `[]`,
11901097
}),
1191-
"operatorhub/project-quay/3.8.3": *input.NewEntity("operatorhub/project-quay/3.8.3", map[string]string{
1192-
"olm.bundle.path": `"quay.io/openshift-community-operators/project-quay@sha256:4f5698b5fec2e5f9a4df78b5ef9609b3a697c81cdb137b98e82e79104f0eb3b5"`,
1193-
"olm.channel": `{"channelName":"stable","priority":0}`,
1194-
"olm.package": `{"packageName":"project-quay","version":"3.8.3"}`,
1195-
"olm.gvk": `[]`,
1196-
}),
11971098
"operatorhub/badimage/0.1.0": *input.NewEntity("operatorhub/badimage/0.1.0", map[string]string{
11981099
"olm.bundle.path": `{"name": "quay.io/operatorhubio/badimage:v0.1.0"}`,
11991100
"olm.package": `{"packageName":"badimage","version":"0.1.0"}`,

internal/controllers/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323

2424
. "github.com/onsi/ginkgo/v2"
2525
. "github.com/onsi/gomega"
26-
catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1"
26+
catalogd "github.com/operator-framework/catalogd/api/core/v1alpha1"
2727
rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1"
2828
"k8s.io/apimachinery/pkg/api/meta"
2929
"k8s.io/apimachinery/pkg/runtime"

0 commit comments

Comments
 (0)