Skip to content

Commit dd24f50

Browse files
authored
[backport release/3.0.x] fix: Ingress with default backend targeting the same Service (#5188) (#5219)
1 parent bf8cd6f commit dd24f50

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

internal/dataplane/parser/translate_ingress.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ func (p *Parser) ingressRulesFromIngressV1() ingressRules {
6464
// Add a default backend if it exists.
6565
defaultBackendService, ok := getDefaultBackendService(allDefaultBackends, p.featureFlags.ExpressionRoutes)
6666
if ok {
67+
// When such service would overwrite an existing service, merge the routes.
68+
if svc, ok := result.ServiceNameToServices[*defaultBackendService.Name]; ok {
69+
svc.Routes = append(svc.Routes, defaultBackendService.Routes...)
70+
defaultBackendService = svc
71+
}
6772
result.ServiceNameToServices[*defaultBackendService.Name] = defaultBackendService
6873
result.ServiceNameToParent[*defaultBackendService.Name] = defaultBackendService.Parent
6974
}

test/integration/ingress_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,48 @@ func TestIngressEssentials(t *testing.T) {
151151
helpers.EventuallyExpectHTTP404WithNoRoute(t, proxyURL, proxyURL.Host, "/test_ingress_essentials", ingressWait, waitTick, nil)
152152
}
153153

154+
func TestIngressDefaultBackend(t *testing.T) {
155+
ctx := context.Background()
156+
ns, cleaner := helpers.Setup(ctx, t, env)
157+
158+
t.Log("deploying a minimal HTTP container deployment to test Ingress routes")
159+
container := generators.NewContainer("httpbin", test.HTTPBinImage, test.HTTPBinPort)
160+
deployment := generators.NewDeploymentForContainer(container)
161+
deployment, err := env.Cluster().Client().AppsV1().Deployments(ns.Name).Create(ctx, deployment, metav1.CreateOptions{})
162+
require.NoError(t, err)
163+
cleaner.Add(deployment)
164+
165+
t.Logf("exposing deployment %s via service", deployment.Name)
166+
service := generators.NewServiceForDeployment(deployment, corev1.ServiceTypeLoadBalancer)
167+
_, err = env.Cluster().Client().CoreV1().Services(ns.Name).Create(ctx, service, metav1.CreateOptions{})
168+
require.NoError(t, err)
169+
cleaner.Add(service)
170+
171+
t.Logf("creating an ingress for service %s with ingress.class %s", service.Name, consts.IngressClass)
172+
ingress := generators.NewIngressForService("/foo", map[string]string{
173+
"konghq.com/strip-path": "true",
174+
}, service)
175+
ingress.Spec.IngressClassName = kong.String(consts.IngressClass)
176+
ingress.Spec.DefaultBackend = &netv1.IngressBackend{
177+
Service: &netv1.IngressServiceBackend{
178+
Name: service.Name,
179+
Port: netv1.ServiceBackendPort{
180+
Number: service.Spec.Ports[0].Port,
181+
},
182+
},
183+
}
184+
require.NoError(t, clusters.DeployIngress(ctx, env.Cluster(), ns.Name, ingress))
185+
cleaner.Add(ingress)
186+
187+
t.Log("matching path")
188+
helpers.EventuallyGETPath(t, nil, proxyURL.String(), "/foo", http.StatusOK, "<title>httpbin.org</title>", nil, ingressWait, waitTick)
189+
190+
t.Log("non matching path - use default backend")
191+
helpers.EventuallyGETPath(
192+
t, nil, proxyURL.String(), fmt.Sprintf("/status/%d", http.StatusTeapot), http.StatusTeapot, "", nil, ingressWait, waitTick,
193+
)
194+
}
195+
154196
func TestGRPCIngressEssentials(t *testing.T) {
155197
t.Parallel()
156198

0 commit comments

Comments
 (0)