Some checks failed
codecov / upload (push) Failing after 13m59s
CodeQL / Analyze (push) Failing after 1s
Testing / vet-proto (push) Failing after 1s
Testing / tests (arm, latest) (push) Waiting to run
Testing / extras (latest) (push) Failing after 1s
Testing / static checks (latest-1) (push) Failing after 1s
Testing / tests (-race, latest) (push) Failing after 1s
Testing / tests (i386, latest) (push) Failing after 1s
Testing / tests (latest) (push) Failing after 1s
Testing / tests (latest-1) (push) Failing after 1s
Lock Threads / lock (push) Failing after 1s
govulncheck / govulncheck (.) (push) Failing after 1s
govulncheck / govulncheck (./cmd/protoc-gen-go-grpc) (push) Failing after 1s
govulncheck / govulncheck (./gcp/observability) (push) Failing after 1s
govulncheck / govulncheck (./security/advancedtls) (push) Failing after 1s
govulncheck / govulncheck (./stats/opencensus) (push) Failing after 1s
Stale bot / stale (push) Failing after 1s
134 lines
4.6 KiB
Go
134 lines
4.6 KiB
Go
/*
|
|
*
|
|
* Copyright 2025 gRPC authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package xdsresource
|
|
|
|
import (
|
|
"context"
|
|
|
|
"google.golang.org/grpc/resolver"
|
|
)
|
|
|
|
// XDSConfig holds the complete gRPC client-side xDS configuration containing
|
|
// all necessary resources.
|
|
type XDSConfig struct {
|
|
// Listener holds the listener configuration. It is guaranteed to be
|
|
// non-nil.
|
|
Listener *ListenerUpdate
|
|
|
|
// RouteConfig holds the route configuration. It will be populated even if
|
|
// the route configuration was inlined into the Listener resource. It is
|
|
// guaranteed to be non-nil.
|
|
RouteConfig *RouteConfigUpdate
|
|
|
|
// VirtualHost is selected from the route configuration whose domain field
|
|
// offers the best match against the provided dataplane authority. It is
|
|
// guaranteed to be non-nil.
|
|
VirtualHost *VirtualHost
|
|
|
|
// Clusters is a map from cluster name to its configuration.
|
|
Clusters map[string]*ClusterResult
|
|
}
|
|
|
|
// ClusterResult contains a cluster's configuration when a valid resource is
|
|
// received from the management server. It contains an error when:
|
|
// - an invalid resource is received from the management server and
|
|
// a valid resource was not already present or
|
|
// - the cluster resource does not exist on the management server
|
|
type ClusterResult struct {
|
|
Config ClusterConfig
|
|
Err error
|
|
}
|
|
|
|
// ClusterConfig contains configuration for a single cluster.
|
|
type ClusterConfig struct {
|
|
// Cluster configuration for the cluster. This field is always set to a
|
|
// non-nil value.
|
|
Cluster *ClusterUpdate
|
|
// EndpointConfig contains endpoint configuration for a leaf cluster. This
|
|
// field is only set for EDS and LOGICAL_DNS clusters.
|
|
EndpointConfig *EndpointConfig
|
|
// AggregateConfig contains configuration for an aggregate cluster. This
|
|
// field is only set for AGGREGATE clusters.
|
|
AggregateConfig *AggregateConfig
|
|
}
|
|
|
|
// AggregateConfig holds the configuration for an aggregate cluster.
|
|
type AggregateConfig struct {
|
|
// LeafClusters contains a prioritized list of names of the leaf clusters
|
|
// for the cluster.
|
|
LeafClusters []string
|
|
}
|
|
|
|
// EndpointConfig contains configuration corresponding to the endpoints in a
|
|
// cluster. Only one of EDSUpdate or DNSEndpoints will be populated based on the
|
|
// cluster type.
|
|
type EndpointConfig struct {
|
|
// Endpoint configurartion for the EDS clusters.
|
|
EDSUpdate *EndpointsUpdate
|
|
// Endpoint configuration for the LOGICAL_DNS clusters.
|
|
DNSEndpoints *DNSUpdate
|
|
// ResolutionNote stores error encountered while obtaining endpoints data
|
|
// for the cluster. It will contain a nil value when a valid endpoint data is
|
|
// received. It contains an error when:
|
|
// - an invalid resource is received from the management server or
|
|
// - the endpoint resource does not exist on the management server
|
|
ResolutionNote error
|
|
}
|
|
|
|
// DNSUpdate represents the result of a DNS resolution, containing a list of
|
|
// discovered endpoints.
|
|
type DNSUpdate struct {
|
|
// Endpoints is the complete list of endpoints returned by the DNS resolver.
|
|
Endpoints []resolver.Endpoint
|
|
}
|
|
|
|
// xdsConfigkey is the type used as the key to store XDSConfig in the Attributes
|
|
// field of resolver.State.
|
|
type xdsConfigkey struct{}
|
|
|
|
// SetXDSConfig returns a copy of state in which the Attributes field is updated
|
|
// with the XDSConfig.
|
|
func SetXDSConfig(state resolver.State, config *XDSConfig) resolver.State {
|
|
state.Attributes = state.Attributes.WithValue(xdsConfigkey{}, config)
|
|
return state
|
|
}
|
|
|
|
// XDSConfigFromResolverState returns XDSConfig stored as an attribute in the
|
|
// resolver state.
|
|
func XDSConfigFromResolverState(state resolver.State) *XDSConfig {
|
|
if v := state.Attributes.Value(xdsConfigkey{}); v != nil {
|
|
return v.(*XDSConfig)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type xdsConfigKey struct{}
|
|
|
|
// NewContextWithXDSConfig returns a new context with xDSConfig added to it.
|
|
func NewContextWithXDSConfig(ctx context.Context, config *XDSConfig) context.Context {
|
|
return context.WithValue(ctx, xdsConfigKey{}, config)
|
|
}
|
|
|
|
// XDSConfigFromContext returns the XDSConfig stored in ctx.
|
|
func XDSConfigFromContext(ctx context.Context) *XDSConfig {
|
|
if v := ctx.Value(xdsConfigKey{}); v != nil {
|
|
return v.(*XDSConfig)
|
|
}
|
|
return nil
|
|
}
|