@@ -24,7 +24,6 @@ import (
2424
2525 "github.com/go-logr/logr"
2626 "k8s.io/apimachinery/pkg/api/meta"
27- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827 "k8s.io/apimachinery/pkg/runtime"
2928 "k8s.io/apimachinery/pkg/types"
3029 "k8s.io/client-go/discovery"
@@ -37,28 +36,15 @@ import (
3736 "kusionstack.io/kube-utils/multicluster/metrics"
3837)
3938
40- // MultiClusterDiscovery provides fed and member clusters discovery interface
41- type MultiClusterDiscovery interface {
42- FedDiscoveryInterface () discovery.DiscoveryInterface
43- MembersCachedDiscoveryInterface () PartialCachedDiscoveryInterface
44- }
45-
46- // PartialCachedDiscoveryInterface is a subset of discovery.DiscoveryInterface.
47- type PartialCachedDiscoveryInterface interface {
48- ServerGroupsAndResources () ([]* metav1.APIGroup , []* metav1.APIResourceList , error )
49- Invalidate ()
50- Fresh () bool
51- }
52-
5339type ClusterClientManager interface {
54- AddClusterClient (cluster string , clusterClient client.Client , clusterCachedDiscoveryClient discovery.CachedDiscoveryInterface )
40+ AddClusterClient (cluster string , clusterClient client.Client , discoveryClient discovery.DiscoveryInterface )
5541 RemoveClusterClient (cluster string )
5642}
5743
5844func MultiClusterClientBuilder (log logr.Logger ) (cluster.NewClientFunc , ClusterClientManager ) {
5945 mcc := & multiClusterClient {
6046 clusterToClient : map [string ]client.Client {},
61- clusterToDiscoveryClient : map [string ]discovery.CachedDiscoveryInterface {},
47+ clusterToDiscoveryClient : map [string ]discovery.DiscoveryInterface {},
6248
6349 log : log ,
6450 }
@@ -97,7 +83,7 @@ func MultiClusterClientBuilder(log logr.Logger) (cluster.NewClientFunc, ClusterC
9783var (
9884 _ client.Client = & multiClusterClient {}
9985
100- _ MultiClusterDiscovery = & multiClusterClient {}
86+ _ MultiClusterDiscoveryManager = & multiClusterClient {}
10187
10288 _ ClusterClientManager = & multiClusterClient {}
10389)
@@ -109,13 +95,13 @@ type multiClusterClient struct {
10995 fedMapper meta.RESTMapper
11096
11197 clusterToClient map [string ]client.Client
112- clusterToDiscoveryClient map [string ]discovery.CachedDiscoveryInterface
98+ clusterToDiscoveryClient map [string ]discovery.DiscoveryInterface
11399
114100 mutex sync.RWMutex
115101 log logr.Logger
116102}
117103
118- func (mcc * multiClusterClient ) AddClusterClient (cluster string , clusterClient client.Client , clusterDiscoveryClient discovery.CachedDiscoveryInterface ) {
104+ func (mcc * multiClusterClient ) AddClusterClient (cluster string , clusterClient client.Client , clusterDiscoveryClient discovery.DiscoveryInterface ) {
119105 mcc .mutex .Lock ()
120106 defer mcc .mutex .Unlock ()
121107
@@ -478,113 +464,3 @@ func (mcc *multiClusterClient) getClusterNames(ctx context.Context) (clusters []
478464 }
479465 return
480466}
481-
482- func (mcc * multiClusterClient ) FedDiscoveryInterface () discovery.DiscoveryInterface {
483- return mcc .fedDiscovery
484- }
485-
486- func (mcc * multiClusterClient ) MembersCachedDiscoveryInterface () PartialCachedDiscoveryInterface {
487- return & cachedMultiClusterDiscoveryClient {
488- delegate : mcc ,
489- }
490- }
491-
492- type cachedMultiClusterDiscoveryClient struct {
493- delegate * multiClusterClient
494- }
495-
496- // ServerGroupsAndResources returns the supported server groups and resources for all clusters.
497- func (c * cachedMultiClusterDiscoveryClient ) ServerGroupsAndResources () ([]* metav1.APIGroup , []* metav1.APIResourceList , error ) {
498- c .delegate .mutex .Lock ()
499- defer c .delegate .mutex .Unlock ()
500-
501- allDiscoveryClient := c .delegate .clusterToDiscoveryClient
502-
503- // If there is only one cluster, we can use the cached discovery client to get the server groups and resources
504- if len (allDiscoveryClient ) == 1 {
505- for _ , cachedClient := range allDiscoveryClient {
506- return cachedClient .ServerGroupsAndResources ()
507- }
508- }
509-
510- // If there are multiple clusters, we need to get the intersection of groups and resources
511- var (
512- groupVersionCount = make (map [string ]int )
513- groupVersionNameCount = make (map [string ]int )
514-
515- apiGroupsRes []* metav1.APIGroup
516- apiResourceListsRes []* metav1.APIResourceList
517- groupVersionToResources = make (map [string ][]metav1.APIResource )
518- )
519- for _ , cachedClient := range allDiscoveryClient {
520- apiGroups , apiResourceLists , err := cachedClient .ServerGroupsAndResources ()
521- if err != nil {
522- return nil , nil , err
523- }
524-
525- for _ , apiGroup := range apiGroups {
526- groupVersion := apiGroup .PreferredVersion .GroupVersion
527-
528- if _ , ok := groupVersionCount [groupVersion ]; ! ok {
529- groupVersionCount [groupVersion ] = 1
530- } else {
531- groupVersionCount [groupVersion ]++
532-
533- if groupVersionCount [groupVersion ] == len (allDiscoveryClient ) { // all clusters have this PreferredVersion
534- apiGroupsRes = append (apiGroupsRes , apiGroup )
535- }
536- }
537- }
538-
539- for _ , apiResourceList := range apiResourceLists {
540- for i := range apiResourceList .APIResources {
541- apiResource := apiResourceList .APIResources [i ]
542- groupVersionName := fmt .Sprintf ("%s/%s" , apiResourceList .GroupVersion , apiResource .Name )
543-
544- if _ , ok := groupVersionNameCount [groupVersionName ]; ! ok {
545- groupVersionNameCount [groupVersionName ] = 1
546- } else {
547- groupVersionNameCount [groupVersionName ]++
548-
549- if groupVersionNameCount [groupVersionName ] == len (allDiscoveryClient ) { // all clusters have this GroupVersion and Name
550- groupVersionToResources [apiResourceList .GroupVersion ] = append (groupVersionToResources [apiResourceList .GroupVersion ], apiResource )
551- }
552- }
553- }
554- }
555- }
556-
557- for groupVersion , resources := range groupVersionToResources {
558- apiResourceList := metav1.APIResourceList {
559- TypeMeta : metav1.TypeMeta {Kind : "APIResourceList" , APIVersion : "v1" },
560- GroupVersion : groupVersion ,
561- }
562- apiResourceList .APIResources = append (apiResourceList .APIResources , resources ... )
563- apiResourceListsRes = append (apiResourceListsRes , & apiResourceList )
564- }
565-
566- return apiGroupsRes , apiResourceListsRes , nil
567- }
568-
569- // Invalidate invalidates the cached discovery clients for all clusters.
570- func (c * cachedMultiClusterDiscoveryClient ) Invalidate () {
571- c .delegate .mutex .Lock ()
572- defer c .delegate .mutex .Unlock ()
573-
574- for _ , cachedClient := range c .delegate .clusterToDiscoveryClient {
575- cachedClient .Invalidate ()
576- }
577- }
578-
579- // Fresh returns true if all cached discovery clients are fresh.
580- func (c * cachedMultiClusterDiscoveryClient ) Fresh () bool {
581- c .delegate .mutex .Lock ()
582- defer c .delegate .mutex .Unlock ()
583-
584- for _ , cachedClient := range c .delegate .clusterToDiscoveryClient {
585- if ! cachedClient .Fresh () {
586- return false
587- }
588- }
589- return true
590- }
0 commit comments