mirror of
https://github.com/status-im/consul.git
synced 2025-02-07 11:24:21 +00:00
92aab7ea31
[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>
179 lines
6.0 KiB
Protocol Buffer
179 lines
6.0 KiB
Protocol Buffer
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
syntax = "proto3";
|
|
|
|
package hashicorp.consul.mesh.v2beta1;
|
|
|
|
import "pbcatalog/v2beta1/failover_policy.proto";
|
|
import "pbcatalog/v2beta1/protocol.proto";
|
|
import "pbcatalog/v2beta1/service_endpoints.proto";
|
|
import "pbmesh/v2beta1/common.proto";
|
|
import "pbmesh/v2beta1/destination_policy.proto";
|
|
import "pbmesh/v2beta1/grpc_route.proto";
|
|
import "pbmesh/v2beta1/http_route.proto";
|
|
import "pbmesh/v2beta1/http_route_retries.proto";
|
|
import "pbmesh/v2beta1/http_route_timeouts.proto";
|
|
import "pbresource/annotations.proto";
|
|
import "pbresource/resource.proto";
|
|
|
|
// This is a Resource type.
|
|
message ComputedRoutes {
|
|
option (hashicorp.consul.resource.spec) = {scope: SCOPE_NAMESPACE};
|
|
|
|
// PortedConfigs is the map of service ports to the ComputedPortRoutes for
|
|
// those ports.
|
|
//
|
|
// The port identifier key here is always normalized to the target (workload)
|
|
// port name regardless of whether a virtual or target port identifier was
|
|
// provided in input config.
|
|
map<string, ComputedPortRoutes> ported_configs = 1;
|
|
|
|
// BoundReferences is a slice of mixed type references of resources that were
|
|
// involved in the formulation of this resource.
|
|
repeated hashicorp.consul.resource.Reference bound_references = 2;
|
|
}
|
|
|
|
message ComputedPortRoutes {
|
|
oneof config {
|
|
ComputedHTTPRoute http = 1;
|
|
ComputedGRPCRoute grpc = 2;
|
|
ComputedTCPRoute tcp = 3;
|
|
}
|
|
bool using_default_config = 4; // TODO
|
|
|
|
ParentReference parent_ref = 5;
|
|
// Protocol is the ParentRef.Port's protocol. It is based on the value in the
|
|
// Service object, but may differ depending upon which xRoutes are actually
|
|
// in use.
|
|
hashicorp.consul.catalog.v2beta1.Protocol protocol = 6;
|
|
|
|
// map key is an opaque string; like disco chain target name
|
|
map<string, BackendTargetDetails> targets = 7;
|
|
}
|
|
|
|
message ComputedHTTPRoute {
|
|
reserved 1; // hostnames
|
|
repeated ComputedHTTPRouteRule rules = 2;
|
|
}
|
|
|
|
message ComputedHTTPRouteRule {
|
|
repeated HTTPRouteMatch matches = 1;
|
|
repeated HTTPRouteFilter filters = 2;
|
|
repeated ComputedHTTPBackendRef backend_refs = 3;
|
|
HTTPRouteTimeouts timeouts = 4;
|
|
HTTPRouteRetries retries = 5;
|
|
}
|
|
|
|
message ComputedHTTPBackendRef {
|
|
// BackendTarget indicates which key in the targets map provides
|
|
// the rest of the configuration.
|
|
//
|
|
// If this field is set to the empty string, or is the sentinel value
|
|
// "NULL-ROUTE" is an indication that all of the traffic destined for this
|
|
// backend reference should be null routed in a format appropriate for the
|
|
// protocol (i.e. for HTTP use 5xx).
|
|
string backend_target = 1;
|
|
uint32 weight = 2;
|
|
repeated HTTPRouteFilter filters = 3;
|
|
}
|
|
|
|
message ComputedGRPCRoute {
|
|
reserved 1; // hostnames
|
|
repeated ComputedGRPCRouteRule rules = 2;
|
|
}
|
|
|
|
message ComputedGRPCRouteRule {
|
|
repeated GRPCRouteMatch matches = 1;
|
|
repeated GRPCRouteFilter filters = 2;
|
|
repeated ComputedGRPCBackendRef backend_refs = 3;
|
|
HTTPRouteTimeouts timeouts = 4;
|
|
HTTPRouteRetries retries = 5;
|
|
}
|
|
|
|
message ComputedGRPCBackendRef {
|
|
// BackendTarget indicates which key in the targets map provides
|
|
// the rest of the configuration.
|
|
//
|
|
// If this field is set to the empty string, or is the sentinel value
|
|
// "NULL-ROUTE" is an indication that all of the traffic destined for this
|
|
// backend reference should be null routed in a format appropriate for the
|
|
// protocol (i.e. for HTTP use 5xx).
|
|
string backend_target = 1;
|
|
uint32 weight = 2;
|
|
repeated GRPCRouteFilter filters = 3;
|
|
}
|
|
|
|
message ComputedTCPRoute {
|
|
repeated ComputedTCPRouteRule rules = 1;
|
|
}
|
|
|
|
message ComputedTCPRouteRule {
|
|
repeated ComputedTCPBackendRef backend_refs = 1;
|
|
}
|
|
|
|
// TODO: look into smuggling the target through a different typeURL, or just skip in favor of letting the caller do their own lookups?
|
|
message ComputedTCPBackendRef {
|
|
// BackendTarget indicates which key in the targets map provides
|
|
// the rest of the configuration.
|
|
//
|
|
// If this field is set to the empty string, or is the sentinel value
|
|
// "NULL-ROUTE" is an indication that all of the traffic destined for this
|
|
// backend reference should be null routed in a format appropriate for the
|
|
// protocol (i.e. for HTTP use 5xx).
|
|
string backend_target = 1;
|
|
uint32 weight = 2;
|
|
}
|
|
|
|
message BackendTargetDetails {
|
|
BackendTargetDetailsType type = 1;
|
|
BackendReference backend_ref = 2;
|
|
|
|
string mesh_port = 3;
|
|
ComputedFailoverConfig failover_config = 4;
|
|
DestinationConfig destination_config = 5;
|
|
|
|
reserved 6 to 20; // leaving a gap between computed and retroactively added fields.
|
|
|
|
// ServiceEndpointsID is not populated naturally and the field exists only for
|
|
// downstream consumers.
|
|
hashicorp.consul.resource.ID service_endpoints_id = 21;
|
|
|
|
// ServiceEndpoints is not populated naturally and the field exists only for
|
|
// downstream consumers.
|
|
hashicorp.consul.catalog.v2beta1.ServiceEndpoints service_endpoints = 22;
|
|
|
|
// IdentityRefs are not populated naturally and the field exists only for
|
|
// downstream consumers.
|
|
repeated hashicorp.consul.resource.Reference identity_refs = 23;
|
|
}
|
|
|
|
// +kubebuilder:validation:Enum=BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED;BACKEND_TARGET_DETAILS_TYPE_DIRECT;BACKEND_TARGET_DETAILS_TYPE_INDIRECT
|
|
// +kubebuilder:validation:Type=string
|
|
enum BackendTargetDetailsType {
|
|
BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED = 0;
|
|
|
|
// Direct means that the target is directly routable from a route. This does
|
|
// not mean that the target is not also indirect though.
|
|
BACKEND_TARGET_DETAILS_TYPE_DIRECT = 1;
|
|
|
|
// Indirect means that the target is not directly routable from a route.
|
|
//
|
|
// One example would be for a FailoverPolicy destination.
|
|
BACKEND_TARGET_DETAILS_TYPE_INDIRECT = 2;
|
|
}
|
|
|
|
message ComputedFailoverConfig {
|
|
repeated ComputedFailoverDestination destinations = 1;
|
|
hashicorp.consul.catalog.v2beta1.FailoverMode mode = 2;
|
|
repeated string regions = 3;
|
|
|
|
// SamenessGroup specifies the sameness group to failover to.
|
|
string sameness_group = 4;
|
|
}
|
|
|
|
message ComputedFailoverDestination {
|
|
// BackendTarget must be a Service.
|
|
string backend_target = 1;
|
|
}
|