@@ -20,6 +20,7 @@ package translator
2020import (
2121 "cmp"
2222 "fmt"
23+ "maps"
2324
2425 "github.com/api7/gopkg/pkg/log"
2526 "github.com/pkg/errors"
@@ -33,50 +34,78 @@ import (
3334 "github.com/apache/apisix-ingress-controller/internal/utils"
3435)
3536
36- func (t * Translator ) translateApisixUpstream (tctx * provider.TranslateContext , au * apiv2.ApisixUpstream ) (ups * adc.Upstream , err error ) {
37- ups = adc .NewDefaultUpstream ()
38- for _ , f := range []func (* apiv2.ApisixUpstream , * adc.Upstream ) error {
39- patchApisixUpstreamBasics ,
37+ func (t * Translator ) translateApisixUpstream (tctx * provider.TranslateContext , au * apiv2.ApisixUpstream ) (* adc.Upstream , error ) {
38+ return t .translateApisixUpstreamForPort (tctx , au , nil )
39+ }
40+
41+ func (t * Translator ) translateApisixUpstreamForPort (tctx * provider.TranslateContext , au * apiv2.ApisixUpstream , port * int32 ) (* adc.Upstream , error ) {
42+ log .Debugw ("translating ApisixUpstream" , zap .Any ("apisixupstream" , au ), zap .Int32p ("port" , port ))
43+
44+ ups := adc .NewDefaultUpstream ()
45+ ups .Name = composeExternalUpstreamName (au )
46+ maps .Copy (ups .Labels , au .Labels )
47+
48+ // translateApisixUpstreamConfig translates the core upstream configuration fields
49+ // from au.Spec.ApisixUpstreamConfig into the ADC upstream.
50+ //
51+ // Note: ExternalNodes is not part of ApisixUpstreamConfig but a separate field
52+ // on ApisixUpstreamSpec, so it is handled separately in translateApisixUpstreamExternalNodes.
53+ if err := translateApisixUpstreamConfig (tctx , & au .Spec .ApisixUpstreamConfig , ups ); err != nil {
54+ return nil , err
55+ }
56+ if err := translateApisixUpstreamExternalNodes (tctx , au , ups ); err != nil {
57+ return nil , err
58+ }
59+
60+ // If PortLevelSettings is configured and a specific port is provided,
61+ // apply the ApisixUpstreamConfig for the matching port to the upstream.
62+ if len (au .Spec .PortLevelSettings ) > 0 && port != nil {
63+ for _ , pls := range au .Spec .PortLevelSettings {
64+ if pls .Port != * port {
65+ continue
66+ }
67+ if err := translateApisixUpstreamConfig (tctx , & pls .ApisixUpstreamConfig , ups ); err != nil {
68+ return nil , err
69+ }
70+ }
71+ }
72+
73+ log .Debugw ("translated ApisixUpstream" , zap .Any ("upstream" , ups ))
74+
75+ return ups , nil
76+ }
77+
78+ func translateApisixUpstreamConfig (tctx * provider.TranslateContext , config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) (err error ) {
79+ for _ , f := range []func (* apiv2.ApisixUpstreamConfig , * adc.Upstream ) error {
4080 translateApisixUpstreamScheme ,
4181 translateApisixUpstreamLoadBalancer ,
4282 translateApisixUpstreamRetriesAndTimeout ,
4383 translateApisixUpstreamPassHost ,
4484 translateUpstreamHealthCheck ,
4585 translateUpstreamDiscovery ,
4686 } {
47- if err = f (au , ups ); err != nil {
87+ if err = f (config , ups ); err != nil {
4888 return
4989 }
5090 }
51- for _ , f := range []func (* provider.TranslateContext , * apiv2.ApisixUpstream , * adc.Upstream ) error {
91+ for _ , f := range []func (* provider.TranslateContext , * apiv2.ApisixUpstreamConfig , * adc.Upstream ) error {
5292 translateApisixUpstreamClientTLS ,
53- translateApisixUpstreamExternalNodes ,
5493 } {
55- if err = f (tctx , au , ups ); err != nil {
94+ if err = f (tctx , config , ups ); err != nil {
5695 return
5796 }
5897 }
5998
60- log .Debugw ("translated ApisixUpstream" , zap .Any ("upstream" , ups ),
61- zap .String ("namespace" , au .Namespace ), zap .String ("name" , au .Name ))
6299 return
63100}
64101
65- func patchApisixUpstreamBasics (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
66- ups .Name = composeExternalUpstreamName (au )
67- for k , v := range au .Labels {
68- ups .Labels [k ] = v
69- }
102+ func translateApisixUpstreamScheme (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
103+ ups .Scheme = cmp .Or (config .Scheme , apiv2 .SchemeHTTP )
70104 return nil
71105}
72106
73- func translateApisixUpstreamScheme (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
74- ups .Scheme = cmp .Or (au .Spec .Scheme , apiv2 .SchemeHTTP )
75- return nil
76- }
77-
78- func translateApisixUpstreamLoadBalancer (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
79- lb := au .Spec .LoadBalancer
107+ func translateApisixUpstreamLoadBalancer (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
108+ lb := config .LoadBalancer
80109 if lb == nil || lb .Type == "" {
81110 ups .Type = apiv2 .LbRoundRobin
82111 return nil
@@ -107,9 +136,9 @@ func translateApisixUpstreamLoadBalancer(au *apiv2.ApisixUpstream, ups *adc.Upst
107136 return nil
108137}
109138
110- func translateApisixUpstreamRetriesAndTimeout (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
111- retries := au . Spec .Retries
112- timeout := au . Spec .Timeout
139+ func translateApisixUpstreamRetriesAndTimeout (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
140+ retries := config .Retries
141+ timeout := config .Timeout
113142
114143 if retries != nil && * retries < 0 {
115144 return errors .New ("invalid value retries" )
@@ -144,15 +173,15 @@ func translateApisixUpstreamRetriesAndTimeout(au *apiv2.ApisixUpstream, ups *adc
144173 return nil
145174}
146175
147- func translateApisixUpstreamClientTLS (tctx * provider.TranslateContext , au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
148- if au . Spec .TLSSecret == nil {
176+ func translateApisixUpstreamClientTLS (tctx * provider.TranslateContext , config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
177+ if config .TLSSecret == nil {
149178 return nil
150179 }
151180
152181 var (
153182 secretNN = types.NamespacedName {
154- Namespace : au . Spec .TLSSecret .Namespace ,
155- Name : au . Spec .TLSSecret .Name ,
183+ Namespace : config .TLSSecret .Namespace ,
184+ Name : config .TLSSecret .Name ,
156185 }
157186 )
158187 secret , ok := tctx .Secrets [secretNN ]
@@ -173,9 +202,9 @@ func translateApisixUpstreamClientTLS(tctx *provider.TranslateContext, au *apiv2
173202 return nil
174203}
175204
176- func translateApisixUpstreamPassHost (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
177- ups .PassHost = au . Spec .PassHost
178- ups .UpstreamHost = au . Spec .UpstreamHost
205+ func translateApisixUpstreamPassHost (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
206+ ups .PassHost = config .PassHost
207+ ups .UpstreamHost = config .UpstreamHost
179208
180209 return nil
181210}
@@ -259,11 +288,8 @@ func translateApisixUpstreamExternalNodesService(tctx *provider.TranslateContext
259288 return nil
260289}
261290
262- func translateUpstreamHealthCheck (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
263- if au == nil {
264- return nil
265- }
266- healcheck := au .Spec .HealthCheck
291+ func translateUpstreamHealthCheck (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
292+ healcheck := config .HealthCheck
267293 if healcheck == nil || (healcheck .Passive == nil && healcheck .Active == nil ) {
268294 return nil
269295 }
@@ -346,8 +372,8 @@ func translateUpstreamPassiveHealthCheck(config *apiv2.PassiveHealthCheck) *adc.
346372 return & passive
347373}
348374
349- func translateUpstreamDiscovery (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
350- discovery := au . Spec .Discovery
375+ func translateUpstreamDiscovery (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
376+ discovery := config .Discovery
351377 if discovery == nil {
352378 return nil
353379 }
0 commit comments