mirror of https://github.com/status-im/consul.git
CE commit (#18583)
This commit is contained in:
parent
c8ef063523
commit
ecdcde4309
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:feature
|
||||||
|
mesh: **(Enterprise only)** Adds rate limiting config to service-defaults
|
||||||
|
```
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
memdb "github.com/hashicorp/go-memdb"
|
"github.com/hashicorp/go-memdb"
|
||||||
"github.com/imdario/mergo"
|
"github.com/imdario/mergo"
|
||||||
"github.com/mitchellh/copystructure"
|
"github.com/mitchellh/copystructure"
|
||||||
|
|
||||||
|
@ -141,6 +141,10 @@ func MergeServiceConfig(defaults *structs.ServiceConfigResponse, service *struct
|
||||||
ns.Proxy.EnvoyExtensions = nsExtensions
|
ns.Proxy.EnvoyExtensions = nsExtensions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ratelimit := defaults.RateLimits.ToEnvoyExtension(); ratelimit != nil {
|
||||||
|
ns.Proxy.EnvoyExtensions = append(ns.Proxy.EnvoyExtensions, *ratelimit)
|
||||||
|
}
|
||||||
|
|
||||||
if ns.Proxy.MeshGateway.Mode == structs.MeshGatewayModeDefault {
|
if ns.Proxy.MeshGateway.Mode == structs.MeshGatewayModeDefault {
|
||||||
ns.Proxy.MeshGateway.Mode = defaults.MeshGateway.Mode
|
ns.Proxy.MeshGateway.Mode = defaults.MeshGateway.Mode
|
||||||
}
|
}
|
||||||
|
|
|
@ -972,3 +972,111 @@ func Test_MergeServiceConfig_UpstreamOverrides(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests that RateLimit config is a no-op in non-enterprise.
|
||||||
|
// In practice, the ratelimit config would have been validated
|
||||||
|
// on write.
|
||||||
|
func Test_MergeServiceConfig_RateLimit(t *testing.T) {
|
||||||
|
rl := structs.RateLimits{
|
||||||
|
InstanceLevel: structs.InstanceLevelRateLimits{
|
||||||
|
RequestsPerSecond: 1234,
|
||||||
|
RequestsMaxBurst: 2345,
|
||||||
|
Routes: []structs.InstanceLevelRouteRateLimits{
|
||||||
|
{
|
||||||
|
PathExact: "/admin",
|
||||||
|
RequestsPerSecond: 3333,
|
||||||
|
RequestsMaxBurst: 4444,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
defaults *structs.ServiceConfigResponse
|
||||||
|
service *structs.NodeService
|
||||||
|
want *structs.NodeService
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "injects ratelimit extension",
|
||||||
|
defaults: &structs.ServiceConfigResponse{
|
||||||
|
RateLimits: rl,
|
||||||
|
},
|
||||||
|
service: &structs.NodeService{
|
||||||
|
ID: "foo-proxy",
|
||||||
|
Service: "foo-proxy",
|
||||||
|
Proxy: structs.ConnectProxyConfig{
|
||||||
|
DestinationServiceName: "foo",
|
||||||
|
DestinationServiceID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: &structs.NodeService{
|
||||||
|
ID: "foo-proxy",
|
||||||
|
Service: "foo-proxy",
|
||||||
|
Proxy: structs.ConnectProxyConfig{
|
||||||
|
DestinationServiceName: "foo",
|
||||||
|
DestinationServiceID: "foo",
|
||||||
|
EnvoyExtensions: func() []structs.EnvoyExtension {
|
||||||
|
if ext := rl.ToEnvoyExtension(); ext != nil {
|
||||||
|
return []structs.EnvoyExtension{*ext}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "injects ratelimit extension at the end",
|
||||||
|
defaults: &structs.ServiceConfigResponse{
|
||||||
|
RateLimits: rl,
|
||||||
|
EnvoyExtensions: []structs.EnvoyExtension{
|
||||||
|
{
|
||||||
|
Name: "existing-ext",
|
||||||
|
Required: true,
|
||||||
|
Arguments: map[string]interface{}{
|
||||||
|
"arg1": "val1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
service: &structs.NodeService{
|
||||||
|
ID: "foo-proxy",
|
||||||
|
Service: "foo-proxy",
|
||||||
|
Proxy: structs.ConnectProxyConfig{
|
||||||
|
DestinationServiceName: "foo",
|
||||||
|
DestinationServiceID: "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
want: &structs.NodeService{
|
||||||
|
ID: "foo-proxy",
|
||||||
|
Service: "foo-proxy",
|
||||||
|
Proxy: structs.ConnectProxyConfig{
|
||||||
|
DestinationServiceName: "foo",
|
||||||
|
DestinationServiceID: "foo",
|
||||||
|
EnvoyExtensions: func() []structs.EnvoyExtension {
|
||||||
|
existing := []structs.EnvoyExtension{
|
||||||
|
{
|
||||||
|
Name: "existing-ext",
|
||||||
|
Required: true,
|
||||||
|
Arguments: map[string]interface{}{
|
||||||
|
"arg1": "val1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if ext := rl.ToEnvoyExtension(); ext != nil {
|
||||||
|
existing = append(existing, *ext)
|
||||||
|
}
|
||||||
|
return existing
|
||||||
|
}(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := MergeServiceConfig(tt.defaults, tt.service)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, tt.want, got)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -117,6 +117,9 @@ func ComputeResolvedServiceConfig(
|
||||||
if serviceConf.Destination != nil {
|
if serviceConf.Destination != nil {
|
||||||
thisReply.Destination = *serviceConf.Destination
|
thisReply.Destination = *serviceConf.Destination
|
||||||
}
|
}
|
||||||
|
if serviceConf.RateLimits != nil {
|
||||||
|
thisReply.RateLimits = *serviceConf.RateLimits
|
||||||
|
}
|
||||||
|
|
||||||
// Populate values for the proxy config map
|
// Populate values for the proxy config map
|
||||||
proxyConf := thisReply.ProxyConfig
|
proxyConf := thisReply.ProxyConfig
|
||||||
|
|
|
@ -165,6 +165,7 @@ type ServiceConfigEntry struct {
|
||||||
LocalConnectTimeoutMs int `json:",omitempty" alias:"local_connect_timeout_ms"`
|
LocalConnectTimeoutMs int `json:",omitempty" alias:"local_connect_timeout_ms"`
|
||||||
LocalRequestTimeoutMs int `json:",omitempty" alias:"local_request_timeout_ms"`
|
LocalRequestTimeoutMs int `json:",omitempty" alias:"local_request_timeout_ms"`
|
||||||
BalanceInboundConnections string `json:",omitempty" alias:"balance_inbound_connections"`
|
BalanceInboundConnections string `json:",omitempty" alias:"balance_inbound_connections"`
|
||||||
|
RateLimits *RateLimits `json:",omitempty" alias:"rate_limits"`
|
||||||
EnvoyExtensions EnvoyExtensions `json:",omitempty" alias:"envoy_extensions"`
|
EnvoyExtensions EnvoyExtensions `json:",omitempty" alias:"envoy_extensions"`
|
||||||
|
|
||||||
Meta map[string]string `json:",omitempty"`
|
Meta map[string]string `json:",omitempty"`
|
||||||
|
@ -286,6 +287,10 @@ func (e *ServiceConfigEntry) Validate() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := validateRatelimit(e.RateLimits); err != nil {
|
||||||
|
validationErr = multierror.Append(validationErr, err)
|
||||||
|
}
|
||||||
|
|
||||||
if err := envoyextensions.ValidateExtensions(e.EnvoyExtensions.ToAPI()); err != nil {
|
if err := envoyextensions.ValidateExtensions(e.EnvoyExtensions.ToAPI()); err != nil {
|
||||||
validationErr = multierror.Append(validationErr, err)
|
validationErr = multierror.Append(validationErr, err)
|
||||||
}
|
}
|
||||||
|
@ -382,16 +387,52 @@ type DestinationConfig struct {
|
||||||
Port int `json:",omitempty"`
|
Port int `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsHostname(address string) bool {
|
|
||||||
ip := net.ParseIP(address)
|
|
||||||
return ip == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsIP(address string) bool {
|
func IsIP(address string) bool {
|
||||||
ip := net.ParseIP(address)
|
ip := net.ParseIP(address)
|
||||||
return ip != nil
|
return ip != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RateLimits is rate limiting configuration that is applied to
|
||||||
|
// inbound traffic for a service.
|
||||||
|
// Rate limiting is a Consul enterprise feature.
|
||||||
|
type RateLimits struct {
|
||||||
|
InstanceLevel InstanceLevelRateLimits `alias:"instance_level"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstanceLevelRateLimits represents rate limit configuration
|
||||||
|
// that are applied per service instance.
|
||||||
|
type InstanceLevelRateLimits struct {
|
||||||
|
// RequestsPerSecond is the average number of requests per second that can be
|
||||||
|
// made without being throttled. This field is required if RequestsMaxBurst
|
||||||
|
// is set. The allowed number of requests may exceed RequestsPerSecond up to
|
||||||
|
// the value specified in RequestsMaxBurst.
|
||||||
|
//
|
||||||
|
// Internally, this is the refill rate of the token bucket used for rate limiting.
|
||||||
|
RequestsPerSecond int `alias:"requests_per_second"`
|
||||||
|
|
||||||
|
// RequestsMaxBurst is the maximum number of requests that can be sent
|
||||||
|
// in a burst. Should be equal to or greater than RequestsPerSecond.
|
||||||
|
// If unset, defaults to RequestsPerSecond.
|
||||||
|
//
|
||||||
|
// Internally, this is the maximum size of the token bucket used for rate limiting.
|
||||||
|
RequestsMaxBurst int `alias:"requests_max_burst"`
|
||||||
|
|
||||||
|
// Routes is a list of rate limits applied to specific routes.
|
||||||
|
// Overrides any top-level configuration.
|
||||||
|
Routes []InstanceLevelRouteRateLimits
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstanceLevelRouteRateLimits represents rate limit configuration
|
||||||
|
// applied to a route matching one of PathExact/PathPrefix/PathRegex.
|
||||||
|
type InstanceLevelRouteRateLimits struct {
|
||||||
|
PathExact string `alias:"path_exact"`
|
||||||
|
PathPrefix string `alias:"path_prefix"`
|
||||||
|
PathRegex string `alias:"path_regex"`
|
||||||
|
|
||||||
|
RequestsPerSecond int `alias:"requests_per_second"`
|
||||||
|
RequestsMaxBurst int `alias:"requests_max_burst"`
|
||||||
|
}
|
||||||
|
|
||||||
// ProxyConfigEntry is the top-level struct for global proxy configuration defaults.
|
// ProxyConfigEntry is the top-level struct for global proxy configuration defaults.
|
||||||
type ProxyConfigEntry struct {
|
type ProxyConfigEntry struct {
|
||||||
Kind string
|
Kind string
|
||||||
|
@ -1218,6 +1259,7 @@ type ServiceConfigResponse struct {
|
||||||
Mode ProxyMode `json:",omitempty"`
|
Mode ProxyMode `json:",omitempty"`
|
||||||
Destination DestinationConfig `json:",omitempty"`
|
Destination DestinationConfig `json:",omitempty"`
|
||||||
AccessLogs AccessLogsConfig `json:",omitempty"`
|
AccessLogs AccessLogsConfig `json:",omitempty"`
|
||||||
|
RateLimits RateLimits `json:",omitempty"`
|
||||||
Meta map[string]string `json:",omitempty"`
|
Meta map[string]string `json:",omitempty"`
|
||||||
EnvoyExtensions []EnvoyExtension `json:",omitempty"`
|
EnvoyExtensions []EnvoyExtension `json:",omitempty"`
|
||||||
QueryMeta
|
QueryMeta
|
||||||
|
|
|
@ -53,3 +53,12 @@ func validateExportedServicesName(name string) error {
|
||||||
func makeEnterpriseConfigEntry(kind, name string) ConfigEntry {
|
func makeEnterpriseConfigEntry(kind, name string) ConfigEntry {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateRatelimit(rl *RateLimits) error {
|
||||||
|
if rl != nil {
|
||||||
|
return fmt.Errorf("invalid rate_limits config. Rate limiting is a consul enterprise feature")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rl RateLimits) ToEnvoyExtension() *EnvoyExtension { return nil }
|
||||||
|
|
|
@ -897,6 +897,14 @@ func (o *ServiceConfigEntry) DeepCopy() *ServiceConfigEntry {
|
||||||
copy(cp.Destination.Addresses, o.Destination.Addresses)
|
copy(cp.Destination.Addresses, o.Destination.Addresses)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if o.RateLimits != nil {
|
||||||
|
cp.RateLimits = new(RateLimits)
|
||||||
|
*cp.RateLimits = *o.RateLimits
|
||||||
|
if o.RateLimits.InstanceLevel.Routes != nil {
|
||||||
|
cp.RateLimits.InstanceLevel.Routes = make([]InstanceLevelRouteRateLimits, len(o.RateLimits.InstanceLevel.Routes))
|
||||||
|
copy(cp.RateLimits.InstanceLevel.Routes, o.RateLimits.InstanceLevel.Routes)
|
||||||
|
}
|
||||||
|
}
|
||||||
if o.EnvoyExtensions != nil {
|
if o.EnvoyExtensions != nil {
|
||||||
cp.EnvoyExtensions = make([]EnvoyExtension, len(o.EnvoyExtensions))
|
cp.EnvoyExtensions = make([]EnvoyExtension, len(o.EnvoyExtensions))
|
||||||
copy(cp.EnvoyExtensions, o.EnvoyExtensions)
|
copy(cp.EnvoyExtensions, o.EnvoyExtensions)
|
||||||
|
@ -947,6 +955,10 @@ func (o *ServiceConfigResponse) DeepCopy() *ServiceConfigResponse {
|
||||||
cp.Destination.Addresses = make([]string, len(o.Destination.Addresses))
|
cp.Destination.Addresses = make([]string, len(o.Destination.Addresses))
|
||||||
copy(cp.Destination.Addresses, o.Destination.Addresses)
|
copy(cp.Destination.Addresses, o.Destination.Addresses)
|
||||||
}
|
}
|
||||||
|
if o.RateLimits.InstanceLevel.Routes != nil {
|
||||||
|
cp.RateLimits.InstanceLevel.Routes = make([]InstanceLevelRouteRateLimits, len(o.RateLimits.InstanceLevel.Routes))
|
||||||
|
copy(cp.RateLimits.InstanceLevel.Routes, o.RateLimits.InstanceLevel.Routes)
|
||||||
|
}
|
||||||
if o.Meta != nil {
|
if o.Meta != nil {
|
||||||
cp.Meta = make(map[string]string, len(o.Meta))
|
cp.Meta = make(map[string]string, len(o.Meta))
|
||||||
for k2, v2 := range o.Meta {
|
for k2, v2 := range o.Meta {
|
||||||
|
|
|
@ -314,6 +314,47 @@ type UpstreamLimits struct {
|
||||||
MaxConcurrentRequests *int `alias:"max_concurrent_requests"`
|
MaxConcurrentRequests *int `alias:"max_concurrent_requests"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RateLimits is rate limiting configuration that is applied to
|
||||||
|
// inbound traffic for a service.
|
||||||
|
// Rate limiting is a Consul enterprise feature.
|
||||||
|
type RateLimits struct {
|
||||||
|
InstanceLevel InstanceLevelRateLimits `alias:"instance_level"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstanceLevelRateLimits represents rate limit configuration
|
||||||
|
// that are applied per service instance.
|
||||||
|
type InstanceLevelRateLimits struct {
|
||||||
|
// RequestsPerSecond is the average number of requests per second that can be
|
||||||
|
// made without being throttled. This field is required if RequestsMaxBurst
|
||||||
|
// is set. The allowed number of requests may exceed RequestsPerSecond up to
|
||||||
|
// the value specified in RequestsMaxBurst.
|
||||||
|
//
|
||||||
|
// Internally, this is the refill rate of the token bucket used for rate limiting.
|
||||||
|
RequestsPerSecond int `alias:"requests_per_second"`
|
||||||
|
|
||||||
|
// RequestsMaxBurst is the maximum number of requests that can be sent
|
||||||
|
// in a burst. Should be equal to or greater than RequestsPerSecond.
|
||||||
|
// If unset, defaults to RequestsPerSecond.
|
||||||
|
//
|
||||||
|
// Internally, this is the maximum size of the token bucket used for rate limiting.
|
||||||
|
RequestsMaxBurst int `alias:"requests_max_burst"`
|
||||||
|
|
||||||
|
// Routes is a list of rate limits applied to specific routes.
|
||||||
|
// Overrides any top-level configuration.
|
||||||
|
Routes []InstanceLevelRouteRateLimits
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstanceLevelRouteRateLimits represents rate limit configuration
|
||||||
|
// applied to a route matching one of PathExact/PathPrefix/PathRegex.
|
||||||
|
type InstanceLevelRouteRateLimits struct {
|
||||||
|
PathExact string `alias:"path_exact"`
|
||||||
|
PathPrefix string `alias:"path_prefix"`
|
||||||
|
PathRegex string `alias:"path_regex"`
|
||||||
|
|
||||||
|
RequestsPerSecond int `alias:"requests_per_second"`
|
||||||
|
RequestsMaxBurst int `alias:"requests_max_burst"`
|
||||||
|
}
|
||||||
|
|
||||||
type ServiceConfigEntry struct {
|
type ServiceConfigEntry struct {
|
||||||
Kind string
|
Kind string
|
||||||
Name string
|
Name string
|
||||||
|
@ -332,6 +373,7 @@ type ServiceConfigEntry struct {
|
||||||
LocalConnectTimeoutMs int `json:",omitempty" alias:"local_connect_timeout_ms"`
|
LocalConnectTimeoutMs int `json:",omitempty" alias:"local_connect_timeout_ms"`
|
||||||
LocalRequestTimeoutMs int `json:",omitempty" alias:"local_request_timeout_ms"`
|
LocalRequestTimeoutMs int `json:",omitempty" alias:"local_request_timeout_ms"`
|
||||||
BalanceInboundConnections string `json:",omitempty" alias:"balance_inbound_connections"`
|
BalanceInboundConnections string `json:",omitempty" alias:"balance_inbound_connections"`
|
||||||
|
RateLimits *RateLimits `json:",omitempty" alias:"rate_limits"`
|
||||||
EnvoyExtensions []EnvoyExtension `json:",omitempty" alias:"envoy_extensions"`
|
EnvoyExtensions []EnvoyExtension `json:",omitempty" alias:"envoy_extensions"`
|
||||||
Meta map[string]string `json:",omitempty"`
|
Meta map[string]string `json:",omitempty"`
|
||||||
CreateIndex uint64
|
CreateIndex uint64
|
||||||
|
|
|
@ -938,6 +938,58 @@ func InlineCertificateFromStructs(t *structs.InlineCertificateConfigEntry, s *In
|
||||||
s.PrivateKey = t.PrivateKey
|
s.PrivateKey = t.PrivateKey
|
||||||
s.Meta = t.Meta
|
s.Meta = t.Meta
|
||||||
}
|
}
|
||||||
|
func InstanceLevelRateLimitsToStructs(s *InstanceLevelRateLimits, t *structs.InstanceLevelRateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.RequestsPerSecond = int(s.RequestsPerSecond)
|
||||||
|
t.RequestsMaxBurst = int(s.RequestsMaxBurst)
|
||||||
|
{
|
||||||
|
t.Routes = make([]structs.InstanceLevelRouteRateLimits, len(s.Routes))
|
||||||
|
for i := range s.Routes {
|
||||||
|
if s.Routes[i] != nil {
|
||||||
|
InstanceLevelRouteRateLimitsToStructs(s.Routes[i], &t.Routes[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func InstanceLevelRateLimitsFromStructs(t *structs.InstanceLevelRateLimits, s *InstanceLevelRateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.RequestsPerSecond = uint32(t.RequestsPerSecond)
|
||||||
|
s.RequestsMaxBurst = uint32(t.RequestsMaxBurst)
|
||||||
|
{
|
||||||
|
s.Routes = make([]*InstanceLevelRouteRateLimits, len(t.Routes))
|
||||||
|
for i := range t.Routes {
|
||||||
|
{
|
||||||
|
var x InstanceLevelRouteRateLimits
|
||||||
|
InstanceLevelRouteRateLimitsFromStructs(&t.Routes[i], &x)
|
||||||
|
s.Routes[i] = &x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func InstanceLevelRouteRateLimitsToStructs(s *InstanceLevelRouteRateLimits, t *structs.InstanceLevelRouteRateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.PathExact = s.PathExact
|
||||||
|
t.PathPrefix = s.PathPrefix
|
||||||
|
t.PathRegex = s.PathRegex
|
||||||
|
t.RequestsPerSecond = int(s.RequestsPerSecond)
|
||||||
|
t.RequestsMaxBurst = int(s.RequestsMaxBurst)
|
||||||
|
}
|
||||||
|
func InstanceLevelRouteRateLimitsFromStructs(t *structs.InstanceLevelRouteRateLimits, s *InstanceLevelRouteRateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.PathExact = t.PathExact
|
||||||
|
s.PathPrefix = t.PathPrefix
|
||||||
|
s.PathRegex = t.PathRegex
|
||||||
|
s.RequestsPerSecond = uint32(t.RequestsPerSecond)
|
||||||
|
s.RequestsMaxBurst = uint32(t.RequestsMaxBurst)
|
||||||
|
}
|
||||||
func IntentionHTTPHeaderPermissionToStructs(s *IntentionHTTPHeaderPermission, t *structs.IntentionHTTPHeaderPermission) {
|
func IntentionHTTPHeaderPermissionToStructs(s *IntentionHTTPHeaderPermission, t *structs.IntentionHTTPHeaderPermission) {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return
|
return
|
||||||
|
@ -1648,6 +1700,24 @@ func PeeringMeshConfigFromStructs(t *structs.PeeringMeshConfig, s *PeeringMeshCo
|
||||||
}
|
}
|
||||||
s.PeerThroughMeshGateways = t.PeerThroughMeshGateways
|
s.PeerThroughMeshGateways = t.PeerThroughMeshGateways
|
||||||
}
|
}
|
||||||
|
func RateLimitsToStructs(s *RateLimits, t *structs.RateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if s.InstanceLevel != nil {
|
||||||
|
InstanceLevelRateLimitsToStructs(s.InstanceLevel, &t.InstanceLevel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func RateLimitsFromStructs(t *structs.RateLimits, s *RateLimits) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var x InstanceLevelRateLimits
|
||||||
|
InstanceLevelRateLimitsFromStructs(&t.InstanceLevel, &x)
|
||||||
|
s.InstanceLevel = &x
|
||||||
|
}
|
||||||
|
}
|
||||||
func RemoteJWKSToStructs(s *RemoteJWKS, t *structs.RemoteJWKS) {
|
func RemoteJWKSToStructs(s *RemoteJWKS, t *structs.RemoteJWKS) {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return
|
return
|
||||||
|
@ -1833,6 +1903,11 @@ func ServiceDefaultsToStructs(s *ServiceDefaults, t *structs.ServiceConfigEntry)
|
||||||
t.LocalConnectTimeoutMs = int(s.LocalConnectTimeoutMs)
|
t.LocalConnectTimeoutMs = int(s.LocalConnectTimeoutMs)
|
||||||
t.LocalRequestTimeoutMs = int(s.LocalRequestTimeoutMs)
|
t.LocalRequestTimeoutMs = int(s.LocalRequestTimeoutMs)
|
||||||
t.BalanceInboundConnections = s.BalanceInboundConnections
|
t.BalanceInboundConnections = s.BalanceInboundConnections
|
||||||
|
if s.RateLimits != nil {
|
||||||
|
var x structs.RateLimits
|
||||||
|
RateLimitsToStructs(s.RateLimits, &x)
|
||||||
|
t.RateLimits = &x
|
||||||
|
}
|
||||||
t.EnvoyExtensions = EnvoyExtensionsToStructs(s.EnvoyExtensions)
|
t.EnvoyExtensions = EnvoyExtensionsToStructs(s.EnvoyExtensions)
|
||||||
t.Meta = s.Meta
|
t.Meta = s.Meta
|
||||||
}
|
}
|
||||||
|
@ -1873,6 +1948,11 @@ func ServiceDefaultsFromStructs(t *structs.ServiceConfigEntry, s *ServiceDefault
|
||||||
s.LocalConnectTimeoutMs = int32(t.LocalConnectTimeoutMs)
|
s.LocalConnectTimeoutMs = int32(t.LocalConnectTimeoutMs)
|
||||||
s.LocalRequestTimeoutMs = int32(t.LocalRequestTimeoutMs)
|
s.LocalRequestTimeoutMs = int32(t.LocalRequestTimeoutMs)
|
||||||
s.BalanceInboundConnections = t.BalanceInboundConnections
|
s.BalanceInboundConnections = t.BalanceInboundConnections
|
||||||
|
if t.RateLimits != nil {
|
||||||
|
var x RateLimits
|
||||||
|
RateLimitsFromStructs(t.RateLimits, &x)
|
||||||
|
s.RateLimits = &x
|
||||||
|
}
|
||||||
s.EnvoyExtensions = EnvoyExtensionsFromStructs(t.EnvoyExtensions)
|
s.EnvoyExtensions = EnvoyExtensionsFromStructs(t.EnvoyExtensions)
|
||||||
s.Meta = t.Meta
|
s.Meta = t.Meta
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,6 +457,36 @@ func (msg *DestinationConfig) UnmarshalBinary(b []byte) error {
|
||||||
return proto.Unmarshal(b, msg)
|
return proto.Unmarshal(b, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
|
func (msg *RateLimits) MarshalBinary() ([]byte, error) {
|
||||||
|
return proto.Marshal(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||||
|
func (msg *RateLimits) UnmarshalBinary(b []byte) error {
|
||||||
|
return proto.Unmarshal(b, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
|
func (msg *InstanceLevelRateLimits) MarshalBinary() ([]byte, error) {
|
||||||
|
return proto.Marshal(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||||
|
func (msg *InstanceLevelRateLimits) UnmarshalBinary(b []byte) error {
|
||||||
|
return proto.Unmarshal(b, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
|
func (msg *InstanceLevelRouteRateLimits) MarshalBinary() ([]byte, error) {
|
||||||
|
return proto.Marshal(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||||
|
func (msg *InstanceLevelRouteRateLimits) UnmarshalBinary(b []byte) error {
|
||||||
|
return proto.Unmarshal(b, msg)
|
||||||
|
}
|
||||||
|
|
||||||
// MarshalBinary implements encoding.BinaryMarshaler
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
func (msg *APIGateway) MarshalBinary() ([]byte, error) {
|
func (msg *APIGateway) MarshalBinary() ([]byte, error) {
|
||||||
return proto.Marshal(msg)
|
return proto.Marshal(msg)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -507,6 +507,7 @@ message ServiceDefaults {
|
||||||
// mog: func-to=int func-from=int32
|
// mog: func-to=int func-from=int32
|
||||||
int32 LocalRequestTimeoutMs = 11;
|
int32 LocalRequestTimeoutMs = 11;
|
||||||
string BalanceInboundConnections = 12;
|
string BalanceInboundConnections = 12;
|
||||||
|
RateLimits RateLimits = 16;
|
||||||
map<string, string> Meta = 13;
|
map<string, string> Meta = 13;
|
||||||
// mog: func-to=EnvoyExtensionsToStructs func-from=EnvoyExtensionsFromStructs
|
// mog: func-to=EnvoyExtensionsToStructs func-from=EnvoyExtensionsFromStructs
|
||||||
repeated hashicorp.consul.internal.common.EnvoyExtension EnvoyExtensions = 14;
|
repeated hashicorp.consul.internal.common.EnvoyExtension EnvoyExtensions = 14;
|
||||||
|
@ -652,6 +653,43 @@ message DestinationConfig {
|
||||||
int32 Port = 2;
|
int32 Port = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mog annotation:
|
||||||
|
//
|
||||||
|
// target=github.com/hashicorp/consul/agent/structs.RateLimits
|
||||||
|
// output=config_entry.gen.go
|
||||||
|
// name=Structs
|
||||||
|
message RateLimits {
|
||||||
|
InstanceLevelRateLimits InstanceLevel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mog annotation:
|
||||||
|
//
|
||||||
|
// target=github.com/hashicorp/consul/agent/structs.InstanceLevelRateLimits
|
||||||
|
// output=config_entry.gen.go
|
||||||
|
// name=Structs
|
||||||
|
message InstanceLevelRateLimits {
|
||||||
|
// mog: func-to=int func-from=uint32
|
||||||
|
uint32 RequestsPerSecond = 1;
|
||||||
|
// mog: func-to=int func-from=uint32
|
||||||
|
uint32 RequestsMaxBurst = 2;
|
||||||
|
repeated InstanceLevelRouteRateLimits Routes = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mog annotation:
|
||||||
|
//
|
||||||
|
// target=github.com/hashicorp/consul/agent/structs.InstanceLevelRouteRateLimits
|
||||||
|
// output=config_entry.gen.go
|
||||||
|
// name=Structs
|
||||||
|
message InstanceLevelRouteRateLimits {
|
||||||
|
string PathExact = 1;
|
||||||
|
string PathPrefix = 2;
|
||||||
|
string PathRegex = 3;
|
||||||
|
// mog: func-to=int func-from=uint32
|
||||||
|
uint32 RequestsPerSecond = 4;
|
||||||
|
// mog: func-to=int func-from=uint32
|
||||||
|
uint32 RequestsMaxBurst = 5;
|
||||||
|
}
|
||||||
|
|
||||||
// mog annotation:
|
// mog annotation:
|
||||||
//
|
//
|
||||||
// target=github.com/hashicorp/consul/agent/structs.APIGatewayConfigEntry
|
// target=github.com/hashicorp/consul/agent/structs.APIGatewayConfigEntry
|
||||||
|
|
Loading…
Reference in New Issue