Skip to content

Commit 4de10c9

Browse files
[release-1.3] only reconcile triggers that point to the MTChannelBroker class (knative#6268)
* only reconcile triggers that point to the mtbroker class * make sure to also filter on election change, via PromoteFilterFunc Co-authored-by: Scott Nichols <[email protected]>
1 parent 2f2a825 commit 4de10c9

File tree

3 files changed

+125
-24
lines changed

3 files changed

+125
-24
lines changed

pkg/reconciler/broker/trigger/controller.go

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ import (
2222
"go.uber.org/zap"
2323
"k8s.io/apimachinery/pkg/labels"
2424
"k8s.io/client-go/tools/cache"
25-
"knative.dev/eventing/pkg/apis/eventing"
26-
eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
25+
apiseventing "knative.dev/eventing/pkg/apis/eventing"
26+
eventing "knative.dev/eventing/pkg/apis/eventing/v1"
2727
eventingclient "knative.dev/eventing/pkg/client/injection/client"
2828
brokerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/broker"
2929
triggerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/trigger"
3030
subscriptioninformer "knative.dev/eventing/pkg/client/injection/informers/messaging/v1/subscription"
3131
brokerreconciler "knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/broker"
3232
triggerreconciler "knative.dev/eventing/pkg/client/injection/reconciler/eventing/v1/trigger"
33-
v1 "knative.dev/eventing/pkg/client/listers/eventing/v1"
33+
eventinglisters "knative.dev/eventing/pkg/client/listers/eventing/v1"
3434
"knative.dev/eventing/pkg/duck"
3535
"knative.dev/pkg/client/injection/ducks/duck/v1/source"
3636
configmapinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap"
@@ -63,20 +63,27 @@ func NewController(
6363
triggerLister: triggerLister,
6464
configmapLister: configmapInformer.Lister(),
6565
}
66-
impl := triggerreconciler.NewImpl(ctx, r)
66+
impl := triggerreconciler.NewImpl(ctx, r, func(impl *controller.Impl) controller.Options {
67+
return controller.Options{
68+
PromoteFilterFunc: filterTriggers(r.brokerLister),
69+
}
70+
})
6771
r.impl = impl
6872

6973
r.sourceTracker = duck.NewListableTrackerFromTracker(ctx, source.Get, impl.Tracker)
7074
r.uriResolver = resolver.NewURIResolverFromTracker(ctx, impl.Tracker)
7175

72-
triggerInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
76+
triggerInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
77+
FilterFunc: filterTriggers(r.brokerLister),
78+
Handler: controller.HandleAll(impl.Enqueue),
79+
})
7380

7481
// Filter Brokers and enqueue associated Triggers
75-
brokerFilter := pkgreconciler.AnnotationFilterFunc(brokerreconciler.ClassAnnotationKey, eventing.MTChannelBrokerClassValue, false /*allowUnset*/)
82+
brokerFilter := pkgreconciler.AnnotationFilterFunc(brokerreconciler.ClassAnnotationKey, apiseventing.MTChannelBrokerClassValue, false /*allowUnset*/)
7683
brokerInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
7784
FilterFunc: brokerFilter,
7885
Handler: controller.HandleAll(func(obj interface{}) {
79-
if broker, ok := obj.(*eventingv1.Broker); ok {
86+
if broker, ok := obj.(*eventing.Broker); ok {
8087
for _, t := range getTriggersForBroker(logger, triggerLister, broker) {
8188
impl.Enqueue(t)
8289
}
@@ -86,20 +93,39 @@ func NewController(
8693

8794
// Reconcile Trigger when my Subscription changes
8895
subscriptionInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
89-
FilterFunc: controller.FilterController(&eventingv1.Trigger{}),
96+
FilterFunc: controller.FilterController(&eventing.Trigger{}),
9097
Handler: controller.HandleAll(impl.EnqueueControllerOf),
9198
})
9299

93100
return impl
94101
}
95102

103+
// filterTriggers returns a function that returns true if the resource passed
104+
// is a trigger pointing to a MTChannelBroker.
105+
func filterTriggers(lister eventinglisters.BrokerLister) func(interface{}) bool {
106+
return func(obj interface{}) bool {
107+
trigger, ok := obj.(*eventing.Trigger)
108+
if !ok {
109+
return false
110+
}
111+
112+
b, err := lister.Brokers(trigger.Namespace).Get(trigger.Spec.Broker)
113+
if err != nil {
114+
return false
115+
}
116+
117+
value, ok := b.GetAnnotations()[apiseventing.BrokerClassKey]
118+
return ok && value == apiseventing.MTChannelBrokerClassValue
119+
}
120+
}
121+
96122
// getTriggersForBroker makes sure the object passed in is a Broker, and gets all
97123
// the Triggers belonging to it. As there is no way to return failures in the
98124
// Informers EventHandler, errors are logged, and an empty array is returned in case
99125
// of failures.
100-
func getTriggersForBroker(logger *zap.SugaredLogger, triggerLister v1.TriggerLister, broker *eventingv1.Broker) []*eventingv1.Trigger {
101-
r := make([]*eventingv1.Trigger, 0)
102-
selector := labels.SelectorFromSet(map[string]string{eventing.BrokerLabelKey: broker.Name})
126+
func getTriggersForBroker(logger *zap.SugaredLogger, triggerLister eventinglisters.TriggerLister, broker *eventing.Broker) []*eventing.Trigger {
127+
r := make([]*eventing.Trigger, 0)
128+
selector := labels.SelectorFromSet(map[string]string{apiseventing.BrokerLabelKey: broker.Name})
103129
triggers, err := triggerLister.Triggers(broker.Namespace).List(selector)
104130
if err != nil {
105131
logger.Warn("Failed to list triggers", zap.Any("broker", broker), zap.Error(err))

pkg/reconciler/broker/trigger/controller_test.go

Lines changed: 88 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,18 @@ import (
2020
"fmt"
2121
"testing"
2222

23+
"github.com/stretchr/testify/assert"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2325
"k8s.io/apimachinery/pkg/labels"
24-
v1 "knative.dev/eventing/pkg/apis/eventing/v1"
25-
v1lister "knative.dev/eventing/pkg/client/listers/eventing/v1"
26-
2726
"k8s.io/apimachinery/pkg/runtime"
28-
27+
apiseventing "knative.dev/eventing/pkg/apis/eventing"
28+
eventing "knative.dev/eventing/pkg/apis/eventing/v1"
29+
brokerinformer "knative.dev/eventing/pkg/client/injection/informers/eventing/v1/broker"
30+
v1lister "knative.dev/eventing/pkg/client/listers/eventing/v1"
2931
testingv1 "knative.dev/eventing/pkg/reconciler/testing/v1"
3032
"knative.dev/pkg/configmap"
3133
logtesting "knative.dev/pkg/logging/testing"
34+
3235
. "knative.dev/pkg/reconciler/testing"
3336

3437
// Fake injection informers
@@ -49,6 +52,84 @@ func TestNew(t *testing.T) {
4952
}
5053
}
5154

55+
func TestFilterTriggers(t *testing.T) {
56+
ctx, _ := SetupFakeContext(t)
57+
58+
tt := []struct {
59+
name string
60+
trigger interface{}
61+
pass bool
62+
brokers []*eventing.Broker
63+
}{{
64+
name: "unknown type",
65+
trigger: &eventing.Broker{},
66+
pass: false,
67+
}, {
68+
name: "non matching broker",
69+
trigger: &eventing.Trigger{
70+
Spec: eventing.TriggerSpec{
71+
Broker: "does-not-exists",
72+
},
73+
},
74+
pass: false,
75+
}, {
76+
name: "exiting matching broker",
77+
trigger: &eventing.Trigger{
78+
ObjectMeta: metav1.ObjectMeta{
79+
Namespace: "ns",
80+
Name: "tr",
81+
},
82+
Spec: eventing.TriggerSpec{
83+
Broker: "br",
84+
},
85+
},
86+
brokers: []*eventing.Broker{{
87+
ObjectMeta: metav1.ObjectMeta{
88+
Namespace: "ns",
89+
Name: "br",
90+
Annotations: map[string]string{
91+
eventing.BrokerClassAnnotationKey: apiseventing.MTChannelBrokerClassValue,
92+
},
93+
},
94+
}},
95+
pass: true,
96+
}, {
97+
name: "exiting non matching broker",
98+
trigger: &eventing.Trigger{
99+
ObjectMeta: metav1.ObjectMeta{
100+
Namespace: "ns",
101+
Name: "tr",
102+
},
103+
Spec: eventing.TriggerSpec{
104+
Broker: "br",
105+
},
106+
},
107+
brokers: []*eventing.Broker{{
108+
ObjectMeta: metav1.ObjectMeta{
109+
Namespace: "ns",
110+
Name: "br",
111+
Annotations: map[string]string{
112+
eventing.BrokerClassAnnotationKey: "some-other-broker",
113+
},
114+
},
115+
}},
116+
pass: false,
117+
}}
118+
119+
for _, tc := range tt {
120+
tc := tc
121+
t.Run(tc.name, func(t *testing.T) {
122+
brokerInformer := brokerinformer.Get(ctx)
123+
for _, obj := range tc.brokers {
124+
_ = brokerInformer.Informer().GetStore().Add(obj)
125+
}
126+
filter := filterTriggers(brokerInformer.Lister())
127+
pass := filter(tc.trigger)
128+
assert.Equal(t, tc.pass, pass)
129+
})
130+
}
131+
}
132+
52133
func TestGetTriggersForBroker(t *testing.T) {
53134
for _, tt := range []struct {
54135
name string
@@ -91,7 +172,7 @@ func TestGetTriggersForBroker(t *testing.T) {
91172

92173
type TriggerListerFailer struct{}
93174

94-
func (failer *TriggerListerFailer) List(selector labels.Selector) (ret []*v1.Trigger, err error) {
175+
func (failer *TriggerListerFailer) List(selector labels.Selector) (ret []*eventing.Trigger, err error) {
95176
return nil, nil
96177
}
97178

@@ -103,12 +184,12 @@ type TriggerNamespaceListerFailer struct{}
103184

104185
// List lists all Triggers in the indexer.
105186
// Objects returned here must be treated as read-only.
106-
func (failer *TriggerNamespaceListerFailer) List(selector labels.Selector) (ret []*v1.Trigger, err error) {
187+
func (failer *TriggerNamespaceListerFailer) List(selector labels.Selector) (ret []*eventing.Trigger, err error) {
107188
return nil, fmt.Errorf("Inducing test failure for List")
108189
}
109190

110191
// Triggers returns an object that can list and get Triggers.
111-
func (failer *TriggerNamespaceListerFailer) Get(name string) (*v1.Trigger, error) {
192+
func (failer *TriggerNamespaceListerFailer) Get(name string) (*eventing.Trigger, error) {
112193
return nil, nil
113194
}
114195

pkg/reconciler/broker/trigger/trigger.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,6 @@ type Reconciler struct {
7777

7878
func (r *Reconciler) ReconcileKind(ctx context.Context, t *eventingv1.Trigger) pkgreconciler.Event {
7979
logging.FromContext(ctx).Infow("Reconciling", zap.Any("Trigger", t))
80-
t.Status.InitializeConditions()
81-
82-
if t.DeletionTimestamp != nil {
83-
// Everything is cleaned up by the garbage collector.
84-
return nil
85-
}
8680

8781
b, err := r.brokerLister.Brokers(t.Namespace).Get(t.Spec.Broker)
8882
if err != nil {

0 commit comments

Comments
 (0)