@@ -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,68 @@ 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 , port int32 ) (* adc.Upstream , error ) {
38+ log .Debugw ("translating ApisixUpstream" , zap .Any ("apisixupstream" , au ), zap .Int32 ("port" , port ))
39+
40+ ups := adc .NewDefaultUpstream ()
41+ ups .Name = composeExternalUpstreamName (au )
42+ maps .Copy (ups .Labels , au .Labels )
43+
44+ if err := translateApisixUpstreamConfig (tctx , & au .Spec .ApisixUpstreamConfig , ups ); err != nil {
45+ return nil , err
46+ }
47+ if err := translateApisixUpstreamExternalNodes (tctx , au , ups ); err != nil {
48+ return nil , err
49+ }
50+
51+ // If portLevelSettings is configured, we need to validate the ports in
52+ if len (au .Spec .PortLevelSettings ) > 0 && port != 0 {
53+ for _ , pls := range au .Spec .PortLevelSettings {
54+ if pls .Port != port {
55+ continue
56+ }
57+ if err := translateApisixUpstreamConfig (tctx , & pls .ApisixUpstreamConfig , ups ); err != nil {
58+ return nil , err
59+ }
60+ }
61+ }
62+
63+ log .Debugw ("translated ApisixUpstream" , zap .Any ("upstream" , ups ))
64+
65+ return ups , nil
66+ }
67+
68+ func translateApisixUpstreamConfig (tctx * provider.TranslateContext , config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) (err error ) {
69+ for _ , f := range []func (* apiv2.ApisixUpstreamConfig , * adc.Upstream ) error {
4070 translateApisixUpstreamScheme ,
4171 translateApisixUpstreamLoadBalancer ,
4272 translateApisixUpstreamRetriesAndTimeout ,
4373 translateApisixUpstreamPassHost ,
4474 translateUpstreamHealthCheck ,
4575 translateUpstreamDiscovery ,
4676 } {
47- if err = f (au , ups ); err != nil {
77+ if err = f (config , ups ); err != nil {
4878 return
4979 }
5080 }
51- for _ , f := range []func (* provider.TranslateContext , * apiv2.ApisixUpstream , * adc.Upstream ) error {
81+ for _ , f := range []func (* provider.TranslateContext , * apiv2.ApisixUpstreamConfig , * adc.Upstream ) error {
5282 translateApisixUpstreamClientTLS ,
53- translateApisixUpstreamExternalNodes ,
5483 } {
55- if err = f (tctx , au , ups ); err != nil {
84+ if err = f (tctx , config , ups ); err != nil {
5685 return
5786 }
5887 }
5988
60- log .Debugw ("translated ApisixUpstream" , zap .Any ("upstream" , ups ),
61- zap .String ("namespace" , au .Namespace ), zap .String ("name" , au .Name ))
6289 return
6390}
6491
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- }
70- return nil
71- }
72-
73- func translateApisixUpstreamScheme (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
74- ups .Scheme = cmp .Or (au .Spec .Scheme , apiv2 .SchemeHTTP )
92+ func translateApisixUpstreamScheme (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
93+ ups .Scheme = cmp .Or (config .Scheme , apiv2 .SchemeHTTP )
7594 return nil
7695}
7796
78- func translateApisixUpstreamLoadBalancer (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
79- lb := au . Spec .LoadBalancer
97+ func translateApisixUpstreamLoadBalancer (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
98+ lb := config .LoadBalancer
8099 if lb == nil || lb .Type == "" {
81100 ups .Type = apiv2 .LbRoundRobin
82101 return nil
@@ -107,9 +126,9 @@ func translateApisixUpstreamLoadBalancer(au *apiv2.ApisixUpstream, ups *adc.Upst
107126 return nil
108127}
109128
110- func translateApisixUpstreamRetriesAndTimeout (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
111- retries := au . Spec .Retries
112- timeout := au . Spec .Timeout
129+ func translateApisixUpstreamRetriesAndTimeout (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
130+ retries := config .Retries
131+ timeout := config .Timeout
113132
114133 if retries != nil && * retries < 0 {
115134 return errors .New ("invalid value retries" )
@@ -144,15 +163,15 @@ func translateApisixUpstreamRetriesAndTimeout(au *apiv2.ApisixUpstream, ups *adc
144163 return nil
145164}
146165
147- func translateApisixUpstreamClientTLS (tctx * provider.TranslateContext , au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
148- if au . Spec .TLSSecret == nil {
166+ func translateApisixUpstreamClientTLS (tctx * provider.TranslateContext , config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
167+ if config .TLSSecret == nil {
149168 return nil
150169 }
151170
152171 var (
153172 secretNN = types.NamespacedName {
154- Namespace : au . Spec .TLSSecret .Namespace ,
155- Name : au . Spec .TLSSecret .Name ,
173+ Namespace : config .TLSSecret .Namespace ,
174+ Name : config .TLSSecret .Name ,
156175 }
157176 )
158177 secret , ok := tctx .Secrets [secretNN ]
@@ -173,9 +192,9 @@ func translateApisixUpstreamClientTLS(tctx *provider.TranslateContext, au *apiv2
173192 return nil
174193}
175194
176- func translateApisixUpstreamPassHost (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
177- ups .PassHost = au . Spec .PassHost
178- ups .UpstreamHost = au . Spec .UpstreamHost
195+ func translateApisixUpstreamPassHost (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
196+ ups .PassHost = config .PassHost
197+ ups .UpstreamHost = config .UpstreamHost
179198
180199 return nil
181200}
@@ -259,11 +278,8 @@ func translateApisixUpstreamExternalNodesService(tctx *provider.TranslateContext
259278 return nil
260279}
261280
262- func translateUpstreamHealthCheck (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
263- if au == nil {
264- return nil
265- }
266- healcheck := au .Spec .HealthCheck
281+ func translateUpstreamHealthCheck (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
282+ healcheck := config .HealthCheck
267283 if healcheck == nil || (healcheck .Passive == nil && healcheck .Active == nil ) {
268284 return nil
269285 }
@@ -346,8 +362,8 @@ func translateUpstreamPassiveHealthCheck(config *apiv2.PassiveHealthCheck) *adc.
346362 return & passive
347363}
348364
349- func translateUpstreamDiscovery (au * apiv2.ApisixUpstream , ups * adc.Upstream ) error {
350- discovery := au . Spec .Discovery
365+ func translateUpstreamDiscovery (config * apiv2.ApisixUpstreamConfig , ups * adc.Upstream ) error {
366+ discovery := config .Discovery
351367 if discovery == nil {
352368 return nil
353369 }
0 commit comments