diff --git a/controllers/catalog_predicates.go b/controllers/catalog_predicates.go deleted file mode 100644 index b35d10d5b..000000000 --- a/controllers/catalog_predicates.go +++ /dev/null @@ -1,115 +0,0 @@ -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1" - operatorv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/reconcile" -) - -// Predicate for reconciling operators when available (i.e. ready) catalogsources on cluster change -type catalogReadyTransitionPredicate struct { - predicate.Funcs - catalogReady map[string]bool -} - -func newCatalogReadyTransitionPredicate() *catalogReadyTransitionPredicate { - return &catalogReadyTransitionPredicate{ - catalogReady: map[string]bool{}, - } -} - -func (c *catalogReadyTransitionPredicate) Create(e event.CreateEvent) bool { - fmt.Println("CreateEvent CatalogSource", e.Object.GetName()) - catalogReady, err := isCatalogReady(e.Object) - if err != nil { - fmt.Println(err) - return false - } - c.catalogReady[e.Object.GetName()] = catalogReady - return catalogReady -} - -func (c *catalogReadyTransitionPredicate) Update(e event.UpdateEvent) bool { - fmt.Println("UpdateEvent CatalogSource", e.ObjectOld.GetName(), e.ObjectNew.GetName()) - oldCatalogReady, err := isCatalogReady(e.ObjectOld) - if err != nil { - fmt.Println(err) - return false - } - - newCatalogReady, err := isCatalogReady(e.ObjectNew) - if err != nil { - fmt.Println(err) - return false - } - - c.catalogReady[e.ObjectNew.GetName()] = newCatalogReady - // TODO: determine if ready -> non-ready transition triggers reconcile with stale catalog contents - return oldCatalogReady != newCatalogReady -} - -func (c *catalogReadyTransitionPredicate) Delete(e event.DeleteEvent) bool { - fmt.Println("DeleteEvent CatalogSource", e.Object.GetName()) - delete(c.catalogReady, e.Object.GetName()) - return true -} - -func (c *catalogReadyTransitionPredicate) Generic(e event.GenericEvent) bool { - fmt.Println("GenericEvent CatalogSource", e.Object.GetName()) - catalogReady, err := isCatalogReady(e.Object) - if err != nil { - fmt.Println(err) - return false - } - predicateState := c.catalogReady[e.Object.GetName()] != catalogReady - c.catalogReady[e.Object.GetName()] = catalogReady - return predicateState -} - -func isCatalogReady(o client.Object) (bool, error) { - catalog, ok := o.(*catalogd.CatalogSource) - if !ok { - return false, fmt.Errorf("wrong object type: not a catalogsource: %+v", o) - } - if len(catalog.Status.Conditions) > 0 { - for _, cond := range catalog.Status.Conditions { - if cond.Type == catalogd.TypeReady && cond.Status == v1.ConditionTrue { - return true, nil - } - } - } - return false, nil -} - -// Generate reconcile requests for all operators affected by a catalog change -func operatorRequestsForCatalog(ctx context.Context, c client.Client, logger logr.Logger) handler.MapFunc { - return func(object client.Object) []reconcile.Request { - // no way of associating an operator to a catalog so create reconcile requests for everything - operators := operatorv1alpha1.OperatorList{} - err := c.List(ctx, &operators) - if err != nil { - logger.Error(err, "unable to enqueue operators for catalog reconcile") - return nil - } - var requests []reconcile.Request - for _, op := range operators.Items { - requests = append(requests, reconcile.Request{ - NamespacedName: types.NamespacedName{ - Namespace: op.GetNamespace(), - Name: op.GetName(), - }, - }) - } - return requests - } -} diff --git a/controllers/operator_controller.go b/controllers/operator_controller.go index 2b39398e2..b29d06bf5 100644 --- a/controllers/operator_controller.go +++ b/controllers/operator_controller.go @@ -20,9 +20,10 @@ import ( "context" "fmt" + "github.com/go-logr/logr" + operatorv1 "github.com/operator-framework/api/pkg/operators/v1" catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1" "github.com/operator-framework/deppy/pkg/deppy/solver" - "github.com/operator-framework/operator-controller/controllers/validators" rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1" "k8s.io/apimachinery/pkg/api/equality" apimeta "k8s.io/apimachinery/pkg/api/meta" @@ -33,12 +34,14 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/utils/pointer" ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" + "github.com/operator-framework/operator-controller/controllers/validators" + operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1" "github.com/operator-framework/operator-controller/internal/resolution" "github.com/operator-framework/operator-controller/internal/resolution/variable_sources/bundles_and_dependencies" @@ -299,8 +302,7 @@ func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error { err := ctrl.NewControllerManagedBy(mgr). For(&operatorsv1alpha1.Operator{}). Watches(source.NewKindWithCache(&catalogd.CatalogSource{}, mgr.GetCache()), - handler.EnqueueRequestsFromMapFunc(operatorRequestsForCatalog(context.TODO(), mgr.GetClient(), mgr.GetLogger())), - builder.WithPredicates(newCatalogReadyTransitionPredicate())). + handler.EnqueueRequestsFromMapFunc(operatorRequestsForCatalog(context.TODO(), mgr.GetClient(), mgr.GetLogger()))). Owns(&rukpakv1alpha1.BundleDeployment{}). Complete(r) @@ -407,3 +409,26 @@ func mapBDStatusToReadyCondition(existingBD *rukpakv1alpha1.BundleDeployment, ob func isBundleDepStale(bd *rukpakv1alpha1.BundleDeployment) bool { return bd != nil && bd.Status.ObservedGeneration != bd.GetGeneration() } + +// Generate reconcile requests for all operators affected by a catalog change +func operatorRequestsForCatalog(ctx context.Context, c client.Reader, logger logr.Logger) handler.MapFunc { + return func(object client.Object) []reconcile.Request { + // no way of associating an operator to a catalog so create reconcile requests for everything + operators := operatorv1.OperatorList{} + err := c.List(ctx, &operators) + if err != nil { + logger.Error(err, "unable to enqueue operators for catalog reconcile") + return nil + } + var requests []reconcile.Request + for _, op := range operators.Items { + requests = append(requests, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Namespace: op.GetNamespace(), + Name: op.GetName(), + }, + }) + } + return requests + } +} diff --git a/go.mod b/go.mod index 1ef55a2ea..c8d28c5aa 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.19 require ( github.com/blang/semver/v4 v4.0.0 - github.com/go-logr/logr v1.2.3 github.com/onsi/ginkgo/v2 v2.8.3 github.com/onsi/gomega v1.27.1 github.com/operator-framework/catalogd v0.1.3 @@ -27,6 +26,7 @@ require ( github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-air/gini v1.0.4 // indirect + github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/zapr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect