@@ -307,14 +307,18 @@ func (t *Translator) translateEndpointSlice(portName *string, weight int, endpoi
307307 return nodes
308308}
309309
310- func (t * Translator ) translateBackendRef (tctx * provider.TranslateContext , ref gatewayv1.BackendRef ) adctypes.UpstreamNodes {
310+ func (t * Translator ) translateBackendRef (tctx * provider.TranslateContext , ref gatewayv1.BackendRef ) (adctypes.UpstreamNodes , error ) {
311+ if ref .Kind != nil && * ref .Kind != "Service" {
312+ return adctypes.UpstreamNodes {}, fmt .Errorf ("kind %s is not supported" , * ref .Kind )
313+ }
314+
311315 key := types.NamespacedName {
312316 Namespace : string (* ref .Namespace ),
313317 Name : string (ref .Name ),
314318 }
315319 service , ok := tctx .Services [key ]
316320 if ! ok {
317- return adctypes.UpstreamNodes {}
321+ return adctypes.UpstreamNodes {}, fmt . Errorf ( "service %s not found" , key )
318322 }
319323
320324 weight := 1
@@ -333,7 +337,7 @@ func (t *Translator) translateBackendRef(tctx *provider.TranslateContext, ref ga
333337 Port : port ,
334338 Weight : weight ,
335339 },
336- }
340+ }, nil
337341 }
338342
339343 var portName * string
@@ -345,12 +349,12 @@ func (t *Translator) translateBackendRef(tctx *provider.TranslateContext, ref ga
345349 }
346350 }
347351 if portName == nil {
348- return adctypes.UpstreamNodes {}
352+ return adctypes.UpstreamNodes {}, nil
349353 }
350354 }
351355
352356 endpointSlices := tctx .EndpointSlices [key ]
353- return t .translateEndpointSlice (portName , weight , endpointSlices )
357+ return t .translateEndpointSlice (portName , weight , endpointSlices ), nil
354358}
355359
356360// calculateHTTPRoutePriority calculates the priority of the HTTP route.
@@ -424,12 +428,17 @@ func (t *Translator) TranslateHTTPRoute(tctx *provider.TranslateContext, httpRou
424428
425429 for ruleIndex , rule := range rules {
426430 upstream := adctypes .NewDefaultUpstream ()
431+ var backendErr error
427432 for _ , backend := range rule .BackendRefs {
428433 if backend .Namespace == nil {
429434 namespace := gatewayv1 .Namespace (httpRoute .Namespace )
430435 backend .Namespace = & namespace
431436 }
432- upNodes := t .translateBackendRef (tctx , backend .BackendRef )
437+ upNodes , err := t .translateBackendRef (tctx , backend .BackendRef )
438+ if err != nil {
439+ backendErr = err
440+ continue
441+ }
433442 t .AttachBackendTrafficPolicyToUpstream (backend .BackendRef , tctx .BackendTrafficPolicies , upstream )
434443 upstream .Nodes = append (upstream .Nodes , upNodes ... )
435444 }
@@ -443,6 +452,19 @@ func (t *Translator) TranslateHTTPRoute(tctx *provider.TranslateContext, httpRou
443452 service .ID = id .GenID (service .Name )
444453 service .Hosts = hosts
445454 service .Upstream = upstream
455+
456+ if backendErr != nil && len (upstream .Nodes ) == 0 {
457+ if service .Plugins == nil {
458+ service .Plugins = make (map [string ]any )
459+ }
460+ service .Plugins ["fault-injection" ] = map [string ]any {
461+ "abort" : map [string ]any {
462+ "http_status" : 500 ,
463+ "body" : "No existing backendRef provided" ,
464+ },
465+ }
466+ }
467+
446468 t .fillPluginsFromHTTPRouteFilters (service .Plugins , httpRoute .GetNamespace (), rule .Filters , rule .Matches , tctx )
447469
448470 matches := rule .Matches
0 commit comments