Skip to content

Commit 20e5495

Browse files
authored
[release-1.15] Make adapter pkg independent from brokerfilter package (#8373)
Make adapter independent from brokerfilter package
1 parent 329aebc commit 20e5495

File tree

6 files changed

+96
-75
lines changed

6 files changed

+96
-75
lines changed

pkg/adapter/apiserver/adapter.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434

3535
"knative.dev/eventing/pkg/adapter/v2"
3636
v1 "knative.dev/eventing/pkg/apis/sources/v1"
37-
brokerfilter "knative.dev/eventing/pkg/broker/filter"
3837
"knative.dev/eventing/pkg/eventfilter/subscriptionsapi"
3938
)
4039

@@ -73,7 +72,7 @@ func (a *apiServerAdapter) start(ctx context.Context, stopCh <-chan struct{}) er
7372
logger: a.logger,
7473
ref: a.config.EventMode == v1.ReferenceMode,
7574
apiServerSourceName: a.name,
76-
filter: subscriptionsapi.NewAllFilter(brokerfilter.MaterializeFiltersList(a.logger.Desugar(), a.config.Filters)...),
75+
filter: subscriptionsapi.NewAllFilter(subscriptionsapi.MaterializeFiltersList(a.logger.Desugar(), a.config.Filters)...),
7776
}
7877
if a.config.ResourceOwner != nil {
7978
a.logger.Infow("will be filtered",

pkg/adapter/apiserver/adapter_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
kubetesting "k8s.io/client-go/testing"
3636
adaptertest "knative.dev/eventing/pkg/adapter/v2/test"
3737
eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
38-
brokerfilter "knative.dev/eventing/pkg/broker/filter"
3938
"knative.dev/eventing/pkg/eventfilter/subscriptionsapi"
4039
rectesting "knative.dev/eventing/pkg/reconciler/testing"
4140
"knative.dev/pkg/logging"
@@ -299,7 +298,7 @@ func makeResourceAndTestingClient() (*resourceDelegate, *adaptertest.TestCloudEv
299298
source: "unit-test",
300299
apiServerSourceName: apiServerSourceNameTest,
301300
logger: logger,
302-
filter: subscriptionsapi.NewAllFilter(brokerfilter.MaterializeFiltersList(logger.Desugar(), []eventingv1.SubscriptionsAPIFilter{})...),
301+
filter: subscriptionsapi.NewAllFilter(subscriptionsapi.MaterializeFiltersList(logger.Desugar(), []eventingv1.SubscriptionsAPIFilter{})...),
303302
}, ce
304303
}
305304

@@ -313,6 +312,6 @@ func makeRefAndTestingClient() (*resourceDelegate, *adaptertest.TestCloudEventsC
313312
apiServerSourceName: apiServerSourceNameTest,
314313
logger: zap.NewExample().Sugar(),
315314
ref: true,
316-
filter: subscriptionsapi.NewAllFilter(brokerfilter.MaterializeFiltersList(logger.Desugar(), []eventingv1.SubscriptionsAPIFilter{})...),
315+
filter: subscriptionsapi.NewAllFilter(subscriptionsapi.MaterializeFiltersList(logger.Desugar(), []eventingv1.SubscriptionsAPIFilter{})...),
317316
}, ce
318317
}

pkg/adapter/apiserver/delegate_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
adaptertest "knative.dev/eventing/pkg/adapter/v2/test"
2323
eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"
2424
"knative.dev/eventing/pkg/apis/sources"
25-
brokerfilter "knative.dev/eventing/pkg/broker/filter"
2625
"knative.dev/eventing/pkg/eventfilter/subscriptionsapi"
2726
)
2827

@@ -87,7 +86,7 @@ func TestFilterFails(t *testing.T) {
8786
source: "unit-test",
8887
apiServerSourceName: apiServerSourceNameTest,
8988
logger: logger,
90-
filter: subscriptionsapi.NewAllFilter(brokerfilter.MaterializeFiltersList(logger.Desugar(), filters)...),
89+
filter: subscriptionsapi.NewAllFilter(subscriptionsapi.MaterializeFiltersList(logger.Desugar(), filters)...),
9190
}
9291

9392
delegate.Update(simplePod("unit", "test"))
@@ -104,7 +103,7 @@ func TestEmptyFiltersList(t *testing.T) {
104103
source: "unit-test",
105104
apiServerSourceName: apiServerSourceNameTest,
106105
logger: logger,
107-
filter: subscriptionsapi.NewAllFilter(brokerfilter.MaterializeFiltersList(logger.Desugar(), filters)...),
106+
filter: subscriptionsapi.NewAllFilter(subscriptionsapi.MaterializeFiltersList(logger.Desugar(), filters)...),
108107
}
109108

110109
delegate.Update(simplePod("unit", "test"))

pkg/broker/filter/filter_handler.go

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func NewHandler(logger *zap.Logger, tokenVerifier *auth.OIDCTokenVerifier, oidcT
108108
return
109109
}
110110
logger.Debug("Adding filter to filtersMap")
111-
fm.Set(trigger, createSubscriptionsAPIFilters(logger, trigger))
111+
fm.Set(trigger, subscriptionsapi.CreateSubscriptionsAPIFilters(logger, trigger.Spec.Filters))
112112
kncloudevents.AddOrUpdateAddressableHandler(clientConfig, duckv1.Addressable{
113113
URL: trigger.Status.SubscriberURI,
114114
CACerts: trigger.Status.SubscriberCACerts,
@@ -120,7 +120,7 @@ func NewHandler(logger *zap.Logger, tokenVerifier *auth.OIDCTokenVerifier, oidcT
120120
return
121121
}
122122
logger.Debug("Updating filter in filtersMap")
123-
fm.Set(trigger, createSubscriptionsAPIFilters(logger, trigger))
123+
fm.Set(trigger, subscriptionsapi.CreateSubscriptionsAPIFilters(logger, trigger.Spec.Filters))
124124
kncloudevents.AddOrUpdateAddressableHandler(clientConfig, duckv1.Addressable{
125125
URL: trigger.Status.SubscriberURI,
126126
CACerts: trigger.Status.SubscriberCACerts,
@@ -581,70 +581,7 @@ func (h *Handler) filterEvent(ctx context.Context, trigger *eventingv1.Trigger,
581581
}
582582

583583
func applySubscriptionsAPIFilters(ctx context.Context, trigger *eventingv1.Trigger, event cloudevents.Event) eventfilter.FilterResult {
584-
return createSubscriptionsAPIFilters(logging.FromContext(ctx).Desugar(), trigger).Filter(ctx, event)
585-
}
586-
587-
func createSubscriptionsAPIFilters(logger *zap.Logger, trigger *eventingv1.Trigger) eventfilter.Filter {
588-
if len(trigger.Spec.Filters) == 0 {
589-
logger.Debug("Found no filters for trigger", zap.Any("trigger.Spec", trigger.Spec))
590-
return subscriptionsapi.NewNoFilter()
591-
}
592-
return subscriptionsapi.NewAllFilter(MaterializeFiltersList(logger, trigger.Spec.Filters)...)
593-
}
594-
595-
func materializeSubscriptionsAPIFilter(logger *zap.Logger, filter eventingv1.SubscriptionsAPIFilter) eventfilter.Filter {
596-
var materializedFilter eventfilter.Filter
597-
var err error
598-
switch {
599-
case len(filter.Exact) > 0:
600-
// The webhook validates that this map has only a single key:value pair.
601-
materializedFilter, err = subscriptionsapi.NewExactFilter(filter.Exact)
602-
if err != nil {
603-
logger.Debug("Invalid exact expression", zap.Any("filters", filter.Exact), zap.Error(err))
604-
return nil
605-
}
606-
case len(filter.Prefix) > 0:
607-
// The webhook validates that this map has only a single key:value pair.
608-
materializedFilter, err = subscriptionsapi.NewPrefixFilter(filter.Prefix)
609-
if err != nil {
610-
logger.Debug("Invalid prefix expression", zap.Any("filters", filter.Exact), zap.Error(err))
611-
return nil
612-
}
613-
case len(filter.Suffix) > 0:
614-
// The webhook validates that this map has only a single key:value pair.
615-
materializedFilter, err = subscriptionsapi.NewSuffixFilter(filter.Suffix)
616-
if err != nil {
617-
logger.Debug("Invalid suffix expression", zap.Any("filters", filter.Exact), zap.Error(err))
618-
return nil
619-
}
620-
case len(filter.All) > 0:
621-
materializedFilter = subscriptionsapi.NewAllFilter(MaterializeFiltersList(logger, filter.All)...)
622-
case len(filter.Any) > 0:
623-
materializedFilter = subscriptionsapi.NewAnyFilter(MaterializeFiltersList(logger, filter.Any)...)
624-
case filter.Not != nil:
625-
materializedFilter = subscriptionsapi.NewNotFilter(materializeSubscriptionsAPIFilter(logger, *filter.Not))
626-
case filter.CESQL != "":
627-
if materializedFilter, err = subscriptionsapi.NewCESQLFilter(filter.CESQL); err != nil {
628-
// This is weird, CESQL expression should be validated when Trigger's are created.
629-
logger.Debug("Found an Invalid CE SQL expression", zap.String("expression", filter.CESQL))
630-
return nil
631-
}
632-
}
633-
return materializedFilter
634-
}
635-
636-
// MaterialzieFilterList allows any component that supports `SubscriptionsAPIFilter` to process them
637-
func MaterializeFiltersList(logger *zap.Logger, filters []eventingv1.SubscriptionsAPIFilter) []eventfilter.Filter {
638-
materializedFilters := make([]eventfilter.Filter, 0, len(filters))
639-
for _, f := range filters {
640-
f := materializeSubscriptionsAPIFilter(logger, f)
641-
if f == nil {
642-
logger.Warn("Failed to parse filter. Skipping filter.", zap.Any("filter", f))
643-
continue
644-
}
645-
materializedFilters = append(materializedFilters, f)
646-
}
647-
return materializedFilters
584+
return subscriptionsapi.CreateSubscriptionsAPIFilters(logging.FromContext(ctx).Desugar(), trigger.Spec.Filters).Filter(ctx, event)
648585
}
649586

650587
func applyAttributesFilter(ctx context.Context, filter *eventingv1.TriggerFilter, event cloudevents.Event) eventfilter.FilterResult {

pkg/broker/filter/filter_handler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ func TestReceiver_WithSubscriptionsAPI(t *testing.T) {
651651
trig.Status.SubscriberURI = url
652652
}
653653
triggerinformerfake.Get(ctx).Informer().GetStore().Add(trig)
654-
filtersMap.Set(trig, createSubscriptionsAPIFilters(logging.FromContext(ctx).Desugar(), trig))
654+
filtersMap.Set(trig, subscriptionsapi.CreateSubscriptionsAPIFilters(logging.FromContext(ctx).Desugar(), trig.Spec.Filters))
655655

656656
// create the needed broker object
657657
b := &v1.Broker{
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
Copyright 2024 The Knative Authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package subscriptionsapi
18+
19+
import (
20+
"go.uber.org/zap"
21+
v1 "knative.dev/eventing/pkg/apis/eventing/v1"
22+
"knative.dev/eventing/pkg/eventfilter"
23+
)
24+
25+
// MaterializeSubscriptionsAPIFilter materializes a SubscriptionsAPIFilter into a runnable Filter.
26+
func MaterializeSubscriptionsAPIFilter(logger *zap.Logger, filter v1.SubscriptionsAPIFilter) eventfilter.Filter {
27+
var materializedFilter eventfilter.Filter
28+
var err error
29+
switch {
30+
case len(filter.Exact) > 0:
31+
// The webhook validates that this map has only a single key:value pair.
32+
materializedFilter, err = NewExactFilter(filter.Exact)
33+
if err != nil {
34+
logger.Debug("Invalid exact expression", zap.Any("filters", filter.Exact), zap.Error(err))
35+
return nil
36+
}
37+
case len(filter.Prefix) > 0:
38+
// The webhook validates that this map has only a single key:value pair.
39+
materializedFilter, err = NewPrefixFilter(filter.Prefix)
40+
if err != nil {
41+
logger.Debug("Invalid prefix expression", zap.Any("filters", filter.Exact), zap.Error(err))
42+
return nil
43+
}
44+
case len(filter.Suffix) > 0:
45+
// The webhook validates that this map has only a single key:value pair.
46+
materializedFilter, err = NewSuffixFilter(filter.Suffix)
47+
if err != nil {
48+
logger.Debug("Invalid suffix expression", zap.Any("filters", filter.Exact), zap.Error(err))
49+
return nil
50+
}
51+
case len(filter.All) > 0:
52+
materializedFilter = NewAllFilter(MaterializeFiltersList(logger, filter.All)...)
53+
case len(filter.Any) > 0:
54+
materializedFilter = NewAnyFilter(MaterializeFiltersList(logger, filter.Any)...)
55+
case filter.Not != nil:
56+
materializedFilter = NewNotFilter(MaterializeSubscriptionsAPIFilter(logger, *filter.Not))
57+
case filter.CESQL != "":
58+
if materializedFilter, err = NewCESQLFilter(filter.CESQL); err != nil {
59+
// This is weird, CESQL expression should be validated when Trigger's are created.
60+
logger.Debug("Found an Invalid CE SQL expression", zap.String("expression", filter.CESQL))
61+
return nil
62+
}
63+
}
64+
return materializedFilter
65+
}
66+
67+
func CreateSubscriptionsAPIFilters(logger *zap.Logger, filters []v1.SubscriptionsAPIFilter) eventfilter.Filter {
68+
if len(filters) == 0 {
69+
logger.Debug("no filters provided")
70+
return NewNoFilter()
71+
}
72+
return NewAllFilter(MaterializeFiltersList(logger, filters)...)
73+
}
74+
75+
// MaterialzieFilterList allows any component that supports `SubscriptionsAPIFilter` to process them
76+
func MaterializeFiltersList(logger *zap.Logger, filters []v1.SubscriptionsAPIFilter) []eventfilter.Filter {
77+
materializedFilters := make([]eventfilter.Filter, 0, len(filters))
78+
for _, f := range filters {
79+
f := MaterializeSubscriptionsAPIFilter(logger, f)
80+
if f == nil {
81+
logger.Warn("Failed to parse filter. Skipping filter.", zap.Any("filter", f))
82+
continue
83+
}
84+
materializedFilters = append(materializedFilters, f)
85+
}
86+
return materializedFilters
87+
}

0 commit comments

Comments
 (0)