From e02d8eeaaeb05055694f485113215b5ff6231cb0 Mon Sep 17 00:00:00 2001 From: Travis Raines <571832+rainest@users.noreply.github.com> Date: Tue, 15 Aug 2023 02:17:54 -0700 Subject: [PATCH] fix(parser) populate Service port in services (#4503) * fix(parser) populate Service port in services When generating Kong services, use the Service port from the Ingress backend instead of the default HTTP port. This is a cosmetic change. These ports are not actually used by the routing engine, as all KIC-generated services use upstreams and the ports associated with their targets (which are the target ports on the Service's Endpoints). * chore(parser) update golden tests --- CHANGELOG.md | 6 +++++- internal/dataplane/parser/parser.go | 18 ++++++++++++------ .../httproute-example/default_golden.yaml | 1 + .../expression-routes-on_golden.yaml | 1 + .../combined-routes-off_golden.yaml | 2 +- .../combined-services_golden.yaml | 2 +- .../default_golden.yaml | 2 +- .../expression-routes-on_golden.yaml | 2 +- .../default_golden.yaml | 1 + 9 files changed, 24 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1534b766c..766d8ba34d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,7 +74,11 @@ Adding a new version? You'll need three changes: ## Unreleased -Nothing yet. +### Fixed + +- Display Service ports on generated Kong services, instead of a static default + value. This change is cosmetic only. + [#4503](https://github.com/Kong/kubernetes-ingress-controller/pull/4503) ## [2.11.0] diff --git a/internal/dataplane/parser/parser.go b/internal/dataplane/parser/parser.go index f021fd569c..7600a1b543 100644 --- a/internal/dataplane/parser/parser.go +++ b/internal/dataplane/parser/parser.go @@ -10,6 +10,7 @@ import ( "github.com/blang/semver/v4" "github.com/kong/go-kong/kong" + "github.com/samber/lo" "github.com/samber/mo" "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" @@ -212,6 +213,12 @@ func (p *Parser) BuildKongConfig() KongConfigBuildingResult { // add the routes and services to the state var result kongstate.KongState + + // generate Upstreams and Targets from service defs + // update ServiceNameToServices with resolved ports (translating any name references to their number, as Kong + // services require a number) + result.Upstreams, ingressRules.ServiceNameToServices = p.getUpstreams(ingressRules.ServiceNameToServices) + for key, service := range ingressRules.ServiceNameToServices { // if the service doesn't need to be skipped, then add it to the // list of services. @@ -220,9 +227,6 @@ func (p *Parser) BuildKongConfig() KongConfigBuildingResult { } } - // generate Upstreams and Targets from service defs - result.Upstreams = p.getUpstreams(ingressRules.ServiceNameToServices) - // merge KongIngress with Routes, Services and Upstream result.FillOverrides(p.logger, p.storer) @@ -379,11 +383,11 @@ func findPort(svc *corev1.Service, wantPort kongstate.PortDef) (*corev1.ServiceP return nil, fmt.Errorf("no suitable port found") } -func (p *Parser) getUpstreams(serviceMap map[string]kongstate.Service) []kongstate.Upstream { +func (p *Parser) getUpstreams(serviceMap map[string]kongstate.Service) ([]kongstate.Upstream, map[string]kongstate.Service) { upstreamDedup := make(map[string]struct{}, len(serviceMap)) var empty struct{} upstreams := make([]kongstate.Upstream, 0, len(serviceMap)) - for _, service := range serviceMap { + for serviceName, service := range serviceMap { // the name of the Upstream for a service must match the service.Host // as the Gateway's internal DNS resolve mechanisms will fail to properly // resolve the host otherwise. @@ -420,6 +424,8 @@ func (p *Parser) getUpstreams(serviceMap map[string]kongstate.Service) []kongsta ) continue } + service.Port = lo.ToPtr(int(port.Port)) + serviceMap[serviceName] = service // get the new targets for this backend service newTargets := getServiceEndpoints(p.logger, p.storer, k8sService, port) @@ -477,7 +483,7 @@ func (p *Parser) getUpstreams(serviceMap map[string]kongstate.Service) []kongsta upstreamDedup[name] = empty } } - return upstreams + return upstreams, serviceMap } func getCertFromSecret(secret *corev1.Secret) (string, string, error) { diff --git a/internal/dataplane/parser/testdata/golden/httproute-example/default_golden.yaml b/internal/dataplane/parser/testdata/golden/httproute-example/default_golden.yaml index 0e62628465..d74daa777b 100644 --- a/internal/dataplane/parser/testdata/golden/httproute-example/default_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/httproute-example/default_golden.yaml @@ -3,6 +3,7 @@ services: - connect_timeout: 60000 host: httproute..httproute-testing.0 name: httproute..httproute-testing.0 + port: 8080 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/httproute-example/expression-routes-on_golden.yaml b/internal/dataplane/parser/testdata/golden/httproute-example/expression-routes-on_golden.yaml index 29fde19ff6..dce1571806 100644 --- a/internal/dataplane/parser/testdata/golden/httproute-example/expression-routes-on_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/httproute-example/expression-routes-on_golden.yaml @@ -3,6 +3,7 @@ services: - connect_timeout: 60000 host: httproute..httproute-testing._.0 name: httproute..httproute-testing._.0 + port: 8080 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-routes-off_golden.yaml b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-routes-off_golden.yaml index 23b33f5ff7..7c5af40513 100644 --- a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-routes-off_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-routes-off_golden.yaml @@ -4,7 +4,7 @@ services: host: foo-svc.foo-namespace.8000.svc name: foo-namespace.foo-svc.pnum-8000 path: / - port: 80 + port: 8000 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-services_golden.yaml b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-services_golden.yaml index 2365c53e11..7459dc7bf2 100644 --- a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-services_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/combined-services_golden.yaml @@ -4,7 +4,7 @@ services: host: foo-svc.foo-namespace.8000.svc name: foo-namespace.foo-svc.8000 path: / - port: 80 + port: 8000 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/default_golden.yaml b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/default_golden.yaml index 2365c53e11..7459dc7bf2 100644 --- a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/default_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/default_golden.yaml @@ -4,7 +4,7 @@ services: host: foo-svc.foo-namespace.8000.svc name: foo-namespace.foo-svc.8000 path: / - port: 80 + port: 8000 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/expression-routes-on_golden.yaml b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/expression-routes-on_golden.yaml index 783bd201fa..d229785369 100644 --- a/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/expression-routes-on_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/ingress-v1-multiple-ports-for-one-service/expression-routes-on_golden.yaml @@ -4,7 +4,7 @@ services: host: foo-svc.foo-namespace.8000.svc name: foo-namespace.foo-svc.8000 path: / - port: 80 + port: 8000 protocol: http read_timeout: 60000 retries: 5 diff --git a/internal/dataplane/parser/testdata/golden/same-name-services-single-backend/default_golden.yaml b/internal/dataplane/parser/testdata/golden/same-name-services-single-backend/default_golden.yaml index e4fb8a1377..4faa018bf2 100644 --- a/internal/dataplane/parser/testdata/golden/same-name-services-single-backend/default_golden.yaml +++ b/internal/dataplane/parser/testdata/golden/same-name-services-single-backend/default_golden.yaml @@ -3,6 +3,7 @@ services: - connect_timeout: 60000 host: httproute.default.test.0 name: httproute.default.test.0 + port: 80 protocol: http read_timeout: 60000 retries: 5