Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/v1alpha1/backendtrafficpolicy_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ type BackendTrafficPolicy struct {
// +kubebuilder:validation:XValidation:rule="!has(self.admissionControl) || ((!has(self.targetRef) || self.targetRef.kind in ['Gateway', 'ListenerSet', 'HTTPRoute', 'GRPCRoute']) && (!has(self.targetRefs) || self.targetRefs.all(ref, ref.kind in ['Gateway', 'ListenerSet', 'HTTPRoute', 'GRPCRoute'])) && (!has(self.targetSelectors) || self.targetSelectors.all(sel, sel.kind in ['Gateway', 'ListenerSet', 'HTTPRoute', 'GRPCRoute'])))", message="admissionControl can only be used with HTTPRoute, GRPCRoute, Gateway, or ListenerSet targets"
type BackendTrafficPolicySpec struct {
PolicyTargetReferences `json:",inline"`
ClusterSettings `json:",inline"`
BackendSettings `json:",inline"`

// MergeType determines how this configuration is merged with existing BackendTrafficPolicy
// configurations targeting a parent resource. When set, this configuration will be merged
Expand Down
23 changes: 14 additions & 9 deletions api/v1alpha1/shared_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -639,24 +639,17 @@ type BackendCluster struct {
// to the backend.
//
// +optional
BackendSettings *ClusterSettings `json:"backendSettings,omitempty"`
BackendSettings *BackendSettings `json:"backendSettings,omitempty"`
}

// ClusterSettings provides the various knobs that can be set to control how traffic to a given
// backend will be configured.
//
// ClusterSettings contains CDS-only fields that configure the upstream Envoy Cluster.
// +kubebuilder:validation:XValidation:rule="!((has(self.connection) && has(self.connection.preconnect) && has(self.connection.preconnect.predictivePercent)) && !(has(self.loadBalancer) && has(self.loadBalancer.type) && self.loadBalancer.type in ['Random', 'RoundRobin']))",message="predictivePercent in preconnect policy only works with RoundRobin or Random load balancers"
type ClusterSettings struct {
// LoadBalancer policy to apply when routing traffic from the gateway to
// the backend endpoints. Defaults to `LeastRequest`.
// +optional
LoadBalancer *LoadBalancer `json:"loadBalancer,omitempty"`

// Retry provides more advanced usage, allowing users to customize the number of retries, retry fallback strategy, and retry triggering conditions.
// If not set, retry will be disabled.
// +optional
Retry *Retry `json:"retry,omitempty"`

// ProxyProtocol enables the Proxy Protocol when communicating with the backend.
// +optional
ProxyProtocol *ProxyProtocol `json:"proxyProtocol,omitempty"`
Expand Down Expand Up @@ -699,6 +692,18 @@ type ClusterSettings struct {
HTTP2 *HTTP2Settings `json:"http2,omitempty"`
}

// BackendSettings provides the various knobs that can be set to control how traffic to a given
// backend will be configured. It embeds ClusterSettings (CDS-only fields) and adds
// route-level fields like Retry.
type BackendSettings struct {
ClusterSettings `json:",inline"`

// Retry provides more advanced usage, allowing users to customize the number of retries, retry fallback strategy, and retry triggering conditions.
// If not set, retry will be disabled.
// +optional
Retry *Retry `json:"retry,omitempty"`
}

// CIDR defines a CIDR Address range.
// A CIDR can be an IPv4 address range such as "192.168.1.0/24" or an IPv6 address range such as "2001:0db8:11a3:09d7::/64".
// +kubebuilder:validation:Pattern=`((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/([0-9]+))|((([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/([0-9]+))`
Expand Down
30 changes: 23 additions & 7 deletions api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ import (
"github.com/envoyproxy/gateway/internal/xds/utils/fractionalpercent"
)

func translateTrafficFeatures(policy *egv1a1.ClusterSettings) (*ir.TrafficFeatures, error) {
func translateTrafficFeatures(policy *egv1a1.BackendSettings) (*ir.TrafficFeatures, error) {
if policy == nil {
return nil, nil
}
ret := &ir.TrafficFeatures{}

if timeout, err := buildClusterSettingsTimeout(policy); err != nil {
if timeout, err := buildBackendSettingsTimeout(policy); err != nil {
return nil, err
} else {
ret.Timeout = timeout
Expand Down Expand Up @@ -89,7 +89,7 @@ func translateTrafficFeatures(policy *egv1a1.ClusterSettings) (*ir.TrafficFeatur
return ret, nil
}

func buildClusterSettingsTimeout(policy *egv1a1.ClusterSettings) (*ir.Timeout, error) {
func buildBackendSettingsTimeout(policy *egv1a1.BackendSettings) (*ir.Timeout, error) {
if policy.Timeout == nil {
return nil, nil
}
Expand Down Expand Up @@ -174,7 +174,7 @@ func buildClusterSettingsTimeout(policy *egv1a1.ClusterSettings) (*ir.Timeout, e
return to, errs
}

func buildBackendConnection(policy *egv1a1.ClusterSettings) (*ir.BackendConnection, error) {
func buildBackendConnection(policy *egv1a1.BackendSettings) (*ir.BackendConnection, error) {
if policy.Connection == nil {
return nil, nil
}
Expand Down Expand Up @@ -213,7 +213,7 @@ func buildBackendConnection(policy *egv1a1.ClusterSettings) (*ir.BackendConnecti
return bcIR, nil
}

func buildTCPKeepAlive(policy *egv1a1.ClusterSettings) (*ir.TCPKeepalive, error) {
func buildTCPKeepAlive(policy *egv1a1.BackendSettings) (*ir.TCPKeepalive, error) {
if policy.TCPKeepalive == nil {
return nil, nil
}
Expand Down Expand Up @@ -243,7 +243,7 @@ func buildTCPKeepAlive(policy *egv1a1.ClusterSettings) (*ir.TCPKeepalive, error)
return ka, nil
}

func buildCircuitBreaker(policy *egv1a1.ClusterSettings) (*ir.CircuitBreaker, error) {
func buildCircuitBreaker(policy *egv1a1.BackendSettings) (*ir.CircuitBreaker, error) {
if policy.CircuitBreaker == nil {
return nil, nil
}
Expand Down Expand Up @@ -312,7 +312,7 @@ func buildCircuitBreaker(policy *egv1a1.ClusterSettings) (*ir.CircuitBreaker, er
return cb, nil
}

func buildLoadBalancer(policy *egv1a1.ClusterSettings) (*ir.LoadBalancer, error) {
func buildLoadBalancer(policy *egv1a1.BackendSettings) (*ir.LoadBalancer, error) {
if policy.LoadBalancer == nil {
return nil, nil
}
Expand Down Expand Up @@ -512,7 +512,7 @@ func buildEndpointOverride(policy egv1a1.EndpointOverride) *ir.EndpointOverride
return endpointOverride
}

func buildProxyProtocol(policy *egv1a1.ClusterSettings) *ir.ProxyProtocol {
func buildProxyProtocol(policy *egv1a1.BackendSettings) *ir.ProxyProtocol {
if policy.ProxyProtocol == nil {
return nil
}
Expand All @@ -531,7 +531,7 @@ func buildProxyProtocol(policy *egv1a1.ClusterSettings) *ir.ProxyProtocol {
return pp
}

func buildHealthCheck(policy *egv1a1.ClusterSettings) *ir.HealthCheck {
func buildHealthCheck(policy *egv1a1.BackendSettings) *ir.HealthCheck {
if policy.HealthCheck == nil {
return nil
}
Expand Down Expand Up @@ -712,7 +712,7 @@ func translateActiveHealthCheckPayload(p *egv1a1.ActiveHealthCheckPayload) *ir.H
return irPayload
}

func translateDNS(policy *egv1a1.ClusterSettings, policyName string) *ir.DNS {
func translateDNS(policy *egv1a1.BackendSettings, policyName string) *ir.DNS {
if policy.DNS == nil {
return nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@ func TestBuildLoadBalancer_BackendUtilization(t *testing.T) {
MetricNamesForComputingUtilization: []string{"named_metrics.foo", "cpu_utilization"},
}

policy := &egv1a1.ClusterSettings{
LoadBalancer: &egv1a1.LoadBalancer{
Type: egv1a1.BackendUtilizationLoadBalancerType,
BackendUtilization: backendUtilization,
policy := &egv1a1.BackendSettings{
ClusterSettings: egv1a1.ClusterSettings{
LoadBalancer: &egv1a1.LoadBalancer{
Type: egv1a1.BackendUtilizationLoadBalancerType,
BackendUtilization: backendUtilization,
},
},
}

Expand Down
20 changes: 10 additions & 10 deletions internal/gatewayapi/backendtrafficpolicy.go
Original file line number Diff line number Diff line change
Expand Up @@ -1432,7 +1432,7 @@ func (t *Translator) applyTrafficFeatureToRoute(route RouteContext,
}
}

if localTo, err := buildClusterSettingsTimeout(&policy.Spec.ClusterSettings); err == nil {
if localTo, err := buildBackendSettingsTimeout(&policy.Spec.BackendSettings); err == nil {
r.Traffic.Timeout = localTo
}

Expand Down Expand Up @@ -1505,13 +1505,13 @@ func (t *Translator) buildTrafficFeatures(policy *egv1a1.BackendTrafficPolicy, o
errs = errors.Join(errs, err)
}
}
if lb, err = buildLoadBalancer(&policy.Spec.ClusterSettings); err != nil {
if lb, err = buildLoadBalancer(&policy.Spec.BackendSettings); err != nil {
err = perr.WithMessage(err, "LoadBalancer")
errs = errors.Join(errs, err)
}
pp = buildProxyProtocol(&policy.Spec.ClusterSettings)
hc = buildHealthCheck(&policy.Spec.ClusterSettings)
if cb, err = buildCircuitBreaker(&policy.Spec.ClusterSettings); err != nil {
pp = buildProxyProtocol(&policy.Spec.BackendSettings)
hc = buildHealthCheck(&policy.Spec.BackendSettings)
if cb, err = buildCircuitBreaker(&policy.Spec.BackendSettings); err != nil {
err = perr.WithMessage(err, "CircuitBreaker")
errs = errors.Join(errs, err)
}
Expand All @@ -1521,7 +1521,7 @@ func (t *Translator) buildTrafficFeatures(policy *egv1a1.BackendTrafficPolicy, o
if policy.Spec.AdmissionControl != nil {
ac = t.buildAdmissionControl(policy)
}
if ka, err = buildTCPKeepAlive(&policy.Spec.ClusterSettings); err != nil {
if ka, err = buildTCPKeepAlive(&policy.Spec.BackendSettings); err != nil {
err = perr.WithMessage(err, "TCPKeepalive")
errs = errors.Join(errs, err)
}
Expand All @@ -1531,12 +1531,12 @@ func (t *Translator) buildTrafficFeatures(policy *egv1a1.BackendTrafficPolicy, o
errs = errors.Join(errs, err)
}

if to, err = buildClusterSettingsTimeout(&policy.Spec.ClusterSettings); err != nil {
if to, err = buildBackendSettingsTimeout(&policy.Spec.BackendSettings); err != nil {
err = perr.WithMessage(err, "Timeout")
errs = errors.Join(errs, err)
}

if bc, err = buildBackendConnection(&policy.Spec.ClusterSettings); err != nil {
if bc, err = buildBackendConnection(&policy.Spec.BackendSettings); err != nil {
err = perr.WithMessage(err, "BackendConnection")
errs = errors.Join(errs, err)
}
Expand Down Expand Up @@ -1569,7 +1569,7 @@ func (t *Translator) buildTrafficFeatures(policy *egv1a1.BackendTrafficPolicy, o
errs = errors.Join(errs, err)
}

ds = translateDNS(&policy.Spec.ClusterSettings, utils.NamespacedName(policy).String())
ds = translateDNS(&policy.Spec.BackendSettings, utils.NamespacedName(policy).String())

return &ir.TrafficFeatures{
RateLimit: rl,
Expand Down Expand Up @@ -1748,7 +1748,7 @@ func (t *Translator) translateBackendTrafficPolicyForListeners(
}

r.Traffic = tf.DeepCopy()
if localTo, err := buildClusterSettingsTimeout(&policy.Spec.ClusterSettings); err == nil {
if localTo, err := buildBackendSettingsTimeout(&policy.Spec.BackendSettings); err == nil {
r.Traffic.Timeout = localTo
}

Expand Down
Loading
Loading