Skip to content

Commit 33aba2f

Browse files
committed
TEST/MEDIUM: start adding map test for each combination of hostname and match type
This is the first tests for all combination of: - Gateway listener hostname - Route hostname - Match type
1 parent 724bcae commit 33aba2f

15 files changed

Lines changed: 436 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Echo Deployment
2+
3+
This example contains an example with:
4+
- Gateway Listeners:
5+
- Exact: `offload.haproxy`
6+
- Route:
7+
- Exact: `offload.haproxy`
8+
- MathType:
9+
- Exact: `/api/`
10+
11+
12+
13+
## How to deploy
14+
15+
```sh
16+
kubectl apply -f .
17+
```
18+
19+
## How to test e2e curls from your computer
20+
21+
### Success
22+
23+
24+
```sh
25+
curl --header "Host: offload.haproxy" http://127.0.0.1:31081/api/
26+
curl --header "Host: offload.haproxy" https://127.0.0.1:31444/api/ -k
27+
28+
```
29+
30+
31+
### Failure
32+
33+
```sh
34+
curl --header "Host: offload.haproxy" http://127.0.0.1:31081/api/foo
35+
curl --header "Host: offload.haproxy" https://127.0.0.1:31444/api/foo -k
36+
37+
curl --header "Host: other.haproxy" http://127.0.0.1:31081/api/
38+
curl --header "Host: other.haproxy" https://127.0.0.1:31444/api/ -k
39+
40+
```
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
kind: Deployment
2+
apiVersion: apps/v1
3+
metadata:
4+
name: http-echo
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: http-echo
10+
template:
11+
metadata:
12+
labels:
13+
app: http-echo
14+
spec:
15+
containers:
16+
- name: http-echo
17+
image: "haproxytech/http-echo:latest"
18+
imagePullPolicy: Never
19+
ports:
20+
- name: http
21+
containerPort: 8888
22+
protocol: TCP
23+
- name: https
24+
containerPort: 8443
25+
protocol: TCP
26+
---
27+
kind: Service
28+
apiVersion: v1
29+
metadata:
30+
name: http-echo
31+
spec:
32+
ports:
33+
- name: http
34+
protocol: TCP
35+
port: 80
36+
targetPort: http
37+
- name: https
38+
protocol: TCP
39+
port: 443
40+
targetPort: https
41+
selector:
42+
app: http-echo
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apiVersion: gateway.networking.k8s.io/v1
2+
kind: Gateway
3+
metadata:
4+
name: hug-gateway
5+
spec:
6+
gatewayClassName: haproxy
7+
listeners:
8+
- name: http
9+
port: 31081
10+
protocol: HTTP
11+
allowedRoutes:
12+
kinds:
13+
- group: gateway.networking.k8s.io
14+
kind: HTTPRoute
15+
hostname: "offload.haproxy"
16+
- name: https
17+
protocol: HTTPS
18+
port: 31444
19+
tls:
20+
certificateRefs:
21+
- kind: Secret
22+
group: ""
23+
name: offload
24+
allowedRoutes:
25+
kinds:
26+
- group: gateway.networking.k8s.io
27+
kind: HTTPRoute
28+
hostname: "offload.haproxy"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
apiVersion: gateway.networking.k8s.io/v1
2+
kind: GatewayClass
3+
metadata:
4+
name: haproxy
5+
spec:
6+
controllerName: gate.haproxy.org/hug
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: v1
2+
data:
3+
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGVENDQWYyZ0F3SUJBZ0lVWVhhTVN4QXAyVFVUY1FzVFBjVHFWUW1kNmpZd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dqRVlNQllHQTFVRUF3d1BiMlptYkc5aFpDNW9ZWEJ5YjNoNU1CNFhEVEkxTURneU1URTFNamMxTjFvWApEVEkyTURneU1URTFNamMxTjFvd0dqRVlNQllHQTFVRUF3d1BiMlptYkc5aFpDNW9ZWEJ5YjNoNU1JSUJJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXlLRHloS1BlTjh6V2pKdTFUdkhDcDA5ZzBDc1gKVWNvYzAyd0tKOVZqdW9VN0djRmRnWUx3UitRU1JJUWhrZEFYV25jdHpES25zNVVhblBEM0Y3SG5DM1krandNTgpZNFFOV0k0a0Z1Uk55RlRhTzV0cTRYSDk3WXRObmtFa1dOWGdUd0I5WFY0Y1duUWc3NmkrbDZkSDFBczI5aWtQClZVMzZqMVdVS3lINFlhbzlWNDZBWklCbE1IenltdW1HUzYyRVIrY0M4TTdsMlNwS1NHajl4TzROd0hzU1U5Z3AKQmhPTjFOY0NmSXN0elNHRFRBTjdxa2p0U0RpTjZXWGFobHRVM1RvYjZvZkI4Ukc0bVA3UGt1YzZIOHl4R3JwbQpLSUhRQkdsVHVUeHNSd3NiaktDSTY3dG1DY2VkYWlKemllS0JPbStaUExhQ002M2lpSVh6bTVlazR3SURBUUFCCm8xTXdVVEFkQmdOVkhRNEVGZ1FVY2NSNmtRMEJmc3NVUVUxdXFtS2x0eVdjVkRnd0h3WURWUjBqQkJnd0ZvQVUKY2NSNmtRMEJmc3NVUVUxdXFtS2x0eVdjVkRnd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUF4T3lCdUk1ZGxNdUZqQ2NIa2VySzZjcUY1T2NaY2p4eTRqM0J6NmtBZnV0Um1EYkNqU25rCjEvZUpISllhZWVmbnpYbWZXVXdyYzlFVWNWWVp3UDVWUXhnM3BEMklPbEE1RTNtZFc4OWkvM2tGUER6MUZOc2oKN0NVZUoyR3o3ZHBIbzh6UGcvcVV0bE9pbkdSV1BsN1lldTlHQjUxTTZYOEFRci9JVGxEa2dnRDF1T3pmakEvcgo0aE0rdG9KN2gvejd2ZnNjWWYvN2dlQWFFUVNRMVFiOVNDSjRFOGxsb1RiRnI3ZFZWMGFxV2J2b1ZSN3g0bUJyCkdDSTVSSmxFUGZZTDNyM21uSHFJZnJHdFBvN2lIa20xcisyRUQ4cnZvU3JhUGJSbmpSSStvcEhLSHBwTlpSMmkKMDQ0U01xcWZDMGNienRmVndRV1NIcnpqcmVaL1JHWmxZUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
4+
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktrd2dnU2xBZ0VBQW9JQkFRRElvUEtFbzk0M3pOYU0KbTdWTzhjS25UMkRRS3hkUnloelRiQW9uMVdPNmhUc1p3VjJCZ3ZCSDVCSkVoQ0dSMEJkYWR5M01NcWV6bFJxYwo4UGNYc2VjTGRqNlBBdzFqaEExWWppUVc1RTNJVk5vN20ycmhjZjN0aTAyZVFTUlkxZUJQQUgxZFhoeGFkQ0R2CnFMNlhwMGZVQ3piMktROVZUZnFQVlpRcklmaGhxajFYam9Ca2dHVXdmUEthNllaTHJZUkg1d0x3enVYWktrcEkKYVAzRTdnM0FleEpUMkNrR0U0M1Uxd0o4aXkzTklZTk1BM3VxU08xSU9JM3BaZHFHVzFUZE9odnFoOEh4RWJpWQovcytTNXpvZnpMRWF1bVlvZ2RBRWFWTzVQR3hIQ3h1TW9JanJ1MllKeDUxcUluT0o0b0U2YjVrOHRvSXpyZUtJCmhmT2JsNlRqQWdNQkFBRUNnZ0VBT3VQcmEvM0J5N1ZId093dnN5V0owcHlkT1YxOHNkaFd6OFJsMHIxelVadXIKOW1wbzdRd25SYUx2cmNidko2TGlSLzYxcGJ1MHVDVHJNK2dUVDVRNzBvUjU1bmFwNW0wcmtiUGZhZ3pIdkNjVQpDKzBaMldVaGVTbXJ0ZWsvSndoWW1EZjNsSUY4Wnh5eFVrZkE4amo2LzRYdk15Qm9UTXpmNEZUcGNpTzlpY1R0CjRxbVZzRUY1VDdzaGZEOThYTEdwOUttYmdsczlWekI0aVBOcFF4ckgwakMzYmYvK3lyS1BHZStIa3dVR1BmdEMKQVRUTkpLQWF1QURScStHK1NWMDYrOXNheWgzYTNIS2d6dTRGaDM0RmRxTTZRTmkwSktwd04rM0JtQm1YUmRIMwpxYXB5Vmo0V2o5ZlJmNHpSSVB5RVkyV3oxZ2NyVm4yWTUrMlhPeFprMlFLQmdRRCtKMEZ5N2J2Z1BqUW00ZUpaCmxQNWM4bHptVHo2OE1Dc2M3QVJJUVU2VlBXb1JDV3NqR1JPYVIzckZrejNJdVp1ekNvN2ZUbldHVjkxTXRGeWwKR2gxYVFxQXlCcFNoUmhoaFFNOTlSblFNRVlTdjNidG9SQnBtNVdQeTJWM2Y1V3lPOXpJVUdlS0xqYUFVdnM4cQpicWZvTUdNenptb3VyNEtXLzZLckExeHFOd0tCZ1FES0ZpRytwUVhrZDE1Z3c0cWVzUXFZYm96cTM4ZW82blcyClluTDQyQnpsampsendRRkpjSlRoWVcvQTV5cEZ1U2duZDlWVGoxbVF6YTdLbVllMWxuWGtxSXZueFlVUFhTVGsKMHdzdlcrN0lSUks0NlBWbHBiZU5FdHV0c0Rtd0VTdlJNSkl2KzdHeENFNVNQR05rWThZWTZmbkdrVGVxOXpPZQowZzlvNVkzVXRRS0JnUURFVHhRSnJzRm9nd09MYVB5S0QwQ3VFSEpiWHFocGVaZERmcllNRFkyaVRzNm5uQ3ZKCjcydXB4ajU1YjdMUVlUVjNoTmM0ZXdUaUlPb0pmbUwxRUFmT0dScGRxYUdTTkc5T1oxNGRPSmNZWDB1cS84enEKeTNmTk5MQVArMys4R2h6UkRQVDhlOFgxM3czZ0dFWXlVMGlVV3hPMUIySVM3M1FpS0JEQW9SYjMzd0tCZ1FDbwppQUtHV2x0cXFENFdGcDFCTU1aMFR5WElMdTMwcWV1WE9jMUdSL3o1V0Q0RGtmOC92dHI2aHViTENqM1B2ZFdGCjdNTUVsN1VMTk8xRFd2eTViSXhQTUZ6VTRuM1FUVTZhWW9LZWNWM1d1UHdmSjNDWDM3Y091SjVwNEdDTHZCWTkKcy9NR2Z6STJRSVlJd1FIbTArcCtGb3JPbFliR1ZyZy9DRkgvbWdsSlRRS0JnUURRc2NtN0ZQVGo3RFh2QzYraQpxQVNadUZNcWQxVjlYVFBtdDFxZmlDekgrODFqTVZnOHE2eE5lQVhMTVhCV0pjSjRKcXJMTnlBSUx4M1ZZeWUzCmtWcDJsVFUzUFVyZUZBL0UvbWxLZk45cUszblVUZDhibjF1aExSZFRkYmZpOE9URzArQ2ZxSTN1WjUrWnJwWjMKU3BSRys3Mnc5TWV2cFdNcU90UFVObWpBWWc9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==
5+
kind: Secret
6+
metadata:
7+
name: offload
8+
type: kubernetes.io/tls
9+
10+
11+
## CN offload.haproxy
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: gateway.networking.k8s.io/v1
2+
kind: HTTPRoute
3+
metadata:
4+
name: route-echo-http
5+
spec:
6+
parentRefs:
7+
- name: hug-gateway
8+
sectionName: http
9+
- name: hug-gateway
10+
sectionName: https
11+
hostnames:
12+
- "offload.haproxy"
13+
rules:
14+
- matches:
15+
- path:
16+
type: Exact
17+
value: /api/
18+
backendRefs:
19+
- name: http-echo
20+
port: 80
21+
---
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2025 HAProxy Technologies LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package hostnames_matchtype
16+
17+
import (
18+
"fmt"
19+
"path"
20+
21+
"github.com/haproxytech/haproxy-unified-gateway/test/integration/utils"
22+
)
23+
24+
func (s *HostnamesMatchtypeSuite) Test_Exact_Route_Exact_Match_Exact() {
25+
fixtureDirPath := utils.GetCRDFixturePath()
26+
fixtureDir := "1-gw-exact-route-exact-match-exact"
27+
28+
fixturePath := path.Join(fixtureDirPath, fixtureDir)
29+
s.CreateFixtures(fixturePath, nil)
30+
defer s.CleanupFixtures(fixturePath, nil)
31+
32+
// Expected Conditions
33+
expectationsPath := path.Join(fixturePath, "expectations")
34+
expectedCondPath := path.Join(expectationsPath, "route-conditions.yaml")
35+
expectedConditions := s.YamlToRouteConditions(expectedCondPath)
36+
37+
route := "route-echo-http"
38+
s.expectRouteConditionsUpdated(s.Test().Ctx, s.Test().Namespace, route, expectedConditions)
39+
40+
// Check AttachedRoutes on Gateway status
41+
s.expectAttachedRoute(s.Test().Ctx, s.Test().Namespace, "hug-gateway", "http", 1)
42+
s.expectAttachedRoute(s.Test().Ctx, s.Test().Namespace, "hug-gateway", "https", 1)
43+
44+
// Check Maps
45+
expectedMapsPath := path.Join(expectationsPath, "maps")
46+
47+
// For FE http
48+
mapFilePath := "link1_" + s.Test().Namespace + "_hug-gateway_http"
49+
s.Eventually(func() bool {
50+
return s.CheckMapContents(mapFilePath, expectedMapsPath)
51+
}, timeout, interval, fmt.Sprintf("maps in %s did not match expected contents", mapFilePath))
52+
53+
// For FE https
54+
mapFilePath = "link1_" + s.Test().Namespace + "_hug-gateway_https"
55+
s.Eventually(func() bool {
56+
return s.CheckMapContents(mapFilePath, expectedMapsPath)
57+
}, timeout, interval, fmt.Sprintf("maps in %s did not match expected contents", mapFilePath))
58+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
kind: Deployment
2+
apiVersion: apps/v1
3+
metadata:
4+
name: http-echo
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: http-echo
10+
template:
11+
metadata:
12+
labels:
13+
app: http-echo
14+
spec:
15+
containers:
16+
- name: http-echo
17+
image: "haproxytech/http-echo:latest"
18+
imagePullPolicy: Never
19+
ports:
20+
- name: http
21+
containerPort: 8888
22+
protocol: TCP
23+
- name: https
24+
containerPort: 8443
25+
protocol: TCP
26+
---
27+
kind: Service
28+
apiVersion: v1
29+
metadata:
30+
name: http-echo
31+
spec:
32+
ports:
33+
- name: http
34+
protocol: TCP
35+
port: 80
36+
targetPort: http
37+
- name: https
38+
protocol: TCP
39+
port: 443
40+
targetPort: https
41+
selector:
42+
app: http-echo
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
offload.haproxy/api/ link1_e2e-tests-hostnames-matchtype_http-echo_80__
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
parents:
2+
- conditions:
3+
- message: Route Accepted
4+
reason: Accepted
5+
status: "True"
6+
type: Accepted
7+
- message: References resolved
8+
reason: ResolvedRefs
9+
status: "True"
10+
type: ResolvedRefs
11+
controllerName: gate.haproxy.org/hug
12+
parentRef:
13+
group: gateway.networking.k8s.io
14+
kind: Gateway
15+
name: hug-gateway
16+
sectionName: http
17+
- conditions:
18+
- message: Route Accepted
19+
reason: Accepted
20+
status: "True"
21+
type: Accepted
22+
- message: References resolved
23+
reason: ResolvedRefs
24+
status: "True"
25+
type: ResolvedRefs
26+
controllerName: gate.haproxy.org/hug
27+
parentRef:
28+
group: gateway.networking.k8s.io
29+
kind: Gateway
30+
name: hug-gateway
31+
sectionName: https

0 commit comments

Comments
 (0)