// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package extensioncommon import "github.com/hashicorp/consul/api" // UpstreamData has the SNI, EnvoyID, and OutgoingProxyKind of the upstream services for the local proxy and this data // is used to choose which Envoy resources to patch. type UpstreamData struct { // SNI is the SNI header used to reach an upstream service. SNI map[string]struct{} // EnvoyID is the envoy ID of an upstream service, structured or // when using a // non-default namespace or partition. EnvoyID string // OutgoingProxyKind is the type of proxy of the upstream service. However, if the upstream is "typical" this will // be set to "connect-proxy" instead. OutgoingProxyKind api.ServiceKind // VIP is the tproxy virtual IP used to reach an upstream service. VIP string } // RuntimeConfig is the configuration for an extension attached to a service on the local proxy. // It should depend on the API client rather than the structs package because the API client is // meant to be public. type RuntimeConfig struct { // EnvoyExtension is the extension that will patch Envoy resources. EnvoyExtension api.EnvoyExtension // ServiceName is the name of the service the EnvoyExtension is being applied to. It could be the local service or // an upstream of the local service. ServiceName api.CompoundServiceName // Upstreams will only be configured if the EnvoyExtension is being applied to an upstream. // If there are no Upstreams, then EnvoyExtension is being applied to the local service's resources. Upstreams map[api.CompoundServiceName]*UpstreamData // LocalUpstreams will only be configured if the EnvoyExtension is being applied to the local service. LocalUpstreams map[api.CompoundServiceName]*UpstreamData // Kind is mode the local Envoy proxy is running in. For now, only connect proxy and // terminating gateways are supported. Kind api.ServiceKind // Protocol is the protocol configured for the local service. It may be empty which implies tcp. Protocol string } // IsLocal indicates if the extension configuration is for the proxy's local service. func (ec RuntimeConfig) IsLocal() bool { return !ec.IsUpstream() } // IsUpstream indicates if the extension configuration is for an upstream service. func (ec RuntimeConfig) IsUpstream() bool { _, ok := ec.Upstreams[ec.ServiceName] return ok } // MatchesUpstreamServiceSNI indicates if the extension configuration is for an upstream service // that matches the given SNI. func (ec RuntimeConfig) MatchesUpstreamServiceSNI(sni string) bool { u := ec.Upstreams[ec.ServiceName] _, match := u.SNI[sni] return match } // EnvoyID returns the unique Envoy identifier of the upstream service. func (ec RuntimeConfig) EnvoyID() string { u := ec.Upstreams[ec.ServiceName] return u.EnvoyID } // OutgoingProxyKind returns the service kind for the outgoing listener of an upstream service. func (ec RuntimeConfig) OutgoingProxyKind() api.ServiceKind { u := ec.Upstreams[ec.ServiceName] return u.OutgoingProxyKind }