File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -102,19 +102,7 @@ func (r *RpcPlugin) setGRPCHeaderRoute(rollout *v1alpha1.Rollout, headerRouting
102102
103103 canaryServiceKind := gatewayv1 .Kind ("Service" )
104104 canaryServiceGroup := gatewayv1 .Group ("" )
105-
106- // Filter to only unmanaged rules (rules without a Name, or with a Name not in managedRoutes)
107- // This ensures getRouteRule only searches through weight-splitting rules, not header routes
108- managedNames := managedRouteNamesSet (rollout )
109- unmanagedRules := []gatewayv1.GRPCRouteRule {}
110- for _ , rule := range grpcRoute .Spec .Rules {
111- // Keep rules that have no name OR have a name that's not managed
112- if rule .Name == nil || ! managedNames [string (* rule .Name )] {
113- unmanagedRules = append (unmanagedRules , rule )
114- }
115- }
116-
117- grpcRouteRuleList := GRPCRouteRuleList (unmanagedRules )
105+ grpcRouteRuleList := GRPCRouteRuleList (grpcRoute .Spec .Rules )
118106 backendRefNameList := []string {string (canaryServiceName ), stableServiceName }
119107 grpcRouteRule , err := getRouteRule (grpcRouteRuleList , backendRefNameList ... )
120108 if err != nil {
Original file line number Diff line number Diff line change @@ -107,19 +107,7 @@ func (r *RpcPlugin) setHTTPHeaderRoute(rollout *v1alpha1.Rollout, headerRouting
107107
108108 canaryServiceKind := gatewayv1 .Kind ("Service" )
109109 canaryServiceGroup := gatewayv1 .Group ("" )
110-
111- // Filter to only unmanaged rules (rules without a Name, or with a Name not in managedRoutes)
112- // This ensures getRouteRule only searches through weight-splitting rules, not header routes
113- managedNames := managedRouteNamesSet (rollout )
114- unmanagedRules := []gatewayv1.HTTPRouteRule {}
115- for _ , rule := range httpRoute .Spec .Rules {
116- // Keep rules that have no name OR have a name that's not managed
117- if rule .Name == nil || ! managedNames [string (* rule .Name )] {
118- unmanagedRules = append (unmanagedRules , rule )
119- }
120- }
121-
122- httpRouteRuleList := HTTPRouteRuleList (unmanagedRules )
110+ httpRouteRuleList := HTTPRouteRuleList (httpRoute .Spec .Rules )
123111 backendRefNameList := []string {string (canaryServiceName ), stableServiceName }
124112 httpRouteRule , err := getRouteRule (httpRouteRuleList , backendRefNameList ... )
125113 if err != nil {
Original file line number Diff line number Diff line change 1+ apiVersion : gateway.networking.k8s.io/v1
2+ kind : GRPCRoute
3+ metadata :
4+ name : grpcroute-hbw
5+ namespace : default
6+ spec :
7+ (length(rules)) : 1
8+ rules :
9+ - backendRefs :
10+ - name : argo-rollouts-stable-service
11+ - name : argo-rollouts-canary-service
12+ (weight) : 0
Original file line number Diff line number Diff line change 1+ apiVersion : gateway.networking.k8s.io/v1
2+ kind : GRPCRoute
3+ metadata :
4+ name : grpcroute-hbw
5+ namespace : default
6+ spec :
7+ (length(rules)) : 1
8+ rules :
9+ - backendRefs :
10+ - name : argo-rollouts-stable-service
11+ - name : argo-rollouts-canary-service
12+ (weight) : 0
Original file line number Diff line number Diff line change 1+ apiVersion : gateway.networking.k8s.io/v1
2+ kind : GRPCRoute
3+ metadata :
4+ name : grpcroute-hbw
5+ namespace : default
6+ spec :
7+ (length(rules)) : 2
8+ rules :
9+ - backendRefs :
10+ - name : argo-rollouts-stable-service
11+ (weight) : 70
12+ - name : argo-rollouts-canary-service
13+ (weight) : 30
14+ - name : canary-route1
15+ matches :
16+ - headers :
17+ - name : X-Canary
18+ type : Exact
19+ value : " true"
20+ backendRefs :
21+ - name : argo-rollouts-canary-service
Original file line number Diff line number Diff line change 1+ apiVersion : argoproj.io/v1alpha1
2+ kind : Rollout
3+ metadata :
4+ name : grpcroute-hbw-rollout
5+ namespace : default
6+ status :
7+ (phase == 'Healthy') : true
Original file line number Diff line number Diff line change 1+ apiVersion : chainsaw.kyverno.io/v1alpha1
2+ kind : Test
3+ metadata :
4+ name : grpcroute-header-before-weight
5+ labels :
6+ route-type : grpc
7+ test-scope : headers
8+ spec :
9+ description : >
10+ Verifies that setHeaderRoute before setWeight works correctly for GRPCRoute
11+ (issues #158, #169). When setHeaderRoute fires first (initial weight is 0), the
12+ subsequent setWeight(0) call must NOT overwrite the header-route rule's canary
13+ backend weight to 0. The header-route rule must deliver traffic to the canary
14+ regardless of weight percentage.
15+ namespace : default
16+ concurrent : false
17+
18+ steps :
19+ - name : create-resources
20+ try :
21+ - apply :
22+ file : resources/grpcroute.yaml
23+ - apply :
24+ file : resources/rollout.yaml
25+
26+ - name : assert-initial-state
27+ try :
28+ - assert :
29+ timeout : 30s
30+ file : assertions/grpcroute-initial.yaml
31+
32+ - name : wait-for-initial-healthy
33+ try :
34+ - assert :
35+ timeout : 5m
36+ file : assertions/rollout-healthy.yaml
37+
38+ - name : trigger-canary
39+ description : Steps are setHeaderRoute -> setWeight:30 -> pause:30s.
40+ try :
41+ - patch :
42+ resource :
43+ apiVersion : argoproj.io/v1alpha1
44+ kind : Rollout
45+ metadata :
46+ name : grpcroute-hbw-rollout
47+ namespace : default
48+ spec :
49+ template :
50+ spec :
51+ containers :
52+ - name : rollouts-demo
53+ image : argoproj/rollouts-demo:green
54+
55+ - name : assert-active
56+ description : >
57+ Weight-split rule has 70/30; header-route rule has canary only with no explicit
58+ weight (not 0). This proves setWeight did not clobber the header rule.
59+ try :
60+ - assert :
61+ timeout : 2m
62+ file : assertions/grpcroute-with-header-route.yaml
63+
64+ - name : assert-rollout-healthy
65+ try :
66+ - assert :
67+ timeout : 5m
68+ file : assertions/rollout-healthy.yaml
69+
70+ - name : assert-cleanup
71+ try :
72+ - assert :
73+ timeout : 60s
74+ file : assertions/grpcroute-after-cleanup.yaml
Original file line number Diff line number Diff line change 1+ apiVersion : gateway.networking.k8s.io/v1
2+ kind : GRPCRoute
3+ metadata :
4+ name : grpcroute-hbw
5+ namespace : default
6+ spec :
7+ parentRefs :
8+ - name : traefik-gateway
9+ rules :
10+ - backendRefs :
11+ - name : argo-rollouts-stable-service
12+ port : 80
13+ - name : argo-rollouts-canary-service
14+ port : 80
Original file line number Diff line number Diff line change 1+ apiVersion : argoproj.io/v1alpha1
2+ kind : Rollout
3+ metadata :
4+ name : grpcroute-hbw-rollout
5+ namespace : default
6+ spec :
7+ replicas : 2
8+ strategy :
9+ canary :
10+ canaryService : argo-rollouts-canary-service
11+ stableService : argo-rollouts-stable-service
12+ trafficRouting :
13+ managedRoutes :
14+ - name : canary-route1
15+ plugins :
16+ argoproj-labs/gatewayAPI :
17+ grpcRoutes :
18+ - name : grpcroute-hbw
19+ useHeaderRoutes : true
20+ namespace : default
21+ steps :
22+ - setHeaderRoute :
23+ name : canary-route1
24+ match :
25+ - headerName : X-Canary
26+ headerValue :
27+ exact : " true"
28+ - setWeight : 30
29+ - pause : {duration: 30s}
30+ revisionHistoryLimit : 2
31+ selector :
32+ matchLabels :
33+ app : rollouts-demo
34+ template :
35+ metadata :
36+ labels :
37+ app : rollouts-demo
38+ spec :
39+ containers :
40+ - name : rollouts-demo
41+ image : argoproj/rollouts-demo:red
42+ ports :
43+ - name : http
44+ containerPort : 8080
45+ protocol : TCP
Original file line number Diff line number Diff line change 1+ apiVersion : gateway.networking.k8s.io/v1
2+ kind : GRPCRoute
3+ metadata :
4+ name : grpcroute-wbh
5+ namespace : default
6+ spec :
7+ (length(rules)) : 1
8+ rules :
9+ - backendRefs :
10+ - name : argo-rollouts-stable-service
11+ - name : argo-rollouts-canary-service
12+ (weight) : 0
You can’t perform that action at this time.
0 commit comments