Skip to content

Commit 7e3e6fc

Browse files
authored
Prevent policy includes duplication in advanced routing configuration (#3799)
1 parent c3d544b commit 7e3e6fc

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed

internal/controller/state/dataplane/configuration.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,10 @@ func (hpr *hostPathRules) upsertRoute(
591591
if !exist {
592592
hostRule.Path = path
593593
hostRule.PathType = convertPathType(*m.Path.Type)
594+
hostRule.Policies = append(hostRule.Policies, pols...)
594595
}
595596

596597
hostRule.GRPC = GRPC
597-
hostRule.Policies = append(hostRule.Policies, pols...)
598598

599599
hostRule.MatchRules = append(hostRule.MatchRules, MatchRule{
600600
Source: objectSrc,

internal/controller/state/dataplane/configuration_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,37 @@ func TestBuildConfiguration(t *testing.T) {
680680
},
681681
)
682682

683+
hrAdvancedRouteWithPolicyAndHeaderMatch,
684+
groupsHRAdvancedWithHeaderMatch,
685+
routeHRAdvancedWithHeaderMatch := createTestResources(
686+
"hr-advanced-route-with-policy-header-match",
687+
"policy.com",
688+
"listener-80-1",
689+
pathAndType{path: "/rest", pathType: prefix},
690+
)
691+
692+
pathMatch := helpers.GetPointer(v1.HTTPPathMatch{
693+
Value: helpers.GetPointer("/rest"),
694+
Type: helpers.GetPointer(v1.PathMatchPathPrefix),
695+
})
696+
697+
routeHRAdvancedWithHeaderMatch.Spec.Rules[0].Matches = []v1.HTTPRouteMatch{
698+
{
699+
Path: pathMatch,
700+
Headers: []v1.HTTPHeaderMatch{
701+
{
702+
Name: "Referrer",
703+
Type: helpers.GetPointer(v1.HeaderMatchRegularExpression),
704+
Value: "(?i)(mydomain|myotherdomain).+\\.example\\.(cloud|com)",
705+
},
706+
},
707+
},
708+
{
709+
Path: pathMatch,
710+
},
711+
}
712+
routeHRAdvancedWithHeaderMatch.Spec.Hostnames = []v1.Hostname{"policy.com"}
713+
683714
l7RouteWithPolicy.Policies = []*graph.Policy{hrPolicy1, invalidPolicy}
684715

685716
httpsHRWithPolicy, expHTTPSHRWithPolicyGroups, l7HTTPSRouteWithPolicy := createTestResources(
@@ -2346,6 +2377,74 @@ func TestBuildConfiguration(t *testing.T) {
23462377
}),
23472378
msg: "Simple Gateway and HTTPRoute with policies attached",
23482379
},
2380+
{
2381+
graph: getModifiedGraph(func(g *graph.Graph) *graph.Graph {
2382+
gw := g.Gateways[gatewayNsName]
2383+
gw.Listeners = append(gw.Listeners, []*graph.Listener{
2384+
{
2385+
Name: "listener-80-1",
2386+
GatewayName: gatewayNsName,
2387+
Source: listener80,
2388+
Valid: true,
2389+
Routes: map[graph.RouteKey]*graph.L7Route{
2390+
graph.CreateRouteKey(hrAdvancedRouteWithPolicyAndHeaderMatch): routeHRAdvancedWithHeaderMatch,
2391+
},
2392+
},
2393+
}...)
2394+
gw.Policies = []*graph.Policy{gwPolicy1, gwPolicy2}
2395+
routeHRAdvancedWithHeaderMatch.Policies = []*graph.Policy{hrPolicy1}
2396+
g.Routes = map[graph.RouteKey]*graph.L7Route{
2397+
graph.CreateRouteKey(hrAdvancedRouteWithPolicyAndHeaderMatch): routeHRAdvancedWithHeaderMatch,
2398+
}
2399+
return g
2400+
}),
2401+
expConf: getModifiedExpectedConfiguration(func(conf Configuration) Configuration {
2402+
conf.SSLServers = []VirtualServer{}
2403+
conf.SSLKeyPairs = map[SSLKeyPairID]SSLKeyPair{}
2404+
conf.HTTPServers = []VirtualServer{
2405+
{
2406+
IsDefault: true,
2407+
Port: 80,
2408+
Policies: []policies.Policy{gwPolicy1.Source, gwPolicy2.Source},
2409+
},
2410+
{
2411+
Hostname: "policy.com",
2412+
PathRules: []PathRule{
2413+
{
2414+
Path: "/rest",
2415+
PathType: PathTypePrefix,
2416+
MatchRules: []MatchRule{
2417+
{
2418+
BackendGroup: groupsHRAdvancedWithHeaderMatch[0],
2419+
Source: &hrAdvancedRouteWithPolicyAndHeaderMatch.ObjectMeta,
2420+
Match: Match{
2421+
Headers: []HTTPHeaderMatch{
2422+
{
2423+
Name: "Referrer",
2424+
Value: "(?i)(mydomain|myotherdomain).+\\.example\\.(cloud|com)",
2425+
Type: "RegularExpression",
2426+
},
2427+
},
2428+
},
2429+
},
2430+
{
2431+
BackendGroup: groupsHRAdvancedWithHeaderMatch[0],
2432+
Source: &hrAdvancedRouteWithPolicyAndHeaderMatch.ObjectMeta,
2433+
},
2434+
},
2435+
Policies: []policies.Policy{hrPolicy1.Source},
2436+
},
2437+
},
2438+
Port: 80,
2439+
Policies: []policies.Policy{gwPolicy1.Source, gwPolicy2.Source},
2440+
},
2441+
}
2442+
conf.Upstreams = []Upstream{fooUpstream}
2443+
conf.BackendGroups = []BackendGroup{groupsHRAdvancedWithHeaderMatch[0]}
2444+
return conf
2445+
}),
2446+
msg: "Gateway and HTTPRoute with policies attached with advanced routing",
2447+
},
23492448
{
23502449
graph: getModifiedGraph(func(g *graph.Graph) *graph.Graph {
23512450
gw := g.Gateways[gatewayNsName]

0 commit comments

Comments
 (0)