consul/proto-public/pbmesh/v2beta1/destination_policy.proto
Nitya Dhanushkodi 92aab7ea31
[NET-5586][rebased] v2: Support virtual port references in config (#20371)
[OG Author: michael.zalimeni@hashicorp.com, rebase needed a separate PR]

* v2: support virtual port in Service port references

In addition to Service target port references, allow users to specify a
port by stringified virtual port value. This is useful in environments
such as Kubernetes where typical configuration is written in terms of
Service virtual ports rather than workload (pod) target port names.

Retaining the option of referencing target ports by name supports VMs,
Nomad, and other use cases where virtual ports are not used by default.

To support both uses cases at once, we will strictly interpret port
references based on whether the value is numeric. See updated
`ServicePort` docs for more details.

* v2: update service ref docs for virtual port support

Update proto and generated .go files with docs reflecting virtual port
reference support.

* v2: add virtual port references to L7 topo test

Add coverage for mixed virtual and target port references to existing
test.

* update failover policy controller tests to work with computed failover policy and assert error conditions against FailoverPolicy and ComputedFailoverPolicy resources

* accumulate services; don't overwrite them in enterprise

---------

Co-authored-by: Michael Zalimeni <michael.zalimeni@hashicorp.com>
Co-authored-by: R.B. Boyer <rb@hashicorp.com>
2024-01-29 10:43:41 -08:00

164 lines
6.3 KiB
Protocol Buffer

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
syntax = "proto3";
package hashicorp.consul.mesh.v2beta1;
import "google/protobuf/duration.proto";
import "pbresource/annotations.proto";
// DestinationPolicy is the destination-controlled set of defaults that
// are used when similar controls defined in an DestinationsConfiguration are
// left unspecified.
//
// Users may wish to share commonly configured settings for communicating with
// a service in one place, but yet retain the ability to tweak those on a
// client-by-client basis, which is why there are separate resources to control
// the definition of these values from either end of the connection.
//
// This is a Resource type.
message DestinationPolicy {
option (hashicorp.consul.resource.spec) = {scope: SCOPE_NAMESPACE};
// PortConfigs defines the destination policy for a specific port on a service.
//
// For more details on potential values of the service port identifier key,
// see documentation for Service.ServicePort.
map<string, DestinationConfig> port_configs = 1;
}
message DestinationConfig {
// ConnectTimeout is the timeout for establishing new network connections
// to this service.
// +kubebuilder:validation:Format=duration
google.protobuf.Duration connect_timeout = 1;
// RequestTimeout is the timeout for an HTTP request to complete before the
// connection is automatically terminated. If unspecified, defaults to 15
// seconds.
// +kubebuilder:validation:Format=duration
google.protobuf.Duration request_timeout = 2;
// LoadBalancer determines the load balancing policy and configuration for
// services issuing requests to this upstream service.
LoadBalancer load_balancer = 3;
// LocalityPrioritization controls whether the locality of services within the
// local partition will be used to prioritize connectivity.
LocalityPrioritization locality_prioritization = 4;
}
message LocalityPrioritization {
// Mode specifies the type of prioritization that will be performed
// when selecting nodes in the local partition.
// Valid values are: "" (default "none"), "none", and "failover".
LocalityPrioritizationMode mode = 1;
}
// +kubebuilder:validation:Enum=LOCALITY_PRIORITIZATION_MODE_UNSPECIFIED;LOCALITY_PRIORITIZATION_MODE_NONE;LOCALITY_PRIORITIZATION_MODE_FAILOVER
// +kubebuilder:validation:Type=string
enum LocalityPrioritizationMode {
LOCALITY_PRIORITIZATION_MODE_UNSPECIFIED = 0;
LOCALITY_PRIORITIZATION_MODE_NONE = 1;
LOCALITY_PRIORITIZATION_MODE_FAILOVER = 2;
}
// LoadBalancer determines the load balancing policy and configuration
// for services issuing requests to this upstream service.
//
message LoadBalancer {
// Policy is the load balancing policy used to select a host
LoadBalancerPolicy policy = 1;
// HashPolicies is a list of hash policies to use for hashing load balancing
// algorithms. Hash policies are evaluated individually and combined such
// that identical lists result in the same hash.
//
// If no hash policies are present, or none are successfully evaluated,
// then a random backend host will be selected.
repeated HashPolicy hash_policies = 2;
oneof config {
// RingHashConfig contains configuration for the "ring_hash" policy type
RingHashConfig ring_hash_config = 3;
// LeastRequestConfig contains configuration for the "least_request" policy type
LeastRequestConfig least_request_config = 4;
}
}
// +kubebuilder:validation:Enum=LOAD_BALANCER_POLICY_UNSPECIFIED;LOAD_BALANCER_POLICY_RANDOM;LOAD_BALANCER_POLICY_ROUND_ROBIN;LOAD_BALANCER_POLICY_LEAST_REQUEST;LOAD_BALANCER_POLICY_MAGLEV;LOAD_BALANCER_POLICY_RING_HASH
// +kubebuilder:validation:Type=string
enum LoadBalancerPolicy {
LOAD_BALANCER_POLICY_UNSPECIFIED = 0;
LOAD_BALANCER_POLICY_RANDOM = 1;
LOAD_BALANCER_POLICY_ROUND_ROBIN = 2;
LOAD_BALANCER_POLICY_LEAST_REQUEST = 3;
LOAD_BALANCER_POLICY_MAGLEV = 4;
LOAD_BALANCER_POLICY_RING_HASH = 5;
}
// RingHashConfig contains configuration for the "ring_hash" policy type
message RingHashConfig {
// MinimumRingSize determines the minimum number of entries in the hash ring
uint64 minimum_ring_size = 1;
// MaximumRingSize determines the maximum number of entries in the hash ring
uint64 maximum_ring_size = 2;
}
// LeastRequestConfig contains configuration for the "least_request" policy type
message LeastRequestConfig {
// ChoiceCount determines the number of random healthy hosts from which to select the one with the least requests.
uint32 choice_count = 1;
}
// HashPolicy defines which attributes will be hashed by hash-based LB algorithms
message HashPolicy {
// Field is the attribute type to hash on.
// Must be one of "header","cookie", or "query_parameter".
// Cannot be specified along with SourceIP.
HashPolicyField field = 1;
// FieldValue is the value to hash.
// ie. header name, cookie name, URL query parameter name
// Cannot be specified along with SourceIP.
string field_value = 2;
// CookieConfig contains configuration for the "cookie" hash policy type.
CookieConfig cookie_config = 3;
// SourceIP determines whether the hash should be of the source IP rather than of a field and field value.
// Cannot be specified along with Field or FieldValue.
bool source_ip = 4;
// Terminal will short circuit the computation of the hash when multiple hash policies are present.
// If a hash is computed when a Terminal policy is evaluated,
// then that hash will be used and subsequent hash policies will be ignored.
bool terminal = 5;
}
// +kubebuilder:validation:Enum=HASH_POLICY_FIELD_UNSPECIFIED;HASH_POLICY_FIELD_HEADER;HASH_POLICY_FIELD_COOKIE;HASH_POLICY_FIELD_QUERY_PARAMETER
// +kubebuilder:validation:Type=string
enum HashPolicyField {
HASH_POLICY_FIELD_UNSPECIFIED = 0;
HASH_POLICY_FIELD_HEADER = 1;
HASH_POLICY_FIELD_COOKIE = 2;
HASH_POLICY_FIELD_QUERY_PARAMETER = 3;
}
// CookieConfig contains configuration for the "cookie" hash policy type.
// This is specified to have Envoy generate a cookie for a client on its first request.
message CookieConfig {
// Generates a session cookie with no expiration.
bool session = 1;
// TTL for generated cookies. Cannot be specified for session cookies.
// +kubebuilder:validation:Format=duration
google.protobuf.Duration ttl = 2;
// The path to set for the cookie
string path = 3;
}