Browse Source

mesh: update xds controller to synthesize empty endpoints when no endpoints ref is found (#18835)

pull/18868/head
R.B. Boyer 1 year ago committed by GitHub
parent
commit
696aa1bbd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      internal/mesh/internal/controllers/xds/controller.go

18
internal/mesh/internal/controllers/xds/controller.go

@ -24,6 +24,7 @@ import (
) )
const ControllerName = "consul.io/xds-controller" const ControllerName = "consul.io/xds-controller"
const defaultTenancy = "default" const defaultTenancy = "default"
func Controller(endpointsMapper *bimapper.Mapper, updater ProxyUpdater, fetcher TrustBundleFetcher, leafCertManager *leafcert.Manager, leafMapper *LeafMapper, leafCancels *LeafCancels, datacenter string) controller.Controller { func Controller(endpointsMapper *bimapper.Mapper, updater ProxyUpdater, fetcher TrustBundleFetcher, leafCertManager *leafcert.Manager, leafMapper *LeafMapper, leafCancels *LeafCancels, datacenter string) controller.Controller {
@ -158,6 +159,12 @@ func (r *xdsReconciler) Reconcile(ctx context.Context, rt controller.Runtime, re
// Step 1: Resolve the reference by looking up the ServiceEndpoints. // Step 1: Resolve the reference by looking up the ServiceEndpoints.
// serviceEndpoints will not be nil unless there is an error. // serviceEndpoints will not be nil unless there is an error.
//
// TODO(rb/v2): note we should expose a flag on the endpointRef indicating if the user
// wants the absence of an Endpoints to imply returning a slice of no data, vs failing outright.
// In xdsv1 we call this the "allowEmpty" semantic. Here we are assuming "allowEmpty=true"
var psEndpoints *pbproxystate.Endpoints
if endpointRef.Id != nil {
serviceEndpoints, err := getServiceEndpoints(ctx, rt, endpointRef.Id) serviceEndpoints, err := getServiceEndpoints(ctx, rt, endpointRef.Id)
if err != nil { if err != nil {
rt.Logger.Error("error reading service endpoint", "id", endpointRef.Id, "error", err) rt.Logger.Error("error reading service endpoint", "id", endpointRef.Id, "error", err)
@ -169,7 +176,7 @@ func (r *xdsReconciler) Reconcile(ctx context.Context, rt controller.Runtime, re
} }
// Step 2: Translate it into pbproxystate.Endpoints. // Step 2: Translate it into pbproxystate.Endpoints.
psEndpoints, err := generateProxyStateEndpoints(serviceEndpoints, endpointRef.Port) psEndpoints, err = generateProxyStateEndpoints(serviceEndpoints, endpointRef.Port)
if err != nil { if err != nil {
rt.Logger.Error("error translating service endpoints to proxy state endpoints", "endpoint", endpointRef.Id, "error", err) rt.Logger.Error("error translating service endpoints to proxy state endpoints", "endpoint", endpointRef.Id, "error", err)
@ -179,18 +186,25 @@ func (r *xdsReconciler) Reconcile(ctx context.Context, rt controller.Runtime, re
return err return err
} }
} else {
psEndpoints = &pbproxystate.Endpoints{}
}
// Step 3: Add the endpoints to ProxyState. // Step 3: Add the endpoints to ProxyState.
proxyStateTemplate.Template.ProxyState.Endpoints[xdsClusterName] = psEndpoints proxyStateTemplate.Template.ProxyState.Endpoints[xdsClusterName] = psEndpoints
if endpointRef.Id != nil {
// Track all the endpoints that are used by this ProxyStateTemplate, so we can use this for step 4. // Track all the endpoints that are used by this ProxyStateTemplate, so we can use this for step 4.
endpointResourceRef := resource.Reference(endpointRef.Id, "") endpointResourceRef := resource.Reference(endpointRef.Id, "")
endpointsInProxyStateTemplate = append(endpointsInProxyStateTemplate, endpointResourceRef) endpointsInProxyStateTemplate = append(endpointsInProxyStateTemplate, endpointResourceRef)
}
} }
// Step 4: Track relationships between ProxyStateTemplates and ServiceEndpoints. // Step 4: Track relationships between ProxyStateTemplates and ServiceEndpoints.
r.endpointsMapper.TrackItem(req.ID, endpointsInProxyStateTemplate) r.endpointsMapper.TrackItem(req.ID, endpointsInProxyStateTemplate)
if len(endpointsInProxyStateTemplate) == 0 {
r.endpointsMapper.UntrackItem(req.ID)
}
// Iterate through leaf certificate references. // Iterate through leaf certificate references.
// For each leaf certificate reference, the controller should: // For each leaf certificate reference, the controller should:

Loading…
Cancel
Save