Documentation ¶
Overview ¶
Package cache defines a configuration cache for the server.
Index ¶
- func GetResourceName(res types.Resource) string
- func GetResourceReferences(resources map[string]types.Resource) map[string]bool
- func GetResponseType(typeURL string) types.ResponseType
- func IndexResourcesByName(items []types.Resource) map[string]types.Resource
- func MarshalResource(resource types.Resource) (types.MarshaledResource, error)
- type Cache
- type ConfigFetcher
- type ConfigWatcher
- type IDHash
- type LinearCache
- func (cache *LinearCache) CreateWatch(request *Request, value chan<- Response) func()
- func (cache *LinearCache) DeleteResource(name string) error
- func (cache *LinearCache) Fetch(ctx context.Context, request *Request) (Response, error)
- func (cache *LinearCache) NumWatches(name string) int
- func (cache *LinearCache) UpdateResource(name string, res types.Resource) error
- type LinearCacheOption
- type MuxCache
- type NodeHash
- type PassthroughResponse
- type RawResponse
- type Request
- type Resources
- type Response
- type ResponseWatch
- type Snapshot
- type SnapshotCache
- type StatusInfo
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func GetResourceName ¶
GetResourceName returns the resource name for a valid xDS response type.
func GetResourceReferences ¶
GetResourceReferences returns the names for dependent resources (EDS cluster names for CDS, RDS routes names for LDS).
func GetResponseType ¶
func GetResponseType(typeURL string) types.ResponseType
GetResponseType returns the enumeration for a valid xDS type URL
func IndexResourcesByName ¶
IndexResourcesByName creates a map from the resource name to the resource.
func MarshalResource ¶
func MarshalResource(resource types.Resource) (types.MarshaledResource, error)
MarshalResource converts the Resource to MarshaledResource
Types ¶
type Cache ¶
type Cache interface { ConfigWatcher ConfigFetcher }
Cache is a generic config cache with a watcher.
type ConfigFetcher ¶
type ConfigFetcher interface { // Fetch implements the polling method of the config cache using a non-empty request. Fetch(context.Context, *Request) (Response, error) }
ConfigFetcher fetches configuration resources from cache
type ConfigWatcher ¶
type ConfigWatcher interface { // CreateWatch returns a new open watch from a non-empty request. // An individual consumer normally issues a single open watch by each type URL. // // Once the requested resources are available, they should be pushed into responses channel. // If there are any failures - nil should be written into the responses channel and the consumer should close the // corresponding stream. // Cache implementation should not close responses channel. // // Cancel is an optional function to release resources in the producer. If // provided, the consumer may call this function multiple times. CreateWatch(request *Request, responses chan<- Response) (cancel func()) }
ConfigWatcher requests watches for configuration resources by a node, last applied version identifier, and resource names hint. The watch should send the responses when they are ready. The watch can be cancelled by the consumer, in effect terminating the watch for the request. ConfigWatcher implementation must be thread-safe.
type LinearCache ¶
type LinearCache struct {
// contains filtered or unexported fields
}
LinearCache supports collectons of opaque resources. This cache has a single collection indexed by resource names and manages resource versions internally. It implements the cache interface for a single type URL and should be combined with other caches via type URL muxing. It can be used to supply EDS entries, for example, uniformly across a fleet of proxies.
func NewLinearCache ¶
func NewLinearCache(typeURL string, opts ...LinearCacheOption) *LinearCache
NewLinearCache creates a new cache. See the comments on the struct definition.
func (*LinearCache) CreateWatch ¶
func (cache *LinearCache) CreateWatch(request *Request, value chan<- Response) func()
func (*LinearCache) DeleteResource ¶
func (cache *LinearCache) DeleteResource(name string) error
DeleteResource removes a resource in the collection.
func (*LinearCache) NumWatches ¶
func (cache *LinearCache) NumWatches(name string) int
Number of active watches for a resource name.
func (*LinearCache) UpdateResource ¶
func (cache *LinearCache) UpdateResource(name string, res types.Resource) error
UpdateResource updates a resource in the collection.
type LinearCacheOption ¶
type LinearCacheOption func(*LinearCache)
Options for modifying the behavior of the linear cache.
func WithInitialResources ¶
func WithInitialResources(resources map[string]types.Resource) LinearCacheOption
WithInitialResources initializes the initial set of resources.
func WithVersionPrefix ¶
func WithVersionPrefix(prefix string) LinearCacheOption
WithVersionPrefix sets a version prefix of the form "prefixN" in the version info. Version prefix can be used to distinguish replicated instances of the cache, in case a client re-connects to another instance.
type MuxCache ¶
type MuxCache struct { // Classification functions. Classify func(Request) string // Muxed caches. Caches map[string]Cache }
MuxCache multiplexes across several caches using a classification function. If there is no matching cache for a classification result, the cache responds with an empty closed channel, which effectively terminates the stream on the server. It might be preferred to respond with a "nil" channel instead which will leave the stream open in case the stream is aggregated by making sure there is always a matching cache.
func (*MuxCache) CreateWatch ¶
type NodeHash ¶
type NodeHash interface { // ID function defines a unique string identifier for the remote Envoy node. ID(node *core.Node) string }
NodeHash computes string identifiers for Envoy nodes.
type PassthroughResponse ¶
type PassthroughResponse struct { // Request is the original request. Request *discovery.DiscoveryRequest // The discovery response that needs to be sent as is, without any marshalling transformations. DiscoveryResponse *discovery.DiscoveryResponse }
PassthroughResponse is a pre constructed xDS response that need not go through marshalling transformations.
func (*PassthroughResponse) GetDiscoveryResponse ¶
func (r *PassthroughResponse) GetDiscoveryResponse() (*discovery.DiscoveryResponse, error)
GetDiscoveryResponse returns the final passthrough Discovery Response.
func (*PassthroughResponse) GetRequest ¶
func (r *PassthroughResponse) GetRequest() *discovery.DiscoveryRequest
GetRequest returns the original Discovery Request
func (*PassthroughResponse) GetVersion ¶
func (r *PassthroughResponse) GetVersion() (string, error)
GetVersion returns the response version.
type RawResponse ¶
type RawResponse struct { // Request is the original request. Request *discovery.DiscoveryRequest // Version of the resources as tracked by the cache for the given type. // Proxy responds with this version as an acknowledgement. Version string // Resources to be included in the response. Resources []types.Resource // contains filtered or unexported fields }
RawResponse is a pre-serialized xDS response containing the raw resources to be included in the final Discovery Response.
func (*RawResponse) GetDiscoveryResponse ¶
func (r *RawResponse) GetDiscoveryResponse() (*discovery.DiscoveryResponse, error)
GetDiscoveryResponse performs the marshalling the first time its called and uses the cached response subsequently. This is necessary because the marshalled response does not change across the calls. This caching behavior is important in high throughput scenarios because grpc marshalling has a cost and it drives the cpu utilization under load.
func (*RawResponse) GetRequest ¶
func (r *RawResponse) GetRequest() *discovery.DiscoveryRequest
GetRequest returns the original Discovery Request.
func (*RawResponse) GetVersion ¶
func (r *RawResponse) GetVersion() (string, error)
GetVersion returns the response version.
type Request ¶
type Request = discovery.DiscoveryRequest
Request is an alias for the discovery request type.
type Resources ¶
type Resources struct { // Version information. Version string // Items in the group indexed by name. Items map[string]types.Resource }
Resources is a versioned group of resources.
type Response ¶
type Response interface { // Get the Constructed DiscoveryResponse GetDiscoveryResponse() (*discovery.DiscoveryResponse, error) // Get the original Request for the Response. GetRequest() *discovery.DiscoveryRequest // Get the version in the Response. GetVersion() (string, error) }
Response is a wrapper around Envoy's DiscoveryResponse.
type ResponseWatch ¶
type ResponseWatch struct { // Request is the original request for the watch. Request *Request // Response is the channel to push responses to. Response chan<- Response }
ResponseWatch is a watch record keeping both the request and an open channel for the response.
type Snapshot ¶
type Snapshot struct {
Resources [types.UnknownType]Resources
}
Snapshot is an internally consistent snapshot of xDS resources. Consistency is important for the convergence as different resource types from the snapshot may be delivered to the proxy in arbitrary order.
func NewSnapshot ¶
func NewSnapshot(version string, endpoints []types.Resource, clusters []types.Resource, routes []types.Resource, listeners []types.Resource, runtimes []types.Resource, secrets []types.Resource) Snapshot
NewSnapshot creates a snapshot from response types and a version.
func (*Snapshot) Consistent ¶
Consistent check verifies that the dependent resources are exactly listed in the snapshot: - all EDS resources are listed by name in CDS resources - all RDS resources are listed by name in LDS resources
Note that clusters and listeners are requested without name references, so Envoy will accept the snapshot list of clusters as-is even if it does not match all references found in xDS.
func (*Snapshot) GetResources ¶
GetResources selects snapshot resources by type.
func (*Snapshot) GetVersion ¶
GetVersion returns the version for a resource type.
type SnapshotCache ¶
type SnapshotCache interface { Cache // SetSnapshot sets a response snapshot for a node. For ADS, the snapshots // should have distinct versions and be internally consistent (e.g. all // referenced resources must be included in the snapshot). // // This method will cause the server to respond to all open watches, for which // the version differs from the snapshot version. SetSnapshot(node string, snapshot Snapshot) error // GetSnapshots gets the snapshot for a node. GetSnapshot(node string) (Snapshot, error) // ClearSnapshot removes all status and snapshot information associated with a node. ClearSnapshot(node string) // GetStatusInfo retrieves status information for a node ID. GetStatusInfo(string) StatusInfo // GetStatusKeys retrieves node IDs for all statuses. GetStatusKeys() []string }
SnapshotCache is a snapshot-based cache that maintains a single versioned snapshot of responses per node. SnapshotCache consistently replies with the latest snapshot. For the protocol to work correctly in ADS mode, EDS/RDS requests are responded only when all resources in the snapshot xDS response are named as part of the request. It is expected that the CDS response names all EDS clusters, and the LDS response names all RDS routes in a snapshot, to ensure that Envoy makes the request for all EDS clusters or RDS routes eventually.
SnapshotCache can operate as a REST or regular xDS backend. The snapshot can be partial, e.g. only include RDS or EDS resources.
func NewSnapshotCache ¶
func NewSnapshotCache(ads bool, hash NodeHash, logger log.Logger) SnapshotCache
NewSnapshotCache initializes a simple cache.
ADS flag forces a delay in responding to streaming requests until all resources are explicitly named in the request. This avoids the problem of a partial request over a single stream for a subset of resources which would require generating a fresh version for acknowledgement. ADS flag requires snapshot consistency. For non-ADS case (and fetch), multiple partial requests are sent across multiple streams and re-using the snapshot version is OK.
Logger is optional.
type StatusInfo ¶
type StatusInfo interface { // GetNode returns the node metadata. GetNode() *core.Node // GetNumWatches returns the number of open watches. GetNumWatches() int // GetLastWatchRequestTime returns the timestamp of the last discovery watch request. GetLastWatchRequestTime() time.Time }
StatusInfo tracks the server state for the remote Envoy node. Not all fields are used by all cache implementations.