// 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 "pbmesh/v2beta1/pbproxystate/references.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 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 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. // ServiceEndpointsRef is not populated naturally and the field exists only for downstream consumers. pbproxystate.EndpointRef service_endpoints_ref = 24; // 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; }