github.com/cilium/cilium@v1.16.2/pkg/clustermesh/endpointslicesync/endpointslicesync.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package endpointslicesync
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	"github.com/cilium/hive/cell"
    11  	"github.com/cilium/hive/job"
    12  	cache "k8s.io/client-go/tools/cache"
    13  )
    14  
    15  func registerEndpointSliceSync(_ cell.Lifecycle, params endpointSliceSyncParams) {
    16  	if !params.Clientset.IsEnabled() || params.ClusterMesh == nil || !params.ClusterMeshEnableEndpointSync {
    17  		return
    18  	}
    19  
    20  	params.Logger.Info("Endpoint Slice Cluster Mesh synchronization enabled")
    21  
    22  	meshPodInformer := newMeshPodInformer(params.Logger, params.ClusterMesh.GlobalServices())
    23  	params.ClusterMesh.RegisterClusterServiceUpdateHook(meshPodInformer.onClusterServiceUpdate)
    24  	params.ClusterMesh.RegisterClusterServiceDeleteHook(meshPodInformer.onClusterServiceDelete)
    25  	meshNodeInformer := newMeshNodeInformer(params.Logger)
    26  	params.ClusterMesh.RegisterClusterAddHook(meshNodeInformer.onClusterAdd)
    27  	params.ClusterMesh.RegisterClusterDeleteHook(meshNodeInformer.onClusterDelete)
    28  	params.JobGroup.Add(job.OneShot("endpointslicesync-main", func(ctx context.Context, health cell.Health) error {
    29  		params.Logger.Info("Bootstrap clustermesh EndpointSlice controller")
    30  
    31  		endpointSliceMeshController, meshServiceInformer, endpointSliceInformerFactory := newEndpointSliceMeshController(
    32  			ctx, params.Logger, params.EndpointSliceSyncConfig, meshPodInformer,
    33  			meshNodeInformer, params.Clientset,
    34  			params.Services, params.ClusterMesh.GlobalServices(),
    35  		)
    36  
    37  		endpointSliceInformerFactory.Start(ctx.Done())
    38  		if err := meshServiceInformer.Start(ctx); err != nil {
    39  			return err
    40  		}
    41  		endpointSliceInformerFactory.WaitForCacheSync(ctx.Done())
    42  
    43  		if !cache.WaitForCacheSync(ctx.Done(), meshServiceInformer.HasSynced) {
    44  			return fmt.Errorf("waitForCacheSync on service informer not successful")
    45  		}
    46  
    47  		if err := params.ClusterMesh.ServicesSynced(ctx); err != nil {
    48  			return nil // The parent context expired, and we are already terminating
    49  		}
    50  		endpointSliceMeshController.Run(ctx, params.ClusterMeshConcurrentEndpointSync)
    51  		return nil
    52  	}))
    53  }