@@ -209,30 +209,12 @@ func (t *Translator) buildUpstream(tctx *provider.TranslateContext, service *adc
209209 )
210210
211211 for _ , backend := range rule .Backends {
212- var backendErr error
213- upstream := adc .NewDefaultUpstream ()
214212 // try to get the apisixupstream with the same name as the backend service to be upstream config.
215213 // err is ignored because it does not care about the externalNodes of the apisixupstream.
216- auNN := types.NamespacedName {Namespace : ar .GetNamespace (), Name : backend .ServiceName }
217- if au , ok := tctx .Upstreams [auNN ]; ok {
218- upstream , _ = t .translateApisixUpstream (tctx , au )
219- }
220-
221- if backend .ResolveGranularity == apiv2 .ResolveGranularityService {
222- upstream .Nodes , backendErr = t .translateApisixRouteBackendResolveGranularityService (tctx , utils .NamespacedName (ar ), backend )
223- if backendErr != nil {
224- t .Log .Error (backendErr , "failed to translate ApisixRoute backend with ResolveGranularity Service" )
225- continue
226- }
227- } else {
228- upstream .Nodes , backendErr = t .translateApisixRouteBackendResolveGranularityEndpoint (tctx , utils .NamespacedName (ar ), backend )
229- if backendErr != nil {
230- t .Log .Error (backendErr , "failed to translate ApisixRoute backend with ResolveGranularity Endpoint" )
231- continue
232- }
233- }
234- if backend .Weight != nil {
235- upstream .Labels ["meta_weight" ] = strconv .FormatInt (int64 (* backend .Weight ), 10 )
214+ upstream , err := t .translateApisixRouteHTTPBackend (tctx , ar , backend )
215+ if err != nil {
216+ t .Log .Error (err , "failed to translate ApisixRoute backend" , "backend" , backend )
217+ continue
236218 }
237219
238220 upstreamName := adc .ComposeUpstreamName (ar .Namespace , backend .ServiceName , backend .Subset , backend .ServicePort , backend .ResolveGranularity )
@@ -348,6 +330,46 @@ func getPortFromService(svc *v1.Service, backendSvcPort intstr.IntOrString) (int
348330 return port , nil
349331}
350332
333+ func (t * Translator ) translateApisixRouteHTTPBackend (tctx * provider.TranslateContext , ar * apiv2.ApisixRoute , backend apiv2.ApisixRouteHTTPBackend ) (* adc.Upstream , error ) {
334+ auNN := types.NamespacedName {
335+ Namespace : ar .Namespace ,
336+ Name : backend .ServiceName ,
337+ }
338+ upstream := adc .NewDefaultUpstream ()
339+ if au , ok := tctx .Upstreams [auNN ]; ok {
340+ svc := tctx .Services [auNN ]
341+ if svc == nil {
342+ return nil , errors .Errorf ("service not found, ApisixRoute: %s, Service: %s" , utils .NamespacedName (ar ).String (), auNN )
343+ }
344+ port , err := getPortFromService (svc , backend .ServicePort )
345+ if err != nil {
346+ return nil , err
347+ }
348+ u , err := t .translateApisixUpstreamForPort (tctx , au , ptr .To (port ))
349+ if err != nil {
350+ return nil , err
351+ }
352+ upstream = u
353+ }
354+ var (
355+ err error
356+ nodes adc.UpstreamNodes
357+ )
358+ if backend .ResolveGranularity == apiv2 .ResolveGranularityService {
359+ nodes , err = t .translateApisixRouteBackendResolveGranularityService (tctx , auNN , backend )
360+ } else {
361+ nodes , err = t .translateApisixRouteBackendResolveGranularityEndpoint (tctx , auNN , backend )
362+ }
363+ if err != nil {
364+ return nil , err
365+ }
366+ upstream .Nodes = nodes
367+ if backend .Weight != nil {
368+ upstream .Labels ["meta_weight" ] = strconv .FormatInt (int64 (* backend .Weight ), 10 )
369+ }
370+ return upstream , nil
371+ }
372+
351373func (t * Translator ) translateApisixRouteBackendResolveGranularityService (tctx * provider.TranslateContext , arNN types.NamespacedName , backend apiv2.ApisixRouteHTTPBackend ) (adc.UpstreamNodes , error ) {
352374 serviceNN := types.NamespacedName {
353375 Namespace : arNN .Namespace ,
@@ -431,19 +453,39 @@ func (t *Translator) translateStreamRule(tctx *provider.TranslateContext, ar *ap
431453 svc .ID = id .GenID (svc .Name )
432454 svc .StreamRoutes = append (svc .StreamRoutes , sr )
433455
434- auNN := types.NamespacedName {Namespace : ar .GetNamespace (), Name : part .Backend .ServiceName }
435- upstream := adc .NewDefaultUpstream ()
436- if au , ok := tctx .Upstreams [auNN ]; ok {
437- upstream , _ = t .translateApisixUpstream (tctx , au )
438- }
439- nodes , err := t .translateApisixRouteStreamBackendResolveGranularity (tctx , utils .NamespacedName (ar ), part .Backend )
456+ upstream , err := t .translateApisixRouteStreamBackend (tctx , ar , part .Backend )
440457 if err != nil {
441458 return nil , err
442459 }
443- upstream .Nodes = nodes
444460 upstream .ID = ""
445461 upstream .Name = ""
446462
447463 svc .Upstream = upstream
448464 return svc , nil
449465}
466+
467+ func (t * Translator ) translateApisixRouteStreamBackend (tctx * provider.TranslateContext , ar * apiv2.ApisixRoute , backend apiv2.ApisixRouteStreamBackend ) (* adc.Upstream , error ) {
468+ auNN := types.NamespacedName {Namespace : ar .GetNamespace (), Name : backend .ServiceName }
469+ upstream := adc .NewDefaultUpstream ()
470+ if au , ok := tctx .Upstreams [auNN ]; ok {
471+ service := tctx .Services [auNN ]
472+ if service == nil {
473+ return nil , errors .Errorf ("service not found, ApisixRoute: %s, Service: %s" , utils .NamespacedName (ar ), auNN )
474+ }
475+ port , err := getPortFromService (service , backend .ServicePort )
476+ if err != nil {
477+ return nil , err
478+ }
479+ u , err := t .translateApisixUpstreamForPort (tctx , au , ptr .To (port ))
480+ if err != nil {
481+ return nil , err
482+ }
483+ upstream = u
484+ }
485+ nodes , err := t .translateApisixRouteStreamBackendResolveGranularity (tctx , utils .NamespacedName (ar ), backend )
486+ if err != nil {
487+ return nil , err
488+ }
489+ upstream .Nodes = nodes
490+ return upstream , nil
491+ }
0 commit comments