@@ -16,6 +16,8 @@ import (
1616 "github.com/stretchr/testify/assert"
1717 "github.com/stretchr/testify/require"
1818 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
19+ "k8s.io/apimachinery/pkg/runtime/schema"
20+ "k8s.io/apimachinery/pkg/util/sets"
1921 "k8s.io/utils/ptr"
2022
2123 egv1a1 "github.com/envoyproxy/gateway/api/v1alpha1"
@@ -150,6 +152,79 @@ func TestCompositeHookClient_PostRouteModifyHook(t *testing.T) {
150152 require .Equal (t , fmt .Errorf (`extension "ext1": %w` , fmt .Errorf ("extension error" )), err )
151153 require .False (t , client2Called )
152154 })
155+
156+ t .Run ("per-extension resource filtering" , func (t * testing.T ) {
157+ var ext1Resources , ext2Resources []* unstructured.Unstructured
158+
159+ client1 := & mockXDSHookClient {
160+ postRouteModifyHook : func (r * route.Route , _ []string , resources []* unstructured.Unstructured ) (* route.Route , error ) {
161+ ext1Resources = resources
162+ return r , nil
163+ },
164+ }
165+ client2 := & mockXDSHookClient {
166+ postRouteModifyHook : func (r * route.Route , _ []string , resources []* unstructured.Unstructured ) (* route.Route , error ) {
167+ ext2Resources = resources
168+ return r , nil
169+ },
170+ }
171+
172+ fooV1FooFilterGVK := schema.GroupVersionKind {Group : "foo.io" , Version : "v1" , Kind : "FooFilter" }
173+ barV1BarBackendGVK := schema.GroupVersionKind {Group : "bar.io" , Version : "v1" , Kind : "BarBackend" }
174+ composite := & compositeXDSHookClient {
175+ entries : []hookClientEntry {
176+ {
177+ name : "ext1" ,
178+ client : client1 ,
179+ resourceGVKSet : sets .New (fooV1FooFilterGVK ),
180+ },
181+ {
182+ name : "ext2" ,
183+ client : client2 ,
184+ resourceGVKSet : sets .New (barV1BarBackendGVK ),
185+ },
186+ },
187+ }
188+
189+ allResources := []* unstructured.Unstructured {
190+ {Object : map [string ]interface {}{"apiVersion" : "foo.io/v1" , "kind" : "FooFilter" }},
191+ {Object : map [string ]interface {}{"apiVersion" : "bar.io/v1" , "kind" : "BarBackend" }},
192+ }
193+
194+ _ , err := composite .PostRouteModifyHook (& route.Route {Name : "test" }, nil , allResources )
195+ require .NoError (t , err )
196+
197+ require .Len (t , ext1Resources , 1 )
198+ assert .Equal (t , fooV1FooFilterGVK , ext1Resources [0 ].GetObjectKind ().GroupVersionKind ())
199+
200+ require .Len (t , ext2Resources , 1 )
201+ assert .Equal (t , barV1BarBackendGVK , ext2Resources [0 ].GetObjectKind ().GroupVersionKind ())
202+ })
203+
204+ t .Run ("no resourceGVKSet passes all resources" , func (t * testing.T ) {
205+ var receivedResources []* unstructured.Unstructured
206+ client := & mockXDSHookClient {
207+ postRouteModifyHook : func (r * route.Route , _ []string , resources []* unstructured.Unstructured ) (* route.Route , error ) {
208+ receivedResources = resources
209+ return r , nil
210+ },
211+ }
212+
213+ composite := & compositeXDSHookClient {
214+ entries : []hookClientEntry {
215+ {name : "ext1" , client : client },
216+ },
217+ }
218+
219+ allResources := []* unstructured.Unstructured {
220+ {Object : map [string ]interface {}{"apiVersion" : "foo.io/v1" , "kind" : "FooFilter" }},
221+ {Object : map [string ]interface {}{"apiVersion" : "bar.io/v1" , "kind" : "BarBackend" }},
222+ }
223+
224+ _ , err := composite .PostRouteModifyHook (& route.Route {Name : "test" }, nil , allResources )
225+ require .NoError (t , err )
226+ assert .Len (t , receivedResources , 2 )
227+ })
153228}
154229
155230func TestCompositeHookClient_PostVirtualHostModifyHook (t * testing.T ) {
@@ -300,6 +375,54 @@ func TestCompositeHookClient_PostHTTPListenerModifyHook(t *testing.T) {
300375 require .Equal (t , fmt .Errorf (`extension "ext1": %w` , fmt .Errorf ("extension error" )), err )
301376 require .False (t , client2Called )
302377 })
378+
379+ t .Run ("per-extension policy filtering" , func (t * testing.T ) {
380+ var ext1Resources , ext2Resources []* unstructured.Unstructured
381+
382+ client1 := & mockXDSHookClient {
383+ postHTTPListenerModifyHook : func (l * listener.Listener , resources []* unstructured.Unstructured ) (* listener.Listener , error ) {
384+ ext1Resources = resources
385+ return l , nil
386+ },
387+ }
388+ client2 := & mockXDSHookClient {
389+ postHTTPListenerModifyHook : func (l * listener.Listener , resources []* unstructured.Unstructured ) (* listener.Listener , error ) {
390+ ext2Resources = resources
391+ return l , nil
392+ },
393+ }
394+
395+ fooV1FooPolicyGVK := schema.GroupVersionKind {Group : "foo.io" , Version : "v1" , Kind : "FooPolicy" }
396+ barV1BarPolicyGVK := schema.GroupVersionKind {Group : "bar.io" , Version : "v1" , Kind : "BarPolicy" }
397+ composite := & compositeXDSHookClient {
398+ entries : []hookClientEntry {
399+ {
400+ name : "ext1" ,
401+ client : client1 ,
402+ policyGVKSet : sets .New (fooV1FooPolicyGVK ),
403+ },
404+ {
405+ name : "ext2" ,
406+ client : client2 ,
407+ policyGVKSet : sets .New (barV1BarPolicyGVK ),
408+ },
409+ },
410+ }
411+
412+ allResources := []* unstructured.Unstructured {
413+ {Object : map [string ]interface {}{"apiVersion" : "foo.io/v1" , "kind" : "FooPolicy" }},
414+ {Object : map [string ]interface {}{"apiVersion" : "bar.io/v1" , "kind" : "BarPolicy" }},
415+ }
416+
417+ _ , err := composite .PostHTTPListenerModifyHook (& listener.Listener {Name : "test" }, allResources )
418+ require .NoError (t , err )
419+
420+ require .Len (t , ext1Resources , 1 )
421+ assert .Equal (t , fooV1FooPolicyGVK , ext1Resources [0 ].GetObjectKind ().GroupVersionKind ())
422+
423+ require .Len (t , ext2Resources , 1 )
424+ assert .Equal (t , barV1BarPolicyGVK , ext2Resources [0 ].GetObjectKind ().GroupVersionKind ())
425+ })
303426}
304427
305428func TestCompositeHookClient_PostClusterModifyHook (t * testing.T ) {
@@ -375,6 +498,54 @@ func TestCompositeHookClient_PostClusterModifyHook(t *testing.T) {
375498 require .Error (t , err )
376499 require .False (t , client2Called )
377500 })
501+
502+ t .Run ("per-extension resource filtering" , func (t * testing.T ) {
503+ var ext1Resources , ext2Resources []* unstructured.Unstructured
504+
505+ client1 := & mockXDSHookClient {
506+ postClusterModifyHook : func (c * cluster.Cluster , resources []* unstructured.Unstructured ) (* cluster.Cluster , error ) {
507+ ext1Resources = resources
508+ return c , nil
509+ },
510+ }
511+ client2 := & mockXDSHookClient {
512+ postClusterModifyHook : func (c * cluster.Cluster , resources []* unstructured.Unstructured ) (* cluster.Cluster , error ) {
513+ ext2Resources = resources
514+ return c , nil
515+ },
516+ }
517+
518+ fooV1FooBackendGVK := schema.GroupVersionKind {Group : "foo.io" , Version : "v1" , Kind : "FooBackend" }
519+ barV1BarBackend := schema.GroupVersionKind {Group : "bar.io" , Version : "v1" , Kind : "BarBackend" }
520+ composite := & compositeXDSHookClient {
521+ entries : []hookClientEntry {
522+ {
523+ name : "ext1" ,
524+ client : client1 ,
525+ resourceGVKSet : sets .New (fooV1FooBackendGVK ),
526+ },
527+ {
528+ name : "ext2" ,
529+ client : client2 ,
530+ resourceGVKSet : sets .New (barV1BarBackend ),
531+ },
532+ },
533+ }
534+
535+ allResources := []* unstructured.Unstructured {
536+ {Object : map [string ]interface {}{"apiVersion" : "foo.io/v1" , "kind" : "FooBackend" }},
537+ {Object : map [string ]interface {}{"apiVersion" : "bar.io/v1" , "kind" : "BarBackend" }},
538+ }
539+
540+ _ , err := composite .PostClusterModifyHook (& cluster.Cluster {Name : "test" }, allResources )
541+ require .NoError (t , err )
542+
543+ require .Len (t , ext1Resources , 1 )
544+ assert .Equal (t , fooV1FooBackendGVK , ext1Resources [0 ].GetObjectKind ().GroupVersionKind ())
545+
546+ require .Len (t , ext2Resources , 1 )
547+ assert .Equal (t , barV1BarBackend , ext2Resources [0 ].GetObjectKind ().GroupVersionKind ())
548+ })
378549}
379550
380551func TestCompositeHookClient_PostTranslateModifyHook (t * testing.T ) {
@@ -443,21 +614,19 @@ func TestCompositeHookClient_PostTranslateModifyHook(t *testing.T) {
443614 },
444615 }
445616
617+ fooV1FooPolicyGVK := schema.GroupVersionKind {Group : "foo.io" , Version : "v1" , Kind : "FooPolicy" }
618+ barV1BarPolicyGVK := schema.GroupVersionKind {Group : "bar.io" , Version : "v1" , Kind : "BarPolicy" }
446619 composite := & compositeXDSHookClient {
447620 entries : []hookClientEntry {
448621 {
449- name : "ext1" ,
450- client : client1 ,
451- policyGVKSet : map [string ]struct {}{
452- "foo.io/v1/FooPolicy" : {},
453- },
622+ name : "ext1" ,
623+ client : client1 ,
624+ policyGVKSet : sets .New (fooV1FooPolicyGVK ),
454625 },
455626 {
456- name : "ext2" ,
457- client : client2 ,
458- policyGVKSet : map [string ]struct {}{
459- "bar.io/v1/BarPolicy" : {},
460- },
627+ name : "ext2" ,
628+ client : client2 ,
629+ policyGVKSet : sets .New (barV1BarPolicyGVK ),
461630 },
462631 },
463632 }
@@ -485,11 +654,11 @@ func TestCompositeHookClient_PostTranslateModifyHook(t *testing.T) {
485654
486655 // ext1 should only see FooPolicy
487656 require .Len (t , ext1Policies , 1 )
488- assert .Equal (t , "FooPolicy" , ext1Policies [0 ].Object .GetKind ())
657+ assert .Equal (t , fooV1FooPolicyGVK , ext1Policies [0 ].Object .GetObjectKind (). GroupVersionKind ())
489658
490659 // ext2 should only see BarPolicy
491660 require .Len (t , ext2Policies , 1 )
492- assert .Equal (t , "BarPolicy" , ext2Policies [0 ].Object .GetKind ())
661+ assert .Equal (t , barV1BarPolicyGVK , ext2Policies [0 ].Object .GetObjectKind (). GroupVersionKind ())
493662 })
494663
495664 t .Run ("per-extension resource-type gating" , func (t * testing.T ) {
@@ -662,9 +831,8 @@ func TestCompositeHookClient_PostTranslateModifyHook(t *testing.T) {
662831 })
663832
664833 t .Run ("filterPoliciesByGVK skips nil entries" , func (t * testing.T ) {
665- gvkSet := map [string ]struct {}{
666- "foo.io/v1/FooPolicy" : {},
667- }
834+ fooV1FooPolicyGVK := schema.GroupVersionKind {Group : "foo.io" , Version : "v1" , Kind : "FooPolicy" }
835+ gvkSet := sets .New (fooV1FooPolicyGVK )
668836 policies := []* ir.UnstructuredRef {
669837 nil ,
670838 {Object : nil },
@@ -676,7 +844,7 @@ func TestCompositeHookClient_PostTranslateModifyHook(t *testing.T) {
676844
677845 filtered := filterPoliciesByGVK (policies , gvkSet )
678846 require .Len (t , filtered , 1 )
679- assert .Equal (t , "FooPolicy" , filtered [0 ].Object .GetKind ())
847+ assert .Equal (t , fooV1FooPolicyGVK , filtered [0 ].Object .GetObjectKind (). GroupVersionKind ())
680848 })
681849
682850 t .Run ("no policyGVKSet passes all policies" , func (t * testing.T ) {
0 commit comments