Skip to content
This repository was archived by the owner on Jul 11, 2023. It is now read-only.

Commit 7046cf2

Browse files
authored
rate-limiting: plumb config into inbound policies (#4807)
Plumbs the tcp, virtual_host and per route rate limiting configs into the inbound traffic policy objects. Next, they will be mapped to Envoy listener and route configs. Part of #2018 Signed-off-by: Shashank Ram <[email protected]>
1 parent 3061b05 commit 7046cf2

File tree

5 files changed

+484
-41
lines changed

5 files changed

+484
-41
lines changed

pkg/catalog/inbound_traffic_policies.go

+26-10
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import (
66
mapset "github.com/deckarep/golang-set"
77
access "github.com/servicemeshinterface/smi-sdk-go/pkg/apis/access/v1alpha3"
88

9+
policyv1alpha1 "github.com/openservicemesh/osm/pkg/apis/policy/v1alpha1"
10+
911
"github.com/openservicemesh/osm/pkg/constants"
1012
"github.com/openservicemesh/osm/pkg/errcode"
1113
"github.com/openservicemesh/osm/pkg/identity"
1214
"github.com/openservicemesh/osm/pkg/k8s"
15+
"github.com/openservicemesh/osm/pkg/policy"
1316
"github.com/openservicemesh/osm/pkg/service"
1417
"github.com/openservicemesh/osm/pkg/smi"
1518
"github.com/openservicemesh/osm/pkg/trafficpolicy"
@@ -44,6 +47,8 @@ func (mc *MeshCatalog) GetInboundMeshTrafficPolicy(upstreamIdentity identity.Ser
4447

4548
// Build configurations per upstream service
4649
for _, upstreamSvc := range allUpstreamServices {
50+
upstreamSvc := upstreamSvc // To prevent loop variable memory aliasing in for loop
51+
4752
// ---
4853
// Create local cluster configs for this upstram service
4954
clusterConfigForSvc := &trafficpolicy.MeshClusterConfig{
@@ -64,6 +69,13 @@ func (mc *MeshCatalog) GetInboundMeshTrafficPolicy(upstreamIdentity identity.Ser
6469
DestinationPort: int(upstreamSvc.TargetPort),
6570
DestinationProtocol: upstreamSvc.Protocol,
6671
}
72+
73+
upstreamTrafficSetting := mc.policyController.GetUpstreamTrafficSetting(
74+
policy.UpstreamTrafficSettingGetOpt{MeshService: &upstreamSvc})
75+
if upstreamTrafficSetting != nil {
76+
trafficMatchForUpstreamSvc.RateLimit = upstreamTrafficSetting.Spec.RateLimit
77+
}
78+
6779
trafficMatches = append(trafficMatches, trafficMatchForUpstreamSvc)
6880

6981
// Build the HTTP route configs for this service and port combination.
@@ -77,7 +89,7 @@ func (mc *MeshCatalog) GetInboundMeshTrafficPolicy(upstreamIdentity identity.Ser
7789
// The routes are derived from SMI TrafficTarget and TrafficSplit policies in SMI mode,
7890
// and are wildcarded in permissive mode. The downstreams that can access this upstream
7991
// on the configured routes is also determined based on the traffic policy mode.
80-
inboundTrafficPolicies := mc.getInboundTrafficPoliciesForUpstream(upstreamSvc, permissiveMode, trafficTargets)
92+
inboundTrafficPolicies := mc.getInboundTrafficPoliciesForUpstream(upstreamSvc, permissiveMode, trafficTargets, upstreamTrafficSetting)
8193
routeConfigPerPort[int(upstreamSvc.TargetPort)] = append(routeConfigPerPort[int(upstreamSvc.TargetPort)], inboundTrafficPolicies)
8294
}
8395

@@ -88,35 +100,38 @@ func (mc *MeshCatalog) GetInboundMeshTrafficPolicy(upstreamIdentity identity.Ser
88100
}
89101
}
90102

91-
func (mc *MeshCatalog) getInboundTrafficPoliciesForUpstream(upstreamSvc service.MeshService, permissiveMode bool, trafficTargets []*access.TrafficTarget) *trafficpolicy.InboundTrafficPolicy {
103+
func (mc *MeshCatalog) getInboundTrafficPoliciesForUpstream(upstreamSvc service.MeshService, permissiveMode bool,
104+
trafficTargets []*access.TrafficTarget, upstreamTrafficSetting *policyv1alpha1.UpstreamTrafficSetting) *trafficpolicy.InboundTrafficPolicy {
92105
var inboundPolicyForUpstreamSvc *trafficpolicy.InboundTrafficPolicy
93106

94107
if permissiveMode {
95108
// Add a wildcard HTTP route that allows any downstream client to access the upstream service
96109
hostnames := k8s.GetHostnamesForService(upstreamSvc, true /* local namespace FQDN should always be allowed for inbound routes*/)
97-
inboundPolicyForUpstreamSvc = trafficpolicy.NewInboundTrafficPolicy(upstreamSvc.FQDN(), hostnames)
110+
inboundPolicyForUpstreamSvc = trafficpolicy.NewInboundTrafficPolicy(upstreamSvc.FQDN(), hostnames, upstreamTrafficSetting)
98111
localCluster := service.WeightedCluster{
99112
ClusterName: service.ClusterName(upstreamSvc.EnvoyLocalClusterName()),
100113
Weight: constants.ClusterWeightAcceptAll,
101114
}
102115
// Only a single rule for permissive mode.
103116
inboundPolicyForUpstreamSvc.Rules = []*trafficpolicy.Rule{
104117
{
105-
Route: *trafficpolicy.NewRouteWeightedCluster(trafficpolicy.WildCardRouteMatch, []service.WeightedCluster{localCluster}),
118+
Route: *trafficpolicy.NewRouteWeightedCluster(trafficpolicy.WildCardRouteMatch, []service.WeightedCluster{localCluster}, upstreamTrafficSetting),
106119
AllowedServiceIdentities: mapset.NewSetWith(identity.WildcardServiceIdentity),
107120
},
108121
}
109122
} else {
110123
// Build the HTTP routes from SMI TrafficTarget and HTTPRouteGroup configurations
111-
inboundPolicyForUpstreamSvc = mc.buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc, trafficTargets)
124+
inboundPolicyForUpstreamSvc = mc.buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc, trafficTargets, upstreamTrafficSetting)
112125
}
113126

114127
return inboundPolicyForUpstreamSvc
115128
}
116129

117-
func (mc *MeshCatalog) buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc service.MeshService, trafficTargets []*access.TrafficTarget) *trafficpolicy.InboundTrafficPolicy {
130+
func (mc *MeshCatalog) buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc service.MeshService, trafficTargets []*access.TrafficTarget,
131+
upstreamTrafficSetting *policyv1alpha1.UpstreamTrafficSetting) *trafficpolicy.InboundTrafficPolicy {
118132
hostnames := k8s.GetHostnamesForService(upstreamSvc, true /* local namespace FQDN should always be allowed for inbound routes*/)
119-
inboundPolicy := trafficpolicy.NewInboundTrafficPolicy(upstreamSvc.FQDN(), hostnames)
133+
inboundPolicy := trafficpolicy.NewInboundTrafficPolicy(upstreamSvc.FQDN(), hostnames, upstreamTrafficSetting)
134+
120135
localCluster := service.WeightedCluster{
121136
ClusterName: service.ClusterName(upstreamSvc.EnvoyLocalClusterName()),
122137
Weight: constants.ClusterWeightAcceptAll,
@@ -125,7 +140,7 @@ func (mc *MeshCatalog) buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc servi
125140
var routingRules []*trafficpolicy.Rule
126141
// From each TrafficTarget and HTTPRouteGroup configuration associated with this service, build routes for it.
127142
for _, trafficTarget := range trafficTargets {
128-
rules := mc.getRoutingRulesFromTrafficTarget(*trafficTarget, localCluster)
143+
rules := mc.getRoutingRulesFromTrafficTarget(*trafficTarget, localCluster, upstreamTrafficSetting)
129144
// Multiple TrafficTarget objects can reference the same route, in which case such routes
130145
// need to be merged to create a single route that includes all the downstream client identities
131146
// this route is authorized for.
@@ -136,7 +151,8 @@ func (mc *MeshCatalog) buildInboundHTTPPolicyFromTrafficTarget(upstreamSvc servi
136151
return inboundPolicy
137152
}
138153

139-
func (mc *MeshCatalog) getRoutingRulesFromTrafficTarget(trafficTarget access.TrafficTarget, routingCluster service.WeightedCluster) []*trafficpolicy.Rule {
154+
func (mc *MeshCatalog) getRoutingRulesFromTrafficTarget(trafficTarget access.TrafficTarget, routingCluster service.WeightedCluster,
155+
upstreamTrafficSetting *policyv1alpha1.UpstreamTrafficSetting) []*trafficpolicy.Rule {
140156
// Compute the HTTP route matches associated with the given TrafficTarget object
141157
httpRouteMatches, err := mc.routesFromRules(trafficTarget.Spec.Rules, trafficTarget.Namespace)
142158
if err != nil {
@@ -155,7 +171,7 @@ func (mc *MeshCatalog) getRoutingRulesFromTrafficTarget(trafficTarget access.Tra
155171
var routingRules []*trafficpolicy.Rule
156172
for _, httpRouteMatch := range httpRouteMatches {
157173
rule := &trafficpolicy.Rule{
158-
Route: *trafficpolicy.NewRouteWeightedCluster(httpRouteMatch, []service.WeightedCluster{routingCluster}),
174+
Route: *trafficpolicy.NewRouteWeightedCluster(httpRouteMatch, []service.WeightedCluster{routingCluster}, upstreamTrafficSetting),
159175
AllowedServiceIdentities: allowedDownstreamIdentities,
160176
}
161177
routingRules = append(routingRules, rule)

0 commit comments

Comments
 (0)