Skip to content

Commit 8982f1b

Browse files
authored
Merge branch 'main' into fix-6752
2 parents 9ace30c + 7ca4654 commit 8982f1b

File tree

6 files changed

+74
-56
lines changed

6 files changed

+74
-56
lines changed

internal/gatewayapi/contexts.go

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -585,25 +585,35 @@ func (r *RouteParentContext) HasCondition(route RouteContext, condType gwapiv1.R
585585
return false
586586
}
587587

588-
// BackendRefContext represents a generic BackendRef object (HTTPBackendRef, GRPCBackendRef or BackendRef itself)
589-
type BackendRefContext any
588+
// BackendRefContext represents a generic BackendRef object
589+
type BackendRefContext interface {
590+
GetBackendRef() *gwapiv1.BackendRef
591+
GetFilters() any
592+
}
590593

591-
func GetBackendRef(b BackendRefContext) *gwapiv1.BackendRef {
592-
rv := reflect.ValueOf(b)
593-
br := rv.FieldByName("BackendRef")
594-
if br.IsValid() {
595-
backendRef := br.Interface().(gwapiv1.BackendRef)
596-
return &backendRef
597-
}
594+
// BackendRefWithFilters wraps backend refs that have filters (HTTPBackendRef, GRPCBackendRef)
595+
type BackendRefWithFilters struct {
596+
BackendRef *gwapiv1.BackendRef
597+
Filters any // []gwapiv1.HTTPRouteFilter or []gwapiv1.GRPCRouteFilter
598+
}
598599

599-
backendRef := b.(gwapiv1.BackendRef)
600-
return &backendRef
600+
func (b BackendRefWithFilters) GetBackendRef() *gwapiv1.BackendRef {
601+
return b.BackendRef
601602
}
602603

603-
func GetFilters(b BackendRefContext) any {
604-
filters := reflect.ValueOf(b).FieldByName("Filters")
605-
if !filters.IsValid() {
606-
return nil
607-
}
608-
return filters.Interface()
604+
func (b BackendRefWithFilters) GetFilters() any {
605+
return b.Filters
606+
}
607+
608+
// DirectBackendRef wraps a BackendRef directly (used by TLS/TCP/UDP routes)
609+
type DirectBackendRef struct {
610+
BackendRef *gwapiv1.BackendRef
611+
}
612+
613+
func (d DirectBackendRef) GetBackendRef() *gwapiv1.BackendRef {
614+
return d.BackendRef
615+
}
616+
617+
func (d DirectBackendRef) GetFilters() any {
618+
return nil
609619
}

internal/gatewayapi/filters.go

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -969,22 +969,12 @@ func (t *Translator) processRequestMirrorFilter(
969969
weight := int32(1)
970970
mirrorBackend := mirrorFilter.BackendRef
971971

972-
// Create the appropriate BackendRef type based on the route type
973-
var mirrorBackendRef BackendRefContext
974-
if routeType == resource.KindGRPCRoute {
975-
mirrorBackendRef = gwapiv1.GRPCBackendRef{
976-
BackendRef: gwapiv1.BackendRef{
977-
BackendObjectReference: mirrorBackend,
978-
Weight: &weight,
979-
},
980-
}
981-
} else {
982-
mirrorBackendRef = gwapiv1.HTTPBackendRef{
983-
BackendRef: gwapiv1.BackendRef{
984-
BackendObjectReference: mirrorBackend,
985-
Weight: &weight,
986-
},
987-
}
972+
// Create a DirectBackendRef for the mirror backend (no filters needed)
973+
mirrorBackendRef := DirectBackendRef{
974+
BackendRef: &gwapiv1.BackendRef{
975+
BackendObjectReference: mirrorBackend,
976+
Weight: &weight,
977+
},
988978
}
989979

990980
// This sets the status on the Route, should the usage be changed so that the status message reflects that the backendRef is from the filter?

internal/gatewayapi/listener.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,8 @@ func (t *Translator) processBackendRefs(name string, backendCluster egv1a1.Backe
819819
return nil, nil, err
820820
}
821821
result := make([]*ir.DestinationSetting, 0, len(backendCluster.BackendRefs))
822-
for _, ref := range backendCluster.BackendRefs {
822+
for i := range backendCluster.BackendRefs {
823+
ref := &backendCluster.BackendRefs[i]
823824
ns := NamespaceDerefOr(ref.Namespace, namespace)
824825
kind := KindDerefOr(ref.Kind, resource.KindService)
825826
switch kind {

internal/gatewayapi/resource/load.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,15 +544,15 @@ func addMissingServices(requiredServices map[string]*corev1.Service, obj interfa
544544
case *gwapiv1.HTTPRoute:
545545
objNamespace = route.Namespace
546546
for _, rule := range route.Spec.Rules {
547-
for _, httpBakcendRef := range rule.BackendRefs {
548-
refs = append(refs, httpBakcendRef.BackendRef)
547+
for i := range rule.BackendRefs {
548+
refs = append(refs, rule.BackendRefs[i].BackendRef)
549549
}
550550
}
551551
case *gwapiv1.GRPCRoute:
552552
objNamespace = route.Namespace
553553
for _, rule := range route.Spec.Rules {
554-
for _, gRPCBakcendRef := range rule.BackendRefs {
555-
refs = append(refs, gRPCBakcendRef.BackendRef)
554+
for i := range rule.BackendRefs {
555+
refs = append(refs, rule.BackendRefs[i].BackendRef)
556556
}
557557
}
558558
case *gwapiv1a2.TLSRoute:

internal/gatewayapi/route.go

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,13 @@ func (t *Translator) processHTTPRouteRules(httpRoute *HTTPRouteContext, parentRe
218218
backendRefNames := make([]string, len(rule.BackendRefs))
219219
backendCustomRefs := []*ir.UnstructuredRef{}
220220
// process each backendRef, and calculate the destination settings for this rule
221-
for i, backendRef := range rule.BackendRefs {
221+
for i := range rule.BackendRefs {
222222
settingName := irDestinationSettingName(destName, i)
223-
ds, unstructuredRef, err := t.processDestination(settingName, backendRef, parentRef, httpRoute, resources)
223+
backendRefCtx := BackendRefWithFilters{
224+
BackendRef: &rule.BackendRefs[i].BackendRef,
225+
Filters: rule.BackendRefs[i].Filters,
226+
}
227+
ds, unstructuredRef, err := t.processDestination(settingName, backendRefCtx, parentRef, httpRoute, resources)
224228
if err != nil {
225229
errs.Add(status.NewRouteStatusError(
226230
fmt.Errorf("failed to process route rule %d backendRef %d: %w", ruleIdx, i, err),
@@ -242,8 +246,8 @@ func (t *Translator) processHTTPRouteRules(httpRoute *HTTPRouteContext, parentRe
242246
if ds.IsDynamicResolver {
243247
hasDynamicResolver = true
244248
}
245-
backendNamespace := NamespaceDerefOr(backendRef.Namespace, httpRoute.GetNamespace())
246-
backendRefNames[i] = fmt.Sprintf("%s/%s", backendNamespace, backendRef.Name)
249+
backendNamespace := NamespaceDerefOr(rule.BackendRefs[i].Namespace, httpRoute.GetNamespace())
250+
backendRefNames[i] = fmt.Sprintf("%s/%s", backendNamespace, rule.BackendRefs[i].Name)
247251
}
248252

249253
// process each ir route
@@ -664,9 +668,13 @@ func (t *Translator) processGRPCRouteRules(grpcRoute *GRPCRouteContext, parentRe
664668
failedProcessDestination := false
665669

666670
backendRefNames := make([]string, len(rule.BackendRefs))
667-
for i, backendRef := range rule.BackendRefs {
671+
for i := range rule.BackendRefs {
668672
settingName := irDestinationSettingName(destName, i)
669-
ds, _, err := t.processDestination(settingName, backendRef, parentRef, grpcRoute, resources)
673+
backendRefCtx := BackendRefWithFilters{
674+
BackendRef: &rule.BackendRefs[i].BackendRef,
675+
Filters: rule.BackendRefs[i].Filters,
676+
}
677+
ds, _, err := t.processDestination(settingName, backendRefCtx, parentRef, grpcRoute, resources)
670678
if err != nil {
671679
errs.Add(status.NewRouteStatusError(
672680
fmt.Errorf("failed to process route rule %d backendRef %d: %w", ruleIdx, i, err),
@@ -680,8 +688,8 @@ func (t *Translator) processGRPCRouteRules(grpcRoute *GRPCRouteContext, parentRe
680688
continue
681689
}
682690
allDs = append(allDs, ds)
683-
backendNamespace := NamespaceDerefOr(backendRef.Namespace, grpcRoute.GetNamespace())
684-
backendRefNames[i] = fmt.Sprintf("%s/%s", backendNamespace, backendRef.Name)
691+
backendNamespace := NamespaceDerefOr(rule.BackendRefs[i].Namespace, grpcRoute.GetNamespace())
692+
backendRefNames[i] = fmt.Sprintf("%s/%s", backendNamespace, rule.BackendRefs[i].Name)
685693
}
686694

687695
// process each ir route
@@ -955,9 +963,10 @@ func (t *Translator) processTLSRouteParentRefs(tlsRoute *TLSRouteContext, resour
955963

956964
// compute backends
957965
for _, rule := range tlsRoute.Spec.Rules {
958-
for i, backendRef := range rule.BackendRefs {
966+
for i := range rule.BackendRefs {
959967
settingName := irDestinationSettingName(destName, i)
960-
ds, _, err := t.processDestination(settingName, backendRef, parentRef, tlsRoute, resources)
968+
backendRefCtx := DirectBackendRef{BackendRef: &rule.BackendRefs[i]}
969+
ds, _, err := t.processDestination(settingName, backendRefCtx, parentRef, tlsRoute, resources)
961970
if err != nil {
962971
resolveErrs.Add(err)
963972
continue
@@ -1110,9 +1119,10 @@ func (t *Translator) processUDPRouteParentRefs(udpRoute *UDPRouteContext, resour
11101119
destName = irRouteDestinationName(udpRoute, -1 /*rule index*/)
11111120
)
11121121

1113-
for i, backendRef := range udpRoute.Spec.Rules[0].BackendRefs {
1122+
for i := range udpRoute.Spec.Rules[0].BackendRefs {
11141123
settingName := irDestinationSettingName(destName, i)
1115-
ds, _, err := t.processDestination(settingName, backendRef, parentRef, udpRoute, resources)
1124+
backendRefCtx := DirectBackendRef{BackendRef: &udpRoute.Spec.Rules[0].BackendRefs[i]}
1125+
ds, _, err := t.processDestination(settingName, backendRefCtx, parentRef, udpRoute, resources)
11161126
if err != nil {
11171127
resolveErrs.Add(err)
11181128
continue
@@ -1259,9 +1269,10 @@ func (t *Translator) processTCPRouteParentRefs(tcpRoute *TCPRouteContext, resour
12591269
destName = irRouteDestinationName(tcpRoute, -1 /*rule index*/)
12601270
)
12611271

1262-
for i, backendRef := range tcpRoute.Spec.Rules[0].BackendRefs {
1272+
for i := range tcpRoute.Spec.Rules[0].BackendRefs {
12631273
settingName := irDestinationSettingName(destName, i)
1264-
ds, _, err := t.processDestination(settingName, backendRef, parentRef, tcpRoute, resources)
1274+
backendRefCtx := DirectBackendRef{BackendRef: &tcpRoute.Spec.Rules[0].BackendRefs[i]}
1275+
ds, _, err := t.processDestination(settingName, backendRefCtx, parentRef, tcpRoute, resources)
12651276
// skip adding the route and provide the reason via route status.
12661277
if err != nil {
12671278
resolveErrs.Add(err)
@@ -1375,7 +1386,7 @@ func (t *Translator) processDestination(name string, backendRefContext BackendRe
13751386
) (ds *ir.DestinationSetting, unstructuredRef *ir.UnstructuredRef, err status.Error) {
13761387
routeType := route.GetRouteType()
13771388
weight := uint32(1)
1378-
backendRef := GetBackendRef(backendRefContext)
1389+
backendRef := backendRefContext.GetBackendRef()
13791390
if backendRef.Weight != nil {
13801391
weight = uint32(*backendRef.Weight)
13811392
}
@@ -1606,7 +1617,10 @@ func (t *Translator) processServiceDestinationSetting(
16061617
}
16071618

16081619
func getBackendFilters(routeType gwapiv1.Kind, backendRefContext BackendRefContext) (backendFilters any) {
1609-
filters := GetFilters(backendRefContext)
1620+
filters := backendRefContext.GetFilters()
1621+
if filters == nil {
1622+
return nil
1623+
}
16101624
switch routeType {
16111625
case resource.KindHTTPRoute:
16121626
if len(filters.([]gwapiv1.HTTPRouteFilter)) > 0 {

internal/gatewayapi/validate.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
func (t *Translator) validateBackendRef(backendRefContext BackendRefContext, route RouteContext,
3030
resources *resource.Resources, backendNamespace string, routeKind gwapiv1.Kind,
3131
) status.Error {
32-
backendRef := GetBackendRef(backendRefContext)
32+
backendRef := backendRefContext.GetBackendRef()
3333

3434
if err := t.validateBackendRefFilters(backendRefContext, routeKind); err != nil {
3535
return err
@@ -91,7 +91,10 @@ func (t *Translator) validateBackendRefKind(backendRef *gwapiv1a2.BackendRef) st
9191
}
9292

9393
func (t *Translator) validateBackendRefFilters(backendRef BackendRefContext, routeKind gwapiv1.Kind) status.Error {
94-
filters := GetFilters(backendRef)
94+
filters := backendRef.GetFilters()
95+
if filters == nil {
96+
return nil
97+
}
9598
var unsupportedFilters bool
9699

97100
switch routeKind {

0 commit comments

Comments
 (0)