Skip to content

Commit 2948b38

Browse files
authored
Fix ForwardBackend filters initialization in routegroup (#4122)
Align filter cleanup behavior between ingress and routegroup processing in kubernetes dataclient. Filters are cleaned up during the processing of ingress and left as is during the processing of routegroups. IIUC the logic, default filters will not be cleared anyway, because they are added later in polling.go. This is the risk we should accept. Signed-off-by: Aleksandr Ponimaskin <aleksandr.ponimaskin@zalando.de>
1 parent c26883b commit 2948b38

7 files changed

Lines changed: 72 additions & 0 deletions

File tree

dataclients/kubernetes/routegroup.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ func applyBackend(ctx *routeGroupContext, backend *definitions.SkipperBackend, r
298298
case eskip.ForwardBackend:
299299
r.Backend = ctx.forwardBackendURL
300300
r.BackendType = eskip.NetworkBackend
301+
r.Filters = []*eskip.Filter{}
301302
}
302303

303304
if ctx.backendNameTracingTag {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
kube_rg____example_org__catchall__0_0:
2+
Host("^(example[.]org[.]?(:[0-9]+)?)$")
3+
-> <shunt>;
4+
5+
kube_rg__default__myapp__all__0_0:
6+
Host("^(example[.]org[.]?(:[0-9]+)?)$")
7+
&& PathSubtree("/")
8+
-> "http://forward.example";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
forward-backend-url: http://forward.example
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: zalando.org/v1
2+
kind: RouteGroup
3+
metadata:
4+
name: myapp
5+
spec:
6+
hosts:
7+
- example.org
8+
backends:
9+
- name: fwd
10+
type: forward
11+
routes:
12+
- pathSubtree: /
13+
filters:
14+
- status(200)
15+
backends:
16+
- backendName: fwd

routesrv/routesrv_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,37 @@ func TestRoutesWithForwardBackend(t *testing.T) {
651651
wantHTTPCode(t, w, http.StatusOK)
652652
}
653653

654+
func TestRoutesWithForwardBackendFiltersDropped(t *testing.T) {
655+
defer tl.Reset()
656+
ks, _ := newKubeServer(t, loadKubeYAML(t, "testdata/forward-backend-with-filter.yaml"))
657+
ks.Start()
658+
defer ks.Close()
659+
rs := newRouteServerWithOptions(t, skipper.Options{
660+
SourcePollTimeout: pollInterval,
661+
Kubernetes: true,
662+
KubernetesURL: ks.URL,
663+
ForwardBackendURL: "http://forward.example",
664+
})
665+
666+
rs.StartUpdates()
667+
defer rs.StopUpdates()
668+
669+
if err := tl.WaitFor(routesrv.LogRoutesInitialized, waitTimeout); err != nil {
670+
t.Fatalf("routes not initialized: %v", err)
671+
}
672+
w := getRoutes(rs)
673+
674+
want := parseEskipFixture(t, "testdata/forward-backend-with-filter.eskip")
675+
got, err := eskip.Parse(w.Body.String())
676+
if err != nil {
677+
t.Fatalf("served routes are not valid eskip: %s", w.Body)
678+
}
679+
if !eskip.EqLists(got, want) {
680+
t.Errorf("expected to receive route without filters: %s", cmp.Diff(got, want))
681+
}
682+
wantHTTPCode(t, w, http.StatusOK)
683+
}
684+
654685
func TestESkipBytesHandlerWithCorrectEtag(t *testing.T) {
655686
defer tl.Reset()
656687
ks, _ := newKubeServer(t, loadKubeYAML(t, "testdata/lb-target-multi.yaml"))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
kube_rg__default__my_test__all__0_0: PathSubtree("/") -> "http://forward.example";
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: zalando.org/v1
2+
kind: RouteGroup
3+
metadata:
4+
name: my-test
5+
spec:
6+
backends:
7+
- name: fwd
8+
type: forward
9+
routes:
10+
- pathSubtree: /
11+
filters:
12+
- status(200)
13+
backends:
14+
- backendName: fwd

0 commit comments

Comments
 (0)