2023-03-28 22:48:58 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2023-01-30 21:35:26 +00:00
|
|
|
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 <service> or <partition>/<ns>/<service> 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
|
|
|
|
}
|
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// 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.
|
2023-01-30 21:35:26 +00:00
|
|
|
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.
|
2023-02-06 17:14:35 +00:00
|
|
|
Upstreams map[api.CompoundServiceName]*UpstreamData
|
2023-01-30 21:35:26 +00:00
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// LocalUpstreams will only be configured if the EnvoyExtension is being applied to the local service.
|
|
|
|
LocalUpstreams map[api.CompoundServiceName]*UpstreamData
|
|
|
|
|
2023-01-30 21:35:26 +00:00
|
|
|
// Kind is mode the local Envoy proxy is running in. For now, only connect proxy and
|
|
|
|
// terminating gateways are supported.
|
|
|
|
Kind api.ServiceKind
|
|
|
|
}
|
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// 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.
|
2023-01-30 21:35:26 +00:00
|
|
|
func (ec RuntimeConfig) IsUpstream() bool {
|
|
|
|
_, ok := ec.Upstreams[ec.ServiceName]
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// MatchesUpstreamServiceSNI indicates if the extension configuration is for an upstream service
|
|
|
|
// that matches the given SNI.
|
2023-01-30 21:35:26 +00:00
|
|
|
func (ec RuntimeConfig) MatchesUpstreamServiceSNI(sni string) bool {
|
|
|
|
u := ec.Upstreams[ec.ServiceName]
|
|
|
|
_, match := u.SNI[sni]
|
|
|
|
return match
|
|
|
|
}
|
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// EnvoyID returns the unique Envoy identifier of the upstream service.
|
2023-01-30 21:35:26 +00:00
|
|
|
func (ec RuntimeConfig) EnvoyID() string {
|
|
|
|
u := ec.Upstreams[ec.ServiceName]
|
|
|
|
return u.EnvoyID
|
|
|
|
}
|
|
|
|
|
2023-04-06 21:12:07 +00:00
|
|
|
// OutgoingProxyKind returns the service kind for the outgoing listener of an upstream service.
|
2023-01-30 21:35:26 +00:00
|
|
|
func (ec RuntimeConfig) OutgoingProxyKind() api.ServiceKind {
|
|
|
|
u := ec.Upstreams[ec.ServiceName]
|
|
|
|
return u.OutgoingProxyKind
|
|
|
|
}
|