Skip to content

Commit

Permalink
fake reconciler for catalog sync tests
Browse files Browse the repository at this point in the history
Signed-off-by: Ankita Thomas <ankithom@redhat.com>
  • Loading branch information
ankitathomas committed Jun 9, 2023
1 parent 48b3c3f commit c2819f4
Show file tree
Hide file tree
Showing 6 changed files with 244 additions and 103 deletions.
4 changes: 2 additions & 2 deletions cmd/manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,14 @@ func main() {
os.Exit(1)
}

if err = (&controllers.OperatorReconciler{
if err = controllers.SetupWithManager(&controllers.OperatorReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Resolver: solver.NewDeppySolver(
entitysources.NewCatalogdEntitySource(mgr.GetClient()),
olm.NewOLMVariableSource(mgr.GetClient()),
),
}).SetupWithManager(mgr); err != nil {
}, mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Operator")
os.Exit(1)
}
Expand Down
106 changes: 106 additions & 0 deletions internal/controllers/catalog_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package controllers_test

import (
"context"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
catalogd "github.com/operator-framework/catalogd/api/core/v1alpha1"
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/controllers"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

func collectRequests(reqChan <-chan string) func() []string {
var reqNames []string
return func() []string {
select {
case req := <-reqChan:
reqNames = append(reqNames, req)
default:
}
return reqNames
}
}

func operatorForPackage(name, pkg string) *operatorsv1alpha1.Operator {
return &operatorsv1alpha1.Operator{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Spec: operatorsv1alpha1.OperatorSpec{
PackageName: pkg,
},
}
}

var _ = Describe("SetupWithManager", func() {
When("catalog events occur", func() {
var cancel context.CancelFunc
var ctx context.Context
var opNames []string
var reqChan chan string
BeforeEach(func() {
ctx = context.Background()
mgr, err := ctrl.NewManager(cfg, ctrl.Options{Scheme: sch})
Expect(err).To(BeNil())

opNames = []string{"prometheus", "project-quay"}
reqChan = make(chan string)
var fakeReconciler reconcile.Func = func(_ context.Context, request ctrl.Request) (ctrl.Result, error) {
reqChan <- request.Name
return ctrl.Result{}, nil
}
Expect(controllers.SetupWithManager(fakeReconciler, mgr)).To(Succeed())

var mgrCtx context.Context
mgrCtx, cancel = context.WithCancel(ctx)
go func() {
Expect(mgr.Start(mgrCtx)).To(Succeed())
}()

for _, p := range opNames {
Expect(cl.Create(ctx, operatorForPackage(p, p))).To(Succeed())
}
By("verifying initial reconcile logs for operator creation")
Eventually(collectRequests(reqChan)).Should(ConsistOf(opNames))
})
It("reconciles all affected operators on cluster", func() {
By("creating a new catalog")
catalog := &catalogd.Catalog{
ObjectMeta: metav1.ObjectMeta{
Name: "t",
},
Spec: catalogd.CatalogSpec{
Source: catalogd.CatalogSource{
Type: catalogd.SourceTypeImage,
Image: &catalogd.ImageSource{},
},
},
}
Expect(cl.Create(ctx, catalog)).To(Succeed())
By("verifying operator reconcile logs on catalog create")
Eventually(collectRequests(reqChan)).Should(ConsistOf(opNames))

By("updating a catalog")
catalog.Spec.Source.Image.Ref = "s"
Expect(cl.Update(ctx, catalog)).To(Succeed())
By("verifying operator reconcile logs on catalog update")
Eventually(collectRequests(reqChan)).Should(ConsistOf(opNames))

By("deleting a catalog")
Expect(cl.Delete(ctx, catalog)).To(Succeed())
By("verifying operator reconcile logs on catalog delete")
Eventually(collectRequests(reqChan)).Should(ConsistOf(opNames))
})
AfterEach(func() {
cancel() // stop manager
close(reqChan)
for _, p := range opNames {
Expect(cl.Delete(ctx, operatorForPackage(p, p))).To(Succeed())
}
})
})
})
2 changes: 1 addition & 1 deletion internal/controllers/operator_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ func (r *OperatorReconciler) generateExpectedBundleDeployment(o operatorsv1alpha
}

// SetupWithManager sets up the controller with the Manager.
func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
func SetupWithManager(r reconcile.Reconciler, mgr ctrl.Manager) error {
err := ctrl.NewControllerManagedBy(mgr).
For(&operatorsv1alpha1.Operator{}).
Watches(source.NewKindWithCache(&catalogd.Catalog{}, mgr.GetCache()),
Expand Down
99 changes: 0 additions & 99 deletions internal/controllers/operator_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@ package controllers_test
import (
"context"
"fmt"
"strings"
"time"

"github.com/go-logr/logr/funcr"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
catalogd "github.com/operator-framework/catalogd/api/core/v1alpha1"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"
"github.com/operator-framework/deppy/pkg/deppy/solver"
Expand All @@ -22,7 +18,6 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/log"

operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/conditionsets"
Expand Down Expand Up @@ -1062,94 +1057,6 @@ var _ = Describe("Operator Controller Test", func() {
})
})
})
When("a catalog changes on cluster", func() {
var testLogs, opNames []string
var cancel context.CancelFunc
var logCount int
BeforeEach(func() {
l := funcr.New(func(prefix, args string) {
if prefix == "operator-controller" &&
strings.Contains(args, `"controller"="operator"`) &&
strings.Contains(args, `"msg"="ending"`) {
// filter for only relevant logs
testLogs = append(testLogs, fmt.Sprintf("%s", args))
}
}, funcr.Options{Verbosity: 1})
mgr, err := ctrl.NewManager(cfg, ctrl.Options{Scheme: sch, Logger: l})
Expect(err).To(BeNil())

err = reconciler.SetupWithManager(mgr)
Expect(err).To(BeNil())
var mgrCtx context.Context
mgrCtx, cancel = context.WithCancel(log.IntoContext(ctx, l))

go func() {
err := mgr.Start(mgrCtx)
Expect(err).To(BeNil())
}()

opNames = []string{"prometheus", "project-quay"}
for _, p := range opNames {
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
err := cl.Create(ctx, op)
Expect(err).To(BeNil())
}
Eventually(func(g Gomega) {
By("verifying initial reconcile logs for operator creation")
g.Expect(len(testLogs) >= len(opNames)).To(BeTrue())
for _, p := range opNames {
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
}
logCount = len(testLogs)
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
})

It("reconciles all affected operators on cluster", func() {
By("creating a new catalog")
catalog := &catalogd.Catalog{ObjectMeta: metav1.ObjectMeta{Name: "t"}, Spec: catalogd.CatalogSpec{Source: catalogd.CatalogSource{Type: catalogd.SourceTypeImage, Image: &catalogd.ImageSource{}}}}
err := cl.Create(ctx, catalog)
Expect(err).To(BeNil())
Eventually(func(g Gomega) {
By("verifying operator reconcile logs on catalog create")
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
for _, p := range opNames {
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
}
logCount = len(testLogs)
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())

By("updating a catalog")
catalog.Spec.Source.Image.Ref = "s"
err = cl.Update(ctx, catalog)
Expect(err).To(BeNil())
Eventually(func(g Gomega) {
By("verifying operator reconcile logs on catalog update")
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
for _, p := range opNames {
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
}
logCount = len(testLogs)
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())

By("deleting a catalog")
err = cl.Delete(ctx, catalog)
Expect(err).To(BeNil())
Eventually(func(g Gomega) {
By("verifying operator reconcile logs on catalog delete")
g.Expect(testLogs).To(HaveLen(logCount + len(opNames)))
for _, p := range opNames {
g.Expect(testLogs[len(testLogs)-len(opNames):]).To(ContainElement(ContainSubstring(fmt.Sprintf("\"Operator\"={\"name\":\"%s\"}", p))))
}
}).WithTimeout(2 * time.Second).WithPolling(1 * time.Second).Should(Succeed())
})
AfterEach(func() {
for _, p := range opNames {
op := &operatorsv1alpha1.Operator{ObjectMeta: metav1.ObjectMeta{Name: p}, Spec: operatorsv1alpha1.OperatorSpec{PackageName: p}}
Expect(cl.Delete(ctx, op)).To(BeNil())
}
cancel() // stop manager
})
})
})

func verifyInvariants(ctx context.Context, c client.Client, op *operatorsv1alpha1.Operator) {
Expand Down Expand Up @@ -1188,12 +1095,6 @@ var testEntitySource = input.NewCacheQuerier(map[deppy.Identifier]input.Entity{
"olm.package": `{"packageName":"prometheus","version":"0.47.0"}`,
"olm.gvk": `[]`,
}),
"operatorhub/project-quay/3.8.3": *input.NewEntity("operatorhub/project-quay/3.8.3", map[string]string{
"olm.bundle.path": `"quay.io/openshift-community-operators/project-quay@sha256:4f5698b5fec2e5f9a4df78b5ef9609b3a697c81cdb137b98e82e79104f0eb3b5"`,
"olm.channel": `{"channelName":"stable","priority":0}`,
"olm.package": `{"packageName":"project-quay","version":"3.8.3"}`,
"olm.gvk": `[]`,
}),
"operatorhub/badimage/0.1.0": *input.NewEntity("operatorhub/badimage/0.1.0", map[string]string{
"olm.bundle.path": `{"name": "quay.io/operatorhubio/badimage:v0.1.0"}`,
"olm.package": `{"packageName":"badimage","version":"0.1.0"}`,
Expand Down
2 changes: 1 addition & 1 deletion internal/controllers/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1"
catalogd "github.com/operator-framework/catalogd/api/core/v1alpha1"
rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime"
Expand Down
Loading

0 comments on commit c2819f4

Please sign in to comment.