@@ -291,7 +291,10 @@ func TestValidateHTTPRoute(t *testing.T) {
291291 }
292292 for _ , tc := range tests {
293293 t .Run (tc .name , func (t * testing.T ) {
294- errs := validateHTTPRouteUniqueFilters (tc .rules , field .NewPath ("spec" ).Child ("rules" ))
294+ var errs field.ErrorList
295+ for _ , rules := range tc .rules {
296+ errs = validateHTTPRouteFilters (rules .Filters , field .NewPath ("spec" ).Child ("rules" ))
297+ }
295298 if len (errs ) != tc .errCount {
296299 t .Errorf ("ValidateHTTPRoute() got %v errors, want %v errors" , len (errs ), tc .errCount )
297300 }
@@ -381,10 +384,12 @@ func TestValidateHTTPBackendUniqueFilters(t *testing.T) {
381384
382385 for _ , tc := range tests {
383386 t .Run (tc .name , func (t * testing.T ) {
384- for index , rule := range tc .hRoute .Spec .Rules {
385- errs := validateHTTPBackendUniqueFilters (rule .BackendRefs , field .NewPath ("spec" ).Child ("rules" ), index )
386- if len (errs ) != tc .errCount {
387- t .Errorf ("ValidateHTTPRoute() got %d errors, want %d errors" , len (errs ), tc .errCount )
387+ for _ , rule := range tc .hRoute .Spec .Rules {
388+ for _ , backendRef := range rule .BackendRefs {
389+ errs := validateHTTPRouteFilters (backendRef .Filters , field .NewPath ("spec" ).Child ("rules" ))
390+ if len (errs ) != tc .errCount {
391+ t .Errorf ("ValidateHTTPRoute() got %d errors, want %d errors" , len (errs ), tc .errCount )
392+ }
388393 }
389394 }
390395 })
@@ -553,3 +558,163 @@ func TestValidateServicePort(t *testing.T) {
553558 })
554559 }
555560}
561+
562+ func TestValidateHTTPRouteTypeMatchesField (t * testing.T ) {
563+ tests := []struct {
564+ name string
565+ routeFilter gatewayv1a2.HTTPRouteFilter
566+ errCount int
567+ }{
568+ {
569+ name : "valid HTTPRouteFilterRequestHeaderModifier route filter" ,
570+ routeFilter : gatewayv1a2.HTTPRouteFilter {
571+ Type : gatewayv1a2 .HTTPRouteFilterRequestHeaderModifier ,
572+ RequestHeaderModifier : & gatewayv1a2.HTTPRequestHeaderFilter {
573+ Set : []gatewayv1a2.HTTPHeader {{Name : "name" }},
574+ Add : []gatewayv1a2.HTTPHeader {{Name : "add" }},
575+ Remove : []string {"remove" },
576+ },
577+ },
578+ errCount : 0 ,
579+ },
580+ {
581+ name : "invalid HTTPRouteFilterRequestHeaderModifier type filter with non-matching field" ,
582+ routeFilter : gatewayv1a2.HTTPRouteFilter {
583+ Type : gatewayv1a2 .HTTPRouteFilterRequestHeaderModifier ,
584+ RequestMirror : & gatewayv1a2.HTTPRequestMirrorFilter {},
585+ },
586+ errCount : 2 ,
587+ },
588+ {
589+ name : "invalid HTTPRouteFilterRequestHeaderModifier type filter with empty value field" ,
590+ routeFilter : gatewayv1a2.HTTPRouteFilter {
591+ Type : gatewayv1a2 .HTTPRouteFilterRequestHeaderModifier ,
592+ },
593+ errCount : 1 ,
594+ },
595+ {
596+ name : "valid HTTPRouteFilterRequestMirror route filter" ,
597+ routeFilter : gatewayv1a2.HTTPRouteFilter {
598+ Type : gatewayv1a2 .HTTPRouteFilterRequestMirror ,
599+ RequestMirror : & gatewayv1a2.HTTPRequestMirrorFilter {BackendRef : gatewayv1a2.BackendObjectReference {
600+ Group : new (gatewayv1a2.Group ),
601+ Kind : new (gatewayv1a2.Kind ),
602+ Name : "name" ,
603+ Namespace : new (gatewayv1a2.Namespace ),
604+ Port : pkgutils .PortNumberPtr (22 ),
605+ }},
606+ },
607+ errCount : 0 ,
608+ },
609+ {
610+ name : "invalid HTTPRouteFilterRequestMirror type filter with non-matching field" ,
611+ routeFilter : gatewayv1a2.HTTPRouteFilter {
612+ Type : gatewayv1a2 .HTTPRouteFilterRequestMirror ,
613+ RequestHeaderModifier : & gatewayv1a2.HTTPRequestHeaderFilter {},
614+ },
615+ errCount : 2 ,
616+ },
617+ {
618+ name : "invalid HTTPRouteFilterRequestMirror type filter with empty value field" ,
619+ routeFilter : gatewayv1a2.HTTPRouteFilter {
620+ Type : gatewayv1a2 .HTTPRouteFilterRequestMirror ,
621+ },
622+ errCount : 1 ,
623+ },
624+ {
625+ name : "valid HTTPRouteFilterRequestRedirect route filter" ,
626+ routeFilter : gatewayv1a2.HTTPRouteFilter {
627+ Type : gatewayv1a2 .HTTPRouteFilterRequestRedirect ,
628+ RequestRedirect : & gatewayv1a2.HTTPRequestRedirectFilter {
629+ Scheme : new (string ),
630+ Hostname : new (gatewayv1a2.Hostname ),
631+ Path : & gatewayv1a2.HTTPPathModifier {},
632+ Port : new (gatewayv1a2.PortNumber ),
633+ StatusCode : new (int ),
634+ },
635+ },
636+ errCount : 0 ,
637+ },
638+ {
639+ name : "invalid HTTPRouteFilterRequestRedirect type filter with non-matching field" ,
640+ routeFilter : gatewayv1a2.HTTPRouteFilter {
641+ Type : gatewayv1a2 .HTTPRouteFilterRequestRedirect ,
642+ RequestMirror : & gatewayv1a2.HTTPRequestMirrorFilter {},
643+ },
644+ errCount : 2 ,
645+ },
646+ {
647+ name : "invalid HTTPRouteFilterRequestRedirect type filter with empty value field" ,
648+ routeFilter : gatewayv1a2.HTTPRouteFilter {
649+ Type : gatewayv1a2 .HTTPRouteFilterRequestRedirect ,
650+ },
651+ errCount : 1 ,
652+ },
653+ {
654+ name : "valid HTTPRouteFilterExtensionRef filter" ,
655+ routeFilter : gatewayv1a2.HTTPRouteFilter {
656+ Type : gatewayv1a2 .HTTPRouteFilterExtensionRef ,
657+ ExtensionRef : & gatewayv1a2.LocalObjectReference {
658+ Group : "group" ,
659+ Kind : "kind" ,
660+ Name : "name" ,
661+ },
662+ },
663+ errCount : 0 ,
664+ },
665+ {
666+ name : "invalid HTTPRouteFilterExtensionRef type filter with non-matching field" ,
667+ routeFilter : gatewayv1a2.HTTPRouteFilter {
668+ Type : gatewayv1a2 .HTTPRouteFilterExtensionRef ,
669+ RequestMirror : & gatewayv1a2.HTTPRequestMirrorFilter {},
670+ },
671+ errCount : 2 ,
672+ },
673+ {
674+ name : "invalid HTTPRouteFilterExtensionRef type filter with empty value field" ,
675+ routeFilter : gatewayv1a2.HTTPRouteFilter {
676+ Type : gatewayv1a2 .HTTPRouteFilterExtensionRef ,
677+ },
678+ errCount : 1 ,
679+ },
680+ {
681+ name : "valid HTTPRouteFilterURLRewrite route filter" ,
682+ routeFilter : gatewayv1a2.HTTPRouteFilter {
683+ Type : gatewayv1a2 .HTTPRouteFilterURLRewrite ,
684+ URLRewrite : & gatewayv1a2.HTTPURLRewriteFilter {
685+ Hostname : new (gatewayv1a2.Hostname ),
686+ Path : & gatewayv1a2.HTTPPathModifier {},
687+ },
688+ },
689+ errCount : 0 ,
690+ },
691+ {
692+ name : "invalid HTTPRouteFilterURLRewrite type filter with non-matching field" ,
693+ routeFilter : gatewayv1a2.HTTPRouteFilter {
694+ Type : gatewayv1a2 .HTTPRouteFilterURLRewrite ,
695+ RequestMirror : & gatewayv1a2.HTTPRequestMirrorFilter {},
696+ },
697+ errCount : 2 ,
698+ },
699+ {
700+ name : "invalid HTTPRouteFilterURLRewrite type filter with empty value field" ,
701+ routeFilter : gatewayv1a2.HTTPRouteFilter {
702+ Type : gatewayv1a2 .HTTPRouteFilterURLRewrite ,
703+ },
704+ errCount : 1 ,
705+ },
706+ {
707+ name : "empty type filter is valid(caught by CRD validation)" ,
708+ routeFilter : gatewayv1a2.HTTPRouteFilter {},
709+ errCount : 0 ,
710+ },
711+ }
712+ for _ , tc := range tests {
713+ t .Run (tc .name , func (t * testing.T ) {
714+ errs := validateHTTPRouteFilterTypeMatchesValue (tc .routeFilter , field .NewPath ("spec" ).Child ("rules" ).Index (0 ).Child ("filters" ).Index (0 ))
715+ if len (errs ) != tc .errCount {
716+ t .Errorf ("got %v errors, want %v errors: %s" , len (errs ), tc .errCount , errs )
717+ }
718+ })
719+ }
720+ }
0 commit comments