Skip to content

Commit fdd7fb4

Browse files
authored
[v2.2.x] apply TrafficPolicy retries per route (#14304) (#14392)
Signed-off-by: omar <omar.hammami@solo.io>
1 parent 8193c04 commit fdd7fb4

5 files changed

Lines changed: 280 additions & 33 deletions

File tree

pkg/kgateway/extensions2/plugins/trafficpolicy/traffic_policy_plugin.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,16 @@ func (p *trafficPolicyPluginGwPass) ApplyVhostPlugin(
375375
return
376376
}
377377

378-
p.handlePerVHostPolicies(policy.spec, out)
378+
// Apply the retry policy to each route rather than to the vhost. A route-level
379+
// retry policy (set by a more specific TrafficPolicy or the builtin HTTPRouteRetry
380+
// policy) fully overrides the vhost-level one in Envoy, so applying it per route
381+
// keeps that precedence explicit and consistent with the other per-route settings.
382+
if policy.spec.retry != nil {
383+
for _, route := range out.Routes {
384+
applyRetryPolicy(policy.spec.retry, route)
385+
}
386+
}
387+
379388
p.handlePolicies(pCtx.FilterChainName, &pCtx.TypedFilterConfig, policy.spec)
380389
}
381390

@@ -696,23 +705,26 @@ func (p *trafficPolicyPluginGwPass) handlePerRoutePolicies(
696705
}
697706
}
698707

699-
// Only set the retry policy if it is not already set, which implies that it was
700-
// set by the builtin HTTPRouteRetry policy
701-
if action.GetRetryPolicy() == nil && spec.retry != nil {
702-
action.RetryPolicy = spec.retry.policy
703-
}
708+
applyRetryPolicy(spec.retry, out)
704709

705710
// Apply URL rewrite configuration
706711
applyURLRewrite(spec.urlRewrite, out)
707712
}
708713

709-
// handlePerVHostPolicies handles policies that are meant to be processed at the vhost level
710-
func (p *trafficPolicyPluginGwPass) handlePerVHostPolicies(
711-
spec trafficPolicySpecIr,
712-
out *envoyroutev3.VirtualHost,
713-
) {
714-
if spec.retry != nil {
715-
out.RetryPolicy = spec.retry.policy
714+
func applyRetryPolicy(retry *retryIR, out *envoyroutev3.Route) {
715+
if retry == nil || out == nil {
716+
return
717+
}
718+
719+
action := out.GetRoute()
720+
if action == nil {
721+
return
722+
}
723+
724+
// Only set the retry policy if it is not already set, which implies that it was
725+
// set by the builtin HTTPRouteRetry policy or a more specific TrafficPolicy.
726+
if action.GetRetryPolicy() == nil {
727+
action.RetryPolicy = retry.policy
716728
}
717729
}
718730

pkg/kgateway/translator/gateway/gateway_translator_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,17 @@ func TestBasic(t *testing.T) {
11081108
})
11091109
})
11101110

1111+
t.Run("TrafficPolicy HTTPS retry", func(t *testing.T) {
1112+
test(t, translatorTestCase{
1113+
inputFile: "traffic-policy/https-retry.yaml",
1114+
outputFile: "traffic-policy/https-retry.yaml",
1115+
gwNN: types.NamespacedName{
1116+
Namespace: "default",
1117+
Name: "example-gateway",
1118+
},
1119+
})
1120+
})
1121+
11111122
t.Run("http gateway with session persistence (cookie)", func(t *testing.T) {
11121123
test(t, translatorTestCase{
11131124
inputFile: "session-persistence/cookie.yaml",
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
apiVersion: gateway.networking.k8s.io/v1
2+
kind: Gateway
3+
metadata:
4+
name: example-gateway
5+
spec:
6+
gatewayClassName: example-gateway-class
7+
listeners:
8+
- name: https
9+
protocol: HTTPS
10+
port: 443
11+
tls:
12+
mode: Terminate
13+
certificateRefs:
14+
- name: https
15+
kind: Secret
16+
---
17+
apiVersion: gateway.networking.k8s.io/v1
18+
kind: HTTPRoute
19+
metadata:
20+
name: example-route
21+
spec:
22+
parentRefs:
23+
- name: example-gateway
24+
hostnames:
25+
- "example.com"
26+
rules:
27+
- backendRefs:
28+
- name: example-svc
29+
port: 80
30+
---
31+
apiVersion: v1
32+
kind: Service
33+
metadata:
34+
name: example-svc
35+
spec:
36+
selector:
37+
test: test
38+
ports:
39+
- protocol: TCP
40+
port: 80
41+
targetPort: test
42+
---
43+
apiVersion: gateway.kgateway.dev/v1alpha1
44+
kind: TrafficPolicy
45+
metadata:
46+
name: example-route-retry
47+
spec:
48+
targetRefs:
49+
- group: gateway.networking.k8s.io
50+
kind: HTTPRoute
51+
name: example-route
52+
retry:
53+
retryOn:
54+
- gateway-error
55+
- connect-failure
56+
- reset
57+
attempts: 2
58+
perTryTimeout: 500ms
59+
statusCodes:
60+
- 401
61+
- 402
62+
backoffBaseInterval: 50ms
63+
---
64+
kind: Secret
65+
apiVersion: v1
66+
metadata:
67+
creationTimestamp: null
68+
name: https
69+
type: kubernetes.io/tls
70+
data:
71+
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQVENDQWlXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFiTVFvd0NBWURWUVFEREFFcU1RMHcKQ3dZRFZRUUtEQVJ5YjI5ME1CNFhEVEl6TVRFd09ERTJORFExTjFvWERUTXpNVEV3TlRFMk5EUTFOMW93SGpFSwpNQWdHQTFVRUF3d0JLakVRTUE0R0ExVUVDZ3dIWjJGMFpYZGhlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTit0V2hoa3QvNVFQTUw4UGorZ1JScUM1blp5TG9Sem5iK3hPazdQTVozRndtYUcKNThvbVhPRm16ZmJlK0VaaGE0UlBhK1BpdFhFbitjZkM5allYRU42dGM1WExWUjlKK1dCRXRhSUpoZlh2VzAvbgpraEg0MWFZa2NCQVMyTEh1U3l4WWd3VERMRzI1OUxVdVJFT3VGSVhtWUZJaGVlZTZ6V3dRMXk0Ujk1VzRoVGFzCi9JVk9wYmttbSsyM0ZVQ1Q3RTcvNzN0RFh3Q1dpekc3UnUyZ1p2aS9tK0ZRVUJCZmFPTGxzelQvVHNwNTB3YmUKY0hxY29UbWJNWUJpWDk1RFBYTWtnZ2g5M1R2bnBWb0taYVZhWDNOdHlGRGJOZnEyLzZaT2daNFlNZVgzb0VMUgpiVllpY01rU3lZRHJWbW9jeHZBMWdQQUsxd2NkVE1OcjlnY0F1b0VDQXdFQUFhT0JpRENCaFRBSkJnTlZIUk1FCkFqQUFNQXNHQTFVZER3UUVBd0lGNERBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSEF3RXcKREFZRFZSMFJCQVV3QTRJQktqQWRCZ05WSFE0RUZnUVVxaW40SEhXN08wR3NLbGgwUEJ2SFFZSzRQT013SHdZRApWUjBqQkJnd0ZvQVVZb3l3TXpJN1BpWGtJd3FMSTdkNzA5SmJnVmN3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFCQ3p2NUUrb3hYT3RBUi9UWWE2YWJMVm94WENPWFZVeVFRell5VFJoekJOY0Vjbk1NeDBHc2V1NHRXeUlmem8KNmQ5LzRkOWdmdDlRNnVTS1RZUkhYU0VIQUFsMmlEWGdQTTZoSk0vNmpxQlE2N1ErVkVrUTJWVUMySDZEYjF1Qwo2VGdldk9MdlA1eDhrS2FjZVNnYTdmSHZJcW95OHVmbm1BSzlhd2ZobE9hajBjUWcxQXV6aW14blhzTVQvdkNVCm9Xa2xPZSt0TDA2OEd3LytIMFJQMTJ6N2t6VGJDbXZuRWU4bk1QSXNrU21NZTcvUnZLcUFuYTd0NHFDOVdyRXgKWlFZK0NlOVhrTnI3RGJaZnprTmpqUFV2OEozdHN2dzY5Zm1HcVBEWVpHMm1HQjRzeGFyNy9mZG4rbGd3MDVsRwpBbEhhaWpXTlVGTWtmcXgvUzZnampEL0NPZVpRcVltM1hLY3RCWkFSUjNJRUR0RWNEUkRzNllvczhCUTBzbS9ECkhnNG1XWWR4Y283WlpnUzF6ZWlhdkNwRWxDaXEzWnB5c0EvS1NLS056Y1RIRk5acXBxYWFNdVQvaTBuaUI1MmEKZmpFSDUzdk1wYXhUK1IvcFIxQ1NMREZ6VDI3OTFMaEprZkJWVWwzQkdnOVY2VCt6bkl1Nkk1aVU1RlZZbVl3UApubS9EYitncE9JalEyU0w5Wm1nVkNvdjFvNTBTU3ZLN1RYSFVIaXFoZXlucDAyR1ZYYXpFT295ODBWcG04dW9JCklvS2NFOS9IUldOT0F5Uk41cWtYRDBnalpJOWM1aUtjV25kQ1B1cnBFZENNZUdiems1cWRUNGhZSFFsM2RKeW8KNHJoZm9MN051R1VUa0o1ZCtGdFBwaXRISkNEVGdUb05LTVNGcTcxbzRoMXkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
72+
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV1d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktVd2dnU2hBZ0VBQW9JQkFRRGZyVm9ZWkxmK1VEekMKL0Q0L29FVWFndVoyY2k2RWM1Mi9zVHBPenpHZHhjSm1odWZLSmx6aFpzMzIzdmhHWVd1RVQydmo0clZ4Si9uSAp3dlkyRnhEZXJYT1Z5MVVmU2ZsZ1JMV2lDWVgxNzF0UDU1SVIrTldtSkhBUUV0aXg3a3NzV0lNRXd5eHR1ZlMxCkxrUkRyaFNGNW1CU0lYbm51czFzRU5jdUVmZVZ1SVUyclB5RlRxVzVKcHZ0dHhWQWsreE8vKzk3UTE4QWxvc3gKdTBidG9HYjR2NXZoVUZBUVgyamk1Yk0wLzA3S2VkTUczbkI2bktFNW16R0FZbC9lUXoxekpJSUlmZDA3NTZWYQpDbVdsV2w5emJjaFEyelg2dHYrbVRvR2VHREhsOTZCQzBXMVdJbkRKRXNtQTYxWnFITWJ3TllEd0N0Y0hIVXpECmEvWUhBTHFCQWdNQkFBRUNnZjhQVjFhUUwxaEVteTl0amc1WkR0SFFxRGFJZGZ0UUhwVmdCY0ZtMVVyZzBnSzAKWjZHa204V0REZ2ZqYlNlTlZ1RXhlRnFqV2RwWDkyeFhHbGNJdUV4SFgvZStsTXNRdnBWUllMcGhQblRuQU1YVgp0MG9rN1NYTFBVRll4OC8vcUcvWkZHTzA0UHJYNmFMRFNuZ0NBYXhxOFpNbFpFUkMyaUJKaTAwVXhGNHNKR25WCklJeHFLeVRnbWpBcFV6c1BDWXF5ci9aNmJTRkVnbVNxNzJobmt2Rm1PV3NYcldzRlZLY05iUUplWTRMMEJuWUsKWk5xODNmemt6ekpxbVh3OEVncWFPNlhWMmJtVmYrM1hSL3ViMDRGeXRya0Y5bE1JU0pWOUhkQmtRaGV2VzZhVApoSG5pblV6VkgyUlh4M1piYWw3ck1ZL0lOMWNmaFVlWm9BZDQ0ZGtDZ1lFQTh1bHorbXpPWXg0QVNnWUo0eVNICkdmc1VQeXpJUU9vaEVJQmtxMWNrUHJlbVhsdEdoWTcrRmtYYmh5cnVuOTRIREJJZWR0RWt0YjlZSDkvT0xNME8KK056TlhTYnlaQ3ZTa1U1ZlNNeUpDc3E3L01JTlVpNUxGN1FLQVF1ZXk3WDgvUGU3NHhFQ29hN1AvSlJkTnYrdgpjUnkyUEZOSlNGbTJGdkxGeDA4TDFWa0NnWUVBNjdxV3Q5dENpQ24zRXVPM2hEeFptZ3VSWU55Tk9TWkowdjR5Cm9zaXZ0WFl2ZGVYWGxGZWFWSEJtZG5vZUYrVTZ6TXpUQUY0d09jNmZpenpCMjlGVkxjWjJmTE5tWXc0RmxENFEKR0wzMHVJckQ5WXJraGZWZm85TW9aVHo2cWJnc0xQQnNZTXljelpFOThyb3dmZVp2MkUzQ1lRaDhOL1lGbXRmOQptWTViNFdrQ2dZQkQyc2pHQkl6bWpTUGhpYXhMWWhISFJTYlR1dXU1am0xc0VhR05aMHM5cGNsNGhDREFBRUNqCjhpR3ZzV04xRHUyREJyQ3gyaHhhRkxoR054dDkwazVEWUZLUm1lYU42dHZvTVM5V3c2UG9ldGRtZE1LSjJWcXEKcFdWQ0EzLzVRYjRJNEI4QS8raHZSOGpic29vVGFmc1ZLc01ST09hNHFpNitYRlM1SnpDVUNRS0JnRmZLN2tjYgpTZlFjYlFDRC90MG8vTlg2YVBLQ01iYVBJLytJM0tMenl6engvMHNSaHZDZ2o4SFMrdFkxTlBBQlY1emV5OWJmClBXYktKWEZkOTNVK3lWSjdEN1h4dXJnNWlLcGxVdWxrRmJpRk5lWkZERWMzMDU3WURidG1zcFJ6RzBEQmFodkQKR01NV3pOT1J0RzJ2WFFoYUxZS2wvbDE1S3kwNE5DTDBlaFBCQW9HQkFMK2RmaVFmUjhYVGMwMzF6R0xwQm1kdQpOMU81aDM1cUdIT0s4M25MY1VQSnhzc0JTSGVxNTZEVHBic3VMRjY0V1c2bk5KSWRwckdRLzNpOFZldzhDa05ZCmtXY2ZGWkdUTGM4b2g4Tkw4bWpiZGtITCs3M3ZuVy9FbEZRRDlWZTE3WWN0cEZKbUcwcVBSaFVWQzhkSG5RYnAKWXRMTTQxb01qQlQ3NUdjRjBZZ2wKLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
Clusters:
2+
- connectTimeout: 5s
3+
edsClusterConfig:
4+
edsConfig:
5+
ads: {}
6+
resourceApiVersion: V3
7+
ignoreHealthOnHostRemoval: true
8+
metadata: {}
9+
name: kube_default_example-svc_80
10+
type: EDS
11+
- connectTimeout: 5s
12+
metadata: {}
13+
name: test-backend-plugin_default_example-svc_80
14+
Listeners:
15+
- address:
16+
socketAddress:
17+
address: '::'
18+
ipv4Compat: true
19+
portValue: 443
20+
filterChains:
21+
- filters:
22+
- name: envoy.filters.network.http_connection_manager
23+
typedConfig:
24+
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
25+
httpFilters:
26+
- name: envoy.filters.http.router
27+
typedConfig:
28+
'@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
29+
mergeSlashes: true
30+
normalizePath: true
31+
rds:
32+
configSource:
33+
ads: {}
34+
resourceApiVersion: V3
35+
routeConfigName: https
36+
statPrefix: http
37+
useRemoteAddress: true
38+
name: https
39+
transportSocket:
40+
name: envoy.transport_sockets.tls
41+
typedConfig:
42+
'@type': type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
43+
commonTlsContext:
44+
alpnProtocols:
45+
- h2
46+
- http/1.1
47+
tlsCertificates:
48+
- certificateChain:
49+
inlineBytes: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQVENDQWlXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFiTVFvd0NBWURWUVFEREFFcU1RMHcKQ3dZRFZRUUtEQVJ5YjI5ME1CNFhEVEl6TVRFd09ERTJORFExTjFvWERUTXpNVEV3TlRFMk5EUTFOMW93SGpFSwpNQWdHQTFVRUF3d0JLakVRTUE0R0ExVUVDZ3dIWjJGMFpYZGhlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTit0V2hoa3QvNVFQTUw4UGorZ1JScUM1blp5TG9Sem5iK3hPazdQTVozRndtYUcKNThvbVhPRm16ZmJlK0VaaGE0UlBhK1BpdFhFbitjZkM5allYRU42dGM1WExWUjlKK1dCRXRhSUpoZlh2VzAvbgpraEg0MWFZa2NCQVMyTEh1U3l4WWd3VERMRzI1OUxVdVJFT3VGSVhtWUZJaGVlZTZ6V3dRMXk0Ujk1VzRoVGFzCi9JVk9wYmttbSsyM0ZVQ1Q3RTcvNzN0RFh3Q1dpekc3UnUyZ1p2aS9tK0ZRVUJCZmFPTGxzelQvVHNwNTB3YmUKY0hxY29UbWJNWUJpWDk1RFBYTWtnZ2g5M1R2bnBWb0taYVZhWDNOdHlGRGJOZnEyLzZaT2daNFlNZVgzb0VMUgpiVllpY01rU3lZRHJWbW9jeHZBMWdQQUsxd2NkVE1OcjlnY0F1b0VDQXdFQUFhT0JpRENCaFRBSkJnTlZIUk1FCkFqQUFNQXNHQTFVZER3UUVBd0lGNERBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSEF3RXcKREFZRFZSMFJCQVV3QTRJQktqQWRCZ05WSFE0RUZnUVVxaW40SEhXN08wR3NLbGgwUEJ2SFFZSzRQT013SHdZRApWUjBqQkJnd0ZvQVVZb3l3TXpJN1BpWGtJd3FMSTdkNzA5SmJnVmN3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFCQ3p2NUUrb3hYT3RBUi9UWWE2YWJMVm94WENPWFZVeVFRell5VFJoekJOY0Vjbk1NeDBHc2V1NHRXeUlmem8KNmQ5LzRkOWdmdDlRNnVTS1RZUkhYU0VIQUFsMmlEWGdQTTZoSk0vNmpxQlE2N1ErVkVrUTJWVUMySDZEYjF1Qwo2VGdldk9MdlA1eDhrS2FjZVNnYTdmSHZJcW95OHVmbm1BSzlhd2ZobE9hajBjUWcxQXV6aW14blhzTVQvdkNVCm9Xa2xPZSt0TDA2OEd3LytIMFJQMTJ6N2t6VGJDbXZuRWU4bk1QSXNrU21NZTcvUnZLcUFuYTd0NHFDOVdyRXgKWlFZK0NlOVhrTnI3RGJaZnprTmpqUFV2OEozdHN2dzY5Zm1HcVBEWVpHMm1HQjRzeGFyNy9mZG4rbGd3MDVsRwpBbEhhaWpXTlVGTWtmcXgvUzZnampEL0NPZVpRcVltM1hLY3RCWkFSUjNJRUR0RWNEUkRzNllvczhCUTBzbS9ECkhnNG1XWWR4Y283WlpnUzF6ZWlhdkNwRWxDaXEzWnB5c0EvS1NLS056Y1RIRk5acXBxYWFNdVQvaTBuaUI1MmEKZmpFSDUzdk1wYXhUK1IvcFIxQ1NMREZ6VDI3OTFMaEprZkJWVWwzQkdnOVY2VCt6bkl1Nkk1aVU1RlZZbVl3UApubS9EYitncE9JalEyU0w5Wm1nVkNvdjFvNTBTU3ZLN1RYSFVIaXFoZXlucDAyR1ZYYXpFT295ODBWcG04dW9JCklvS2NFOS9IUldOT0F5Uk41cWtYRDBnalpJOWM1aUtjV25kQ1B1cnBFZENNZUdiems1cWRUNGhZSFFsM2RKeW8KNHJoZm9MN051R1VUa0o1ZCtGdFBwaXRISkNEVGdUb05LTVNGcTcxbzRoMXkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
50+
privateKey:
51+
inlineBytes: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV1d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktVd2dnU2hBZ0VBQW9JQkFRRGZyVm9ZWkxmK1VEekMKL0Q0L29FVWFndVoyY2k2RWM1Mi9zVHBPenpHZHhjSm1odWZLSmx6aFpzMzIzdmhHWVd1RVQydmo0clZ4Si9uSAp3dlkyRnhEZXJYT1Z5MVVmU2ZsZ1JMV2lDWVgxNzF0UDU1SVIrTldtSkhBUUV0aXg3a3NzV0lNRXd5eHR1ZlMxCkxrUkRyaFNGNW1CU0lYbm51czFzRU5jdUVmZVZ1SVUyclB5RlRxVzVKcHZ0dHhWQWsreE8vKzk3UTE4QWxvc3gKdTBidG9HYjR2NXZoVUZBUVgyamk1Yk0wLzA3S2VkTUczbkI2bktFNW16R0FZbC9lUXoxekpJSUlmZDA3NTZWYQpDbVdsV2w5emJjaFEyelg2dHYrbVRvR2VHREhsOTZCQzBXMVdJbkRKRXNtQTYxWnFITWJ3TllEd0N0Y0hIVXpECmEvWUhBTHFCQWdNQkFBRUNnZjhQVjFhUUwxaEVteTl0amc1WkR0SFFxRGFJZGZ0UUhwVmdCY0ZtMVVyZzBnSzAKWjZHa204V0REZ2ZqYlNlTlZ1RXhlRnFqV2RwWDkyeFhHbGNJdUV4SFgvZStsTXNRdnBWUllMcGhQblRuQU1YVgp0MG9rN1NYTFBVRll4OC8vcUcvWkZHTzA0UHJYNmFMRFNuZ0NBYXhxOFpNbFpFUkMyaUJKaTAwVXhGNHNKR25WCklJeHFLeVRnbWpBcFV6c1BDWXF5ci9aNmJTRkVnbVNxNzJobmt2Rm1PV3NYcldzRlZLY05iUUplWTRMMEJuWUsKWk5xODNmemt6ekpxbVh3OEVncWFPNlhWMmJtVmYrM1hSL3ViMDRGeXRya0Y5bE1JU0pWOUhkQmtRaGV2VzZhVApoSG5pblV6VkgyUlh4M1piYWw3ck1ZL0lOMWNmaFVlWm9BZDQ0ZGtDZ1lFQTh1bHorbXpPWXg0QVNnWUo0eVNICkdmc1VQeXpJUU9vaEVJQmtxMWNrUHJlbVhsdEdoWTcrRmtYYmh5cnVuOTRIREJJZWR0RWt0YjlZSDkvT0xNME8KK056TlhTYnlaQ3ZTa1U1ZlNNeUpDc3E3L01JTlVpNUxGN1FLQVF1ZXk3WDgvUGU3NHhFQ29hN1AvSlJkTnYrdgpjUnkyUEZOSlNGbTJGdkxGeDA4TDFWa0NnWUVBNjdxV3Q5dENpQ24zRXVPM2hEeFptZ3VSWU55Tk9TWkowdjR5Cm9zaXZ0WFl2ZGVYWGxGZWFWSEJtZG5vZUYrVTZ6TXpUQUY0d09jNmZpenpCMjlGVkxjWjJmTE5tWXc0RmxENFEKR0wzMHVJckQ5WXJraGZWZm85TW9aVHo2cWJnc0xQQnNZTXljelpFOThyb3dmZVp2MkUzQ1lRaDhOL1lGbXRmOQptWTViNFdrQ2dZQkQyc2pHQkl6bWpTUGhpYXhMWWhISFJTYlR1dXU1am0xc0VhR05aMHM5cGNsNGhDREFBRUNqCjhpR3ZzV04xRHUyREJyQ3gyaHhhRkxoR054dDkwazVEWUZLUm1lYU42dHZvTVM5V3c2UG9ldGRtZE1LSjJWcXEKcFdWQ0EzLzVRYjRJNEI4QS8raHZSOGpic29vVGFmc1ZLc01ST09hNHFpNitYRlM1SnpDVUNRS0JnRmZLN2tjYgpTZlFjYlFDRC90MG8vTlg2YVBLQ01iYVBJLytJM0tMenl6engvMHNSaHZDZ2o4SFMrdFkxTlBBQlY1emV5OWJmClBXYktKWEZkOTNVK3lWSjdEN1h4dXJnNWlLcGxVdWxrRmJpRk5lWkZERWMzMDU3WURidG1zcFJ6RzBEQmFodkQKR01NV3pOT1J0RzJ2WFFoYUxZS2wvbDE1S3kwNE5DTDBlaFBCQW9HQkFMK2RmaVFmUjhYVGMwMzF6R0xwQm1kdQpOMU81aDM1cUdIT0s4M25MY1VQSnhzc0JTSGVxNTZEVHBic3VMRjY0V1c2bk5KSWRwckdRLzNpOFZldzhDa05ZCmtXY2ZGWkdUTGM4b2g4Tkw4bWpiZGtITCs3M3ZuVy9FbEZRRDlWZTE3WWN0cEZKbUcwcVBSaFVWQzhkSG5RYnAKWXRMTTQxb01qQlQ3NUdjRjBZZ2wKLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
52+
tlsParams: {}
53+
name: listener~443
54+
Routes:
55+
- ignorePortInHostMatching: true
56+
name: https
57+
virtualHosts:
58+
- domains:
59+
- example.com
60+
name: https~example_com
61+
requireTls: ALL
62+
routes:
63+
- match:
64+
prefix: /
65+
metadata:
66+
filterMetadata:
67+
merge.TrafficPolicy.gateway.kgateway.dev:
68+
retry:
69+
- gateway.kgateway.dev/TrafficPolicy/default/example-route-retry
70+
name: https~example_com-route-0-httproute-example-route-default-0-0-matcher-0
71+
route:
72+
cluster: kube_default_example-svc_80
73+
clusterNotFoundResponseCode: INTERNAL_SERVER_ERROR
74+
retryPolicy:
75+
numRetries: 2
76+
perTryTimeout: 0.500s
77+
retriableStatusCodes:
78+
- 401
79+
- 402
80+
retryBackOff:
81+
baseInterval: 0.050s
82+
retryOn: connect-failure,gateway-error,reset,retriable-status-codes
83+
Statuses:
84+
gateways:
85+
default/example-gateway:
86+
conditions:
87+
- lastTransitionTime: null
88+
message: ""
89+
reason: ListenerSetsNotAllowed
90+
status: Unknown
91+
type: AttachedListenerSets
92+
- lastTransitionTime: null
93+
message: Successfully accepted Gateway
94+
reason: Accepted
95+
status: "True"
96+
type: Accepted
97+
- lastTransitionTime: null
98+
message: Successfully programmed Gateway
99+
reason: Programmed
100+
status: "True"
101+
type: Programmed
102+
listeners:
103+
- attachedRoutes: 1
104+
conditions:
105+
- lastTransitionTime: null
106+
message: Successfully accepted Listener
107+
reason: Accepted
108+
status: "True"
109+
type: Accepted
110+
- lastTransitionTime: null
111+
message: Successfully verified that Listener has no conflicts
112+
reason: NoConflicts
113+
status: "False"
114+
type: Conflicted
115+
- lastTransitionTime: null
116+
message: Successfully resolved all references
117+
reason: ResolvedRefs
118+
status: "True"
119+
type: ResolvedRefs
120+
- lastTransitionTime: null
121+
message: Successfully programmed Listener
122+
reason: Programmed
123+
status: "True"
124+
type: Programmed
125+
name: https
126+
supportedKinds:
127+
- group: gateway.networking.k8s.io
128+
kind: HTTPRoute
129+
httpRoutes:
130+
default/example-route:
131+
parents:
132+
- conditions:
133+
- lastTransitionTime: null
134+
message: Successfully accepted Route
135+
reason: Accepted
136+
status: "True"
137+
type: Accepted
138+
- lastTransitionTime: null
139+
message: Successfully resolved all references
140+
reason: ResolvedRefs
141+
status: "True"
142+
type: ResolvedRefs
143+
controllerName: kgateway
144+
parentRef:
145+
group: ""
146+
kind: ""
147+
name: example-gateway
148+
policies:
149+
TrafficPolicy/default/example-route-retry:
150+
ancestors:
151+
- ancestorRef:
152+
group: gateway.networking.k8s.io
153+
kind: Gateway
154+
name: example-gateway
155+
namespace: default
156+
conditions:
157+
- lastTransitionTime: null
158+
message: Policy accepted
159+
reason: Valid
160+
status: "True"
161+
type: Accepted
162+
- lastTransitionTime: null
163+
message: Attached to all targets
164+
reason: Attached
165+
status: "True"
166+
type: Attached
167+
controllerName: kgateway.dev/kgateway

pkg/kgateway/translator/gateway/testutils/outputs/traffic-policy/timeout-retry.yaml

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ Routes:
4949
retry:
5050
- gateway.kgateway.dev/TrafficPolicy/default/example-gateway-retry-and-timeout
5151
name: listener~80~builtin_com
52-
retryPolicy:
53-
numRetries: 3
54-
retryBackOff:
55-
baseInterval: 0.025s
56-
retryOn: gateway-error
5752
routes:
5853
- match:
5954
prefix: /
@@ -86,11 +81,6 @@ Routes:
8681
retry:
8782
- gateway.kgateway.dev/TrafficPolicy/default/example-gateway-retry-and-timeout
8883
name: listener~80~example-retry-and-timeouts_com
89-
retryPolicy:
90-
numRetries: 3
91-
retryBackOff:
92-
baseInterval: 0.025s
93-
retryOn: gateway-error
9484
routes:
9585
- match:
9686
safeRegex:
@@ -146,11 +136,6 @@ Routes:
146136
retry:
147137
- gateway.kgateway.dev/TrafficPolicy/default/example-gateway-retry-and-timeout
148138
name: listener~80~example-retry_com
149-
retryPolicy:
150-
numRetries: 3
151-
retryBackOff:
152-
baseInterval: 0.025s
153-
retryOn: gateway-error
154139
routes:
155140
- match:
156141
prefix: /
@@ -180,11 +165,6 @@ Routes:
180165
retry:
181166
- gateway.kgateway.dev/TrafficPolicy/default/example-gateway-retry-and-timeout
182167
name: listener~80~example_com
183-
retryPolicy:
184-
numRetries: 3
185-
retryBackOff:
186-
baseInterval: 0.025s
187-
retryOn: gateway-error
188168
routes:
189169
- match:
190170
prefix: /
@@ -198,6 +178,11 @@ Routes:
198178
cluster: kube_default_example-svc_80
199179
clusterNotFoundResponseCode: INTERNAL_SERVER_ERROR
200180
idleTimeout: 5s
181+
retryPolicy:
182+
numRetries: 3
183+
retryBackOff:
184+
baseInterval: 0.025s
185+
retryOn: gateway-error
201186
timeout: 9s
202187
Statuses:
203188
gateways:

0 commit comments

Comments
 (0)