Skip to content

Commit f346ae3

Browse files
authored
fix: match the wrong port (#112)
1 parent c6b9442 commit f346ae3

File tree

2 files changed

+87
-10
lines changed

2 files changed

+87
-10
lines changed

internal/provider/adc/translator/httproute.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,16 @@ func (t *Translator) fillHTTPRoutePolicies(routes []*adctypes.Route, policies []
266266
}
267267
}
268268

269-
func (t *Translator) translateEndpointSlice(weight int, endpointSlices []discoveryv1.EndpointSlice) adctypes.UpstreamNodes {
269+
func (t *Translator) translateEndpointSlice(portName *string, weight int, endpointSlices []discoveryv1.EndpointSlice) adctypes.UpstreamNodes {
270270
var nodes adctypes.UpstreamNodes
271271
if len(endpointSlices) == 0 {
272272
return nodes
273273
}
274274
for _, endpointSlice := range endpointSlices {
275275
for _, port := range endpointSlice.Ports {
276+
if portName != nil && !ptr.Equal(portName, port.Name) {
277+
continue
278+
}
276279
for _, endpoint := range endpointSlice.Endpoints {
277280
for _, addr := range endpoint.Addresses {
278281
node := adctypes.UpstreamNode{
@@ -283,21 +286,16 @@ func (t *Translator) translateEndpointSlice(weight int, endpointSlices []discove
283286
nodes = append(nodes, node)
284287
}
285288
}
289+
if portName != nil {
290+
break
291+
}
286292
}
287293
}
288294

289295
return nodes
290296
}
291297

292298
func (t *Translator) translateBackendRef(tctx *provider.TranslateContext, ref gatewayv1.BackendRef) adctypes.UpstreamNodes {
293-
weight := 1
294-
port := 80
295-
if ref.Weight != nil {
296-
weight = int(*ref.Weight)
297-
}
298-
if ref.Port != nil {
299-
port = int(*ref.Port)
300-
}
301299
key := types.NamespacedName{
302300
Namespace: string(*ref.Namespace),
303301
Name: string(ref.Name),
@@ -307,7 +305,16 @@ func (t *Translator) translateBackendRef(tctx *provider.TranslateContext, ref ga
307305
return adctypes.UpstreamNodes{}
308306
}
309307

308+
weight := 1
309+
if ref.Weight != nil {
310+
weight = int(*ref.Weight)
311+
}
312+
310313
if service.Spec.Type == corev1.ServiceTypeExternalName {
314+
port := 80
315+
if ref.Port != nil {
316+
port = int(*ref.Port)
317+
}
311318
return adctypes.UpstreamNodes{
312319
{
313320
Host: service.Spec.ExternalName,
@@ -316,8 +323,22 @@ func (t *Translator) translateBackendRef(tctx *provider.TranslateContext, ref ga
316323
},
317324
}
318325
}
326+
327+
var portName *string
328+
if ref.Port != nil {
329+
for _, p := range service.Spec.Ports {
330+
if int(p.Port) == int(*ref.Port) {
331+
portName = ptr.To(p.Name)
332+
break
333+
}
334+
}
335+
if portName == nil {
336+
return adctypes.UpstreamNodes{}
337+
}
338+
}
339+
319340
endpointSlices := tctx.EndpointSlices[key]
320-
return t.translateEndpointSlice(weight, endpointSlices)
341+
return t.translateEndpointSlice(portName, weight, endpointSlices)
321342
}
322343

323344
func (t *Translator) TranslateHTTPRoute(tctx *provider.TranslateContext, httpRoute *gatewayv1.HTTPRoute) (*TranslateResult, error) {

test/e2e/gatewayapi/httproute.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gatewayapi
22

33
import (
4+
"context"
45
"fmt"
56
"net/http"
67
"strings"
@@ -411,6 +412,47 @@ spec:
411412
- name: httpbin-service-e2e-test
412413
port: 80
413414
`
415+
var invalidBackendPort = `
416+
apiVersion: v1
417+
kind: Service
418+
metadata:
419+
name: httpbin-multiple-port
420+
spec:
421+
selector:
422+
app: httpbin-deployment-e2e-test
423+
ports:
424+
- name: http
425+
port: 80
426+
protocol: TCP
427+
targetPort: 80
428+
- name: invalid
429+
port: 10031
430+
protocol: TCP
431+
targetPort: 10031
432+
- name: http2
433+
port: 8080
434+
protocol: TCP
435+
targetPort: 80
436+
type: ClusterIP
437+
---
438+
apiVersion: gateway.networking.k8s.io/v1
439+
kind: HTTPRoute
440+
metadata:
441+
name: httpbin
442+
spec:
443+
parentRefs:
444+
- name: api7ee
445+
hostnames:
446+
- httpbin.example
447+
rules:
448+
- matches:
449+
- path:
450+
type: Exact
451+
value: /get
452+
backendRefs:
453+
- name: httpbin-multiple-port
454+
port: 80
455+
`
414456

415457
BeforeEach(beforeEachHTTP)
416458

@@ -476,6 +518,20 @@ spec:
476518
Expect().
477519
Status(200)
478520
})
521+
522+
It("Match Port", func() {
523+
By("create HTTPRoute")
524+
ResourceApplied("HTTPRoute", "httpbin", invalidBackendPort, 1)
525+
526+
serviceResources, err := s.DefaultDataplaneResource().Service().List(context.Background())
527+
Expect(err).NotTo(HaveOccurred(), "listing services")
528+
Expect(serviceResources).To(HaveLen(1), "checking service length")
529+
530+
serviceResource := serviceResources[0]
531+
nodes := serviceResource.Upstream.Nodes
532+
Expect(nodes).To(HaveLen(1), "checking nodes length")
533+
Expect(nodes[0].Port).To(Equal(80))
534+
})
479535
})
480536

481537
Context("HTTPRoute Rule Match", func() {

0 commit comments

Comments
 (0)