Skip to content

Commit ffb897e

Browse files
committed
add mesh conformance for request header modifier
1 parent 270a389 commit ffb897e

File tree

6 files changed

+459
-18
lines changed

6 files changed

+459
-18
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
apiVersion: gateway.networking.k8s.io/v1
2+
kind: HTTPRoute
3+
metadata:
4+
name: mesh-request-header-modifier
5+
namespace: gateway-conformance-mesh
6+
spec:
7+
parentRefs:
8+
- group: ""
9+
kind: Service
10+
name: echo
11+
port: 80
12+
rules:
13+
- matches:
14+
- path:
15+
type: PathPrefix
16+
value: /set
17+
backendRefs:
18+
- name: echo-v1
19+
port: 8080
20+
filters:
21+
- type: RequestHeaderModifier
22+
requestHeaderModifier:
23+
set:
24+
- name: X-Header-Set
25+
value: set-overwrites-values
26+
- matches:
27+
- path:
28+
type: PathPrefix
29+
value: /add
30+
backendRefs:
31+
- name: echo-v1
32+
port: 8080
33+
filters:
34+
- type: RequestHeaderModifier
35+
requestHeaderModifier:
36+
add:
37+
- name: X-Header-Add
38+
value: add-appends-values
39+
- matches:
40+
- path:
41+
type: PathPrefix
42+
value: /remove
43+
backendRefs:
44+
- name: echo-v1
45+
port: 8080
46+
filters:
47+
- type: RequestHeaderModifier
48+
requestHeaderModifier:
49+
remove:
50+
- X-Header-Remove
51+
- matches:
52+
- path:
53+
type: PathPrefix
54+
value: /multiple
55+
backendRefs:
56+
- name: echo-v1
57+
port: 8080
58+
filters:
59+
- type: RequestHeaderModifier
60+
requestHeaderModifier:
61+
set:
62+
- name: X-Header-Set-1
63+
value: header-set-1
64+
- name: X-Header-Set-2
65+
value: header-set-2
66+
add:
67+
- name: X-Header-Add-1
68+
value: header-add-1
69+
- name: X-Header-Add-2
70+
value: header-add-2
71+
- name: X-Header-Add-3
72+
value: header-add-3
73+
remove:
74+
- X-Header-Remove-1
75+
- X-Header-Remove-2
76+
- matches:
77+
- path:
78+
type: PathPrefix
79+
value: /case-insensitivity
80+
backendRefs:
81+
- name: echo-v1
82+
port: 8080
83+
filters:
84+
- type: RequestHeaderModifier
85+
requestHeaderModifier:
86+
set:
87+
- name: X-Header-Set
88+
value: header-set
89+
add:
90+
- name: X-Header-Add
91+
value: header-add
92+
remove:
93+
- X-Header-Remove
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
/*
2+
Copyright 2022 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package meshtests
18+
19+
import (
20+
"testing"
21+
22+
"sigs.k8s.io/gateway-api/conformance/utils/echo"
23+
"sigs.k8s.io/gateway-api/conformance/utils/http"
24+
"sigs.k8s.io/gateway-api/conformance/utils/suite"
25+
"sigs.k8s.io/gateway-api/pkg/features"
26+
)
27+
28+
func init() {
29+
MeshConformanceTests = append(MeshConformanceTests,
30+
MeshHHTTPRouteRequestHeaderModifier,
31+
MeshHHTTPRouteBackendRequestHeaderModifier,
32+
)
33+
}
34+
35+
var MeshHHTTPRouteBackendRequestHeaderModifier = suite.ConformanceTest{
36+
ShortName: "MeshHHTTPRouteBackendRequestHeaderModifier",
37+
Description: "An HTTPRoute backend has request header modifier filters applied correctly",
38+
Features: []features.FeatureName{
39+
features.SupportMesh,
40+
features.SupportHTTPRoute,
41+
features.SupportMeshHTTPRouteBackendRequestHeaderModification,
42+
},
43+
Manifests: []string{"tests/mesh/httproute-request-header-modifier-backend.yaml"},
44+
Test: MeshHHTTPRouteRequestHeaderModifier.Test,
45+
}
46+
47+
var MeshHHTTPRouteRequestHeaderModifier = suite.ConformanceTest{
48+
ShortName: "MeshHHTTPRouteRequestHeaderModifier",
49+
Description: "An HTTPRoute has request header modifier filters applied correctly",
50+
Features: []features.FeatureName{
51+
features.SupportMesh,
52+
features.SupportHTTPRoute,
53+
},
54+
Manifests: []string{"tests/mesh/httproute-request-header-modifier.yaml"},
55+
Test: func(t *testing.T, s *suite.ConformanceTestSuite) {
56+
ns := "gateway-conformance-mesh"
57+
client := echo.ConnectToApp(t, s, echo.MeshAppEchoV1)
58+
59+
testCases := []http.ExpectedResponse{
60+
{
61+
Request: http.Request{
62+
Path: "/set",
63+
Headers: map[string]string{
64+
"Some-Other-Header": "val",
65+
},
66+
},
67+
ExpectedRequest: &http.ExpectedRequest{
68+
Request: http.Request{
69+
Path: "/set",
70+
Headers: map[string]string{
71+
"Some-Other-Header": "val",
72+
"X-Header-Set": "set-overwrites-values",
73+
},
74+
},
75+
},
76+
Backend: "echo-v1",
77+
Namespace: ns,
78+
}, {
79+
Request: http.Request{
80+
Path: "/set",
81+
Headers: map[string]string{
82+
"Some-Other-Header": "val",
83+
"X-Header-Set": "some-other-value",
84+
},
85+
},
86+
ExpectedRequest: &http.ExpectedRequest{
87+
Request: http.Request{
88+
Path: "/set",
89+
Headers: map[string]string{
90+
"Some-Other-Header": "val",
91+
"X-Header-Set": "set-overwrites-values",
92+
},
93+
},
94+
},
95+
Backend: "echo-v1",
96+
Namespace: ns,
97+
}, {
98+
Request: http.Request{
99+
Path: "/add",
100+
Headers: map[string]string{
101+
"Some-Other-Header": "val",
102+
},
103+
},
104+
ExpectedRequest: &http.ExpectedRequest{
105+
Request: http.Request{
106+
Path: "/add",
107+
Headers: map[string]string{
108+
"Some-Other-Header": "val",
109+
"X-Header-Add": "add-appends-values",
110+
},
111+
},
112+
},
113+
Backend: "echo-v1",
114+
Namespace: ns,
115+
}, {
116+
Request: http.Request{
117+
Path: "/add",
118+
Headers: map[string]string{
119+
"Some-Other-Header": "val",
120+
"X-Header-Add": "some-other-value",
121+
},
122+
},
123+
ExpectedRequest: &http.ExpectedRequest{
124+
Request: http.Request{
125+
Path: "/add",
126+
Headers: map[string]string{
127+
"Some-Other-Header": "val",
128+
"X-Header-Add": "some-other-value,add-appends-values",
129+
},
130+
},
131+
},
132+
Backend: "echo-v1",
133+
Namespace: ns,
134+
}, {
135+
Request: http.Request{
136+
Path: "/remove",
137+
Headers: map[string]string{
138+
"X-Header-Remove": "val",
139+
},
140+
},
141+
ExpectedRequest: &http.ExpectedRequest{
142+
Request: http.Request{
143+
Path: "/remove",
144+
},
145+
AbsentHeaders: []string{"X-Header-Remove"},
146+
},
147+
Backend: "echo-v1",
148+
Namespace: ns,
149+
}, {
150+
Request: http.Request{
151+
Path: "/multiple",
152+
Headers: map[string]string{
153+
"X-Header-Set-2": "set-val-2",
154+
"X-Header-Add-2": "add-val-2",
155+
"X-Header-Remove-2": "remove-val-2",
156+
"Another-Header": "another-header-val",
157+
},
158+
},
159+
ExpectedRequest: &http.ExpectedRequest{
160+
Request: http.Request{
161+
Path: "/multiple",
162+
Headers: map[string]string{
163+
"X-Header-Set-1": "header-set-1",
164+
"X-Header-Set-2": "header-set-2",
165+
"X-Header-Add-1": "header-add-1",
166+
"X-Header-Add-2": "add-val-2,header-add-2",
167+
"X-Header-Add-3": "header-add-3",
168+
"Another-Header": "another-header-val",
169+
},
170+
},
171+
AbsentHeaders: []string{"X-Header-Remove-1", "X-Header-Remove-2"},
172+
},
173+
Backend: "echo-v1",
174+
Namespace: ns,
175+
}, {
176+
Request: http.Request{
177+
Path: "/case-insensitivity",
178+
// The filter uses canonicalized header names,
179+
// the request uses lowercase names.
180+
Headers: map[string]string{
181+
"x-header-set": "original-val-set",
182+
"x-header-add": "original-val-add",
183+
"x-header-remove": "original-val-remove",
184+
"Another-Header": "another-header-val",
185+
},
186+
},
187+
ExpectedRequest: &http.ExpectedRequest{
188+
Request: http.Request{
189+
Path: "/case-insensitivity",
190+
Headers: map[string]string{
191+
"X-Header-Set": "header-set",
192+
"X-Header-Add": "original-val-add,header-add",
193+
"Another-Header": "another-header-val",
194+
},
195+
},
196+
AbsentHeaders: []string{"x-header-remove", "X-Header-Remove"},
197+
},
198+
Backend: "echo-v1",
199+
Namespace: ns,
200+
},
201+
}
202+
203+
for i := range testCases {
204+
// Declare tc here to avoid loop variable
205+
// reuse issues across parallel tests.
206+
tc := testCases[i]
207+
t.Run(tc.GetTestCaseName(i), func(t *testing.T) {
208+
t.Parallel()
209+
client.MakeRequestAndExpectEventuallyConsistentResponse(t, tc, s.TimeoutConfig)
210+
})
211+
}
212+
},
213+
}

0 commit comments

Comments
 (0)