From 174158851698a8f0f7b3f0ff4eba74c1e60eb044 Mon Sep 17 00:00:00 2001 From: Tommy Chen Date: Fri, 26 Apr 2024 15:48:41 +0800 Subject: [PATCH] Support multiple backend refs Signed-off-by: Tommy Chen --- pkg/plugin/httproute.go | 16 ++++++++++++---- pkg/plugin/plugin.go | 8 +++++--- pkg/plugin/tcproute.go | 16 ++++++++++++---- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/pkg/plugin/httproute.go b/pkg/plugin/httproute.go index 28a39e1..7baca49 100644 --- a/pkg/plugin/httproute.go +++ b/pkg/plugin/httproute.go @@ -32,21 +32,29 @@ func (r *RpcPlugin) setHTTPRouteWeight(rollout *v1alpha1.Rollout, desiredWeight canaryServiceName := rollout.Spec.Strategy.Canary.CanaryService stableServiceName := rollout.Spec.Strategy.Canary.StableService routeRuleList := HTTPRouteRuleList(httpRoute.Spec.Rules) - canaryBackendRef, err := getBackendRef[*HTTPBackendRef, *HTTPRouteRule](canaryServiceName, routeRuleList) + canaryBackendRefs, err := getBackendRefs(canaryServiceName, routeRuleList) if err != nil { return pluginTypes.RpcError{ ErrorString: err.Error(), } } - canaryBackendRef.Weight = &desiredWeight - stableBackendRef, err := getBackendRef[*HTTPBackendRef, *HTTPRouteRule](stableServiceName, routeRuleList) + + for _, ref := range canaryBackendRefs { + ref.Weight = &desiredWeight + } + + stableBackendRefs, err := getBackendRefs(stableServiceName, routeRuleList) if err != nil { return pluginTypes.RpcError{ ErrorString: err.Error(), } } restWeight := 100 - desiredWeight - stableBackendRef.Weight = &restWeight + + for _, ref := range stableBackendRefs { + ref.Weight = &restWeight + } + updatedHTTPRoute, err := httpRouteClient.Update(ctx, httpRoute, metav1.UpdateOptions{}) if r.IsTest { r.UpdatedHTTPRouteMock = updatedHTTPRoute diff --git a/pkg/plugin/plugin.go b/pkg/plugin/plugin.go index e82723c..43f6309 100644 --- a/pkg/plugin/plugin.go +++ b/pkg/plugin/plugin.go @@ -201,19 +201,21 @@ func getRouteRule[T1 GatewayAPIBackendRef, T2 GatewayAPIRouteRule[T1], T3 Gatewa return nil, routeRuleList.Error() } -func getBackendRef[T1 GatewayAPIBackendRef, T2 GatewayAPIRouteRule[T1], T3 GatewayAPIRouteRuleList[T1, T2]](backendRefName string, routeRuleList T3) (T1, error) { +func getBackendRefs[T1 GatewayAPIBackendRef, T2 GatewayAPIRouteRule[T1], T3 GatewayAPIRouteRuleList[T1, T2]](backendRefName string, routeRuleList T3) ([]T1, error) { var backendRef T1 var routeRule T2 + var matchedRefs []T1 + for next, hasNext := routeRuleList.Iterator(); hasNext; { routeRule, hasNext = next() for next, hasNext := routeRule.Iterator(); hasNext; { backendRef, hasNext = next() if backendRefName == backendRef.GetName() { - return backendRef, nil + matchedRefs = append(matchedRefs, backendRef) } } } - return nil, routeRuleList.Error() + return matchedRefs, routeRuleList.Error() } func removeManagedRouteEntry(managedRouteMap ManagedRouteMap, routeRuleList HTTPRouteRuleList, managedRouteName string, httpRouteName string) (HTTPRouteRuleList, error) { diff --git a/pkg/plugin/tcproute.go b/pkg/plugin/tcproute.go index 2335075..3180c12 100644 --- a/pkg/plugin/tcproute.go +++ b/pkg/plugin/tcproute.go @@ -26,21 +26,29 @@ func (r *RpcPlugin) setTCPRouteWeight(rollout *v1alpha1.Rollout, desiredWeight i canaryServiceName := rollout.Spec.Strategy.Canary.CanaryService stableServiceName := rollout.Spec.Strategy.Canary.StableService routeRuleList := TCPRouteRuleList(tcpRoute.Spec.Rules) - canaryBackendRef, err := getBackendRef[*TCPBackendRef, *TCPRouteRule](canaryServiceName, routeRuleList) + canaryBackendRefs, err := getBackendRefs(canaryServiceName, routeRuleList) if err != nil { return pluginTypes.RpcError{ ErrorString: err.Error(), } } - canaryBackendRef.Weight = &desiredWeight - stableBackendRef, err := getBackendRef[*TCPBackendRef, *TCPRouteRule](stableServiceName, routeRuleList) + + for _, ref := range canaryBackendRefs { + ref.Weight = &desiredWeight + } + + stableBackendRefs, err := getBackendRefs(stableServiceName, routeRuleList) if err != nil { return pluginTypes.RpcError{ ErrorString: err.Error(), } } restWeight := 100 - desiredWeight - stableBackendRef.Weight = &restWeight + + for _, ref := range stableBackendRefs { + ref.Weight = &restWeight + } + updatedTCPRoute, err := tcpRouteClient.Update(ctx, tcpRoute, metav1.UpdateOptions{}) if r.IsTest { r.UpdatedTCPRouteMock = updatedTCPRoute