@@ -18,8 +18,7 @@ const (
1818 RequestMirror = "proxy-mirror"
1919)
2020
21- func (t * Translator ) generatePluginsFromHTTPRouteFilters (namespace string , filters []gatewayv1.HTTPRouteFilter ) v1.Plugins {
22- plugins := v1.Plugins {}
21+ func (t * Translator ) fillPluginsFromHTTPRouteFilters (plugins v1.Plugins , namespace string , filters []gatewayv1.HTTPRouteFilter ) {
2322 for _ , filter := range filters {
2423 switch filter .Type {
2524 case gatewayv1 .HTTPRouteFilterRequestHeaderModifier :
@@ -34,7 +33,6 @@ func (t *Translator) generatePluginsFromHTTPRouteFilters(namespace string, filte
3433 t .fillPluginFromHTTPResponseHeaderFilter (plugins , filter .ResponseHeaderModifier )
3534 }
3635 }
37- return plugins
3836}
3937
4038func (t * Translator ) fillPluginFromHTTPRequestHeaderFilter (plugins v1.Plugins , reqHeaderModifier * gatewayv1.HTTPHeaderFilter ) {
@@ -158,7 +156,7 @@ func (t *Translator) fillPluginFromHTTPRequestRedirectFilter(plugins v1.Plugins,
158156 plugin .URI = uri
159157}
160158
161- func (t * Translator ) translateEndpointSlice (endpointSlices []discoveryv1.EndpointSlice , weight int ) v1.UpstreamNodes {
159+ func (t * Translator ) translateEndpointSlice (endpointSlices []discoveryv1.EndpointSlice ) v1.UpstreamNodes {
162160 var nodes v1.UpstreamNodes
163161 if len (endpointSlices ) == 0 {
164162 return nodes
@@ -170,7 +168,7 @@ func (t *Translator) translateEndpointSlice(endpointSlices []discoveryv1.Endpoin
170168 node := v1.UpstreamNode {
171169 Host : addr ,
172170 Port : int (* port .Port ),
173- Weight : weight ,
171+ Weight : 1 ,
174172 }
175173 nodes = append (nodes , node )
176174 }
@@ -188,11 +186,7 @@ func (t *Translator) translateBackendRef(tctx *TranslateContext, ref gatewayv1.B
188186 Name : string (ref .Name ),
189187 }]
190188
191- weight := 100
192- if ref .Weight != nil {
193- weight = int (* ref .Weight )
194- }
195- upstream .Nodes = t .translateEndpointSlice (endpointSlices , weight )
189+ upstream .Nodes = t .translateEndpointSlice (endpointSlices )
196190 return upstream
197191}
198192
@@ -207,6 +201,8 @@ func (t *Translator) TranslateGatewayHTTPRoute(tctx *TranslateContext, httpRoute
207201 rules := httpRoute .Spec .Rules
208202
209203 for i , rule := range rules {
204+
205+ var weightedUpstreams []v1.TrafficSplitConfigRuleWeightedUpstream
210206 upstreams := []* v1.Upstream {}
211207 for _ , backend := range rule .BackendRefs {
212208 if backend .Namespace == nil {
@@ -226,27 +222,47 @@ func (t *Translator) TranslateGatewayHTTPRoute(tctx *TranslateContext, httpRoute
226222 },
227223 }
228224 }
225+
226+ weight := 100
227+ if backend .Weight != nil {
228+ weight = int (* backend .Weight )
229+ }
230+ weightedUpstreams = append (weightedUpstreams , v1.TrafficSplitConfigRuleWeightedUpstream {
231+ Upstream : upstream ,
232+ Weight : weight ,
233+ })
229234 }
230235
231- service := v1 .NewDefaultService ()
232- if len (upstreams ) > 0 {
233- service .Upstream = upstreams [0 ]
234- // TODO: support multiple upstreams
235- } else if len (upstreams ) == 0 {
236- service .Upstream = v1 .NewDefaultUpstream ()
237- service .Upstream .Nodes = v1.UpstreamNodes {
236+ if len (upstreams ) == 0 {
237+ upstream := v1 .NewDefaultUpstream ()
238+ upstream .Nodes = v1.UpstreamNodes {
238239 {
239240 Host : "0.0.0.0" ,
240241 Port : 80 ,
241242 Weight : 100 ,
242243 },
243244 }
245+ upstreams = append (upstreams , upstream )
244246 }
247+
248+ service := v1 .NewDefaultService ()
249+ service .Upstream = upstreams [0 ]
250+ if len (weightedUpstreams ) > 1 {
251+ weightedUpstreams [0 ].Upstream = nil
252+ service .Plugins ["traffic-split" ] = & v1.TrafficSplitConfig {
253+ Rules : []v1.TrafficSplitConfigRule {
254+ {
255+ WeightedUpstreams : weightedUpstreams ,
256+ },
257+ },
258+ }
259+ }
260+
245261 service .Name = v1 .ComposeServiceNameWithRule (httpRoute .Namespace , httpRoute .Name , fmt .Sprintf ("%d" , i ))
246262 service .ID = id .GenID (service .Name )
247263 service .Labels = label .GenLabel (httpRoute )
248264 service .Hosts = hosts
249- service .Plugins = t . generatePluginsFromHTTPRouteFilters ( httpRoute .GetNamespace (), rule .Filters )
265+ t . fillPluginsFromHTTPRouteFilters ( service .Plugins , httpRoute .GetNamespace (), rule .Filters )
250266
251267 result .Services = append (result .Services , service )
252268
0 commit comments