Skip to content

Commit cf36967

Browse files
committed
feat: support excluded sync resources
Signed-off-by: KubeKyrie <[email protected]>
1 parent 810c6c4 commit cf36967

File tree

8 files changed

+138
-9
lines changed

8 files changed

+138
-9
lines changed

kustomize/crds/cluster.clusterpedia.io_clustersyncresources.yaml

+19
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,25 @@ spec:
3232
type: object
3333
spec:
3434
properties:
35+
excludedSyncResources:
36+
items:
37+
properties:
38+
group:
39+
type: string
40+
resources:
41+
items:
42+
type: string
43+
minItems: 1
44+
type: array
45+
versions:
46+
items:
47+
type: string
48+
type: array
49+
required:
50+
- group
51+
- resources
52+
type: object
53+
type: array
3554
syncResources:
3655
items:
3756
properties:

kustomize/crds/cluster.clusterpedia.io_pediaclusters.yaml

+19
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,25 @@ spec:
6666
certData:
6767
format: byte
6868
type: string
69+
excludedSyncResources:
70+
items:
71+
properties:
72+
group:
73+
type: string
74+
resources:
75+
items:
76+
type: string
77+
minItems: 1
78+
type: array
79+
versions:
80+
items:
81+
type: string
82+
type: array
83+
required:
84+
- group
85+
- resources
86+
type: object
87+
type: array
6988
keyData:
7089
format: byte
7190
type: string

pkg/generated/openapi/zz_generated.openapi.go

+26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/synchromanager/clustersynchro/cluster_synchro.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ type ClusterSynchro struct {
5959
storageResourceVersions map[schema.GroupVersionResource]map[string]interface{}
6060
storageResourceSynchros sync.Map
6161

62-
syncResources atomic.Value // []clusterv1alpha2.ClusterGroupResources
63-
setSyncResourcesCh chan struct{}
64-
resourceNegotiator *ResourceNegotiator
65-
groupResourceStatus atomic.Value // *GroupResourceStatus
62+
syncResources atomic.Value // []clusterv1alpha2.ClusterGroupResources
63+
excludedSyncResources atomic.Value // []clusterv1alpha2.ClusterGroupResources
64+
setSyncResourcesCh chan struct{}
65+
resourceNegotiator *ResourceNegotiator
66+
groupResourceStatus atomic.Value // *GroupResourceStatus
6667

6768
runningCondition atomic.Value // metav1.Condition
6869
healthyCondition atomic.Value // metav1.Condition
@@ -278,9 +279,12 @@ func (s *ClusterSynchro) Shutdown(updateStatus bool) {
278279
<-s.closed
279280
}
280281

281-
func (s *ClusterSynchro) SetResources(syncResources []clusterv1alpha2.ClusterGroupResources, syncAllCustomResources bool) {
282+
func (s *ClusterSynchro) SetResources(syncResources, excludedSyncResources []clusterv1alpha2.ClusterGroupResources, syncAllCustomResources bool) {
282283
s.syncResources.Store(syncResources)
283284
s.resourceNegotiator.SetSyncAllCustomResources(syncAllCustomResources)
285+
if excludedSyncResources != nil {
286+
s.excludedSyncResources.Store(excludedSyncResources)
287+
}
284288

285289
s.resetSyncResources()
286290
}
@@ -315,7 +319,13 @@ func (s *ClusterSynchro) refreshSyncResources() {
315319
if syncResources == nil {
316320
return
317321
}
318-
groupResourceStatus, storageResourceSyncConfigs := s.resourceNegotiator.NegotiateSyncResources(syncResources)
322+
323+
excludedSyncResources := make([]clusterv1alpha2.ClusterGroupResources, 0)
324+
loadValue := s.excludedSyncResources.Load()
325+
if loadValue != nil {
326+
excludedSyncResources = loadValue.([]clusterv1alpha2.ClusterGroupResources)
327+
}
328+
groupResourceStatus, storageResourceSyncConfigs := s.resourceNegotiator.NegotiateSyncResources(syncResources, excludedSyncResources)
319329

320330
lastGroupResourceStatus := s.groupResourceStatus.Load().(*GroupResourceStatus)
321331
deleted := groupResourceStatus.Merge(lastGroupResourceStatus)

pkg/synchromanager/clustersynchro/resource_negotiator.go

+36-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (negotiator *ResourceNegotiator) SetSyncAllCustomResources(sync bool) {
3939
negotiator.syncAllCustomResources = sync
4040
}
4141

42-
func (negotiator *ResourceNegotiator) NegotiateSyncResources(syncResources []clusterv1alpha2.ClusterGroupResources) (*GroupResourceStatus, map[schema.GroupVersionResource]syncConfig) {
42+
func (negotiator *ResourceNegotiator) NegotiateSyncResources(syncResources, excludedSyncResources []clusterv1alpha2.ClusterGroupResources) (*GroupResourceStatus, map[schema.GroupVersionResource]syncConfig) {
4343
var syncAllResources bool
4444
var watchKubeVersion, watchAggregatorResourceTypes bool
4545
for i, syncResource := range syncResources {
@@ -96,8 +96,24 @@ func (negotiator *ResourceNegotiator) NegotiateSyncResources(syncResources []clu
9696
continue
9797
}
9898

99+
// remove excludedSyncResources, groupResources.Versions or excludedGroupResources.Versions may be wildcard
100+
availableVersions := supportedVersions
101+
for _, excludedGroupResources := range excludedSyncResources {
102+
excludedResources := sets.New(excludedGroupResources.Resources...)
103+
if groupResources.Group != excludedGroupResources.Group {
104+
continue
105+
}
106+
if excludedResources.Has("*") {
107+
availableVersions = []string{}
108+
break
109+
}
110+
if excludedResources.Has(resource) {
111+
availableVersions = getNewAvailableVersions(availableVersions, excludedGroupResources.Versions)
112+
}
113+
}
114+
99115
syncGK := schema.GroupKind{Group: syncGR.Group, Kind: apiResource.Kind}
100-
syncVersions, isLegacyResource, err := negotiateSyncVersions(syncGK, groupResources.Versions, supportedVersions)
116+
syncVersions, isLegacyResource, err := negotiateSyncVersions(syncGK, groupResources.Versions, availableVersions)
101117
if err != nil {
102118
klog.InfoS("Skip resource sync", "cluster", negotiator.name, "resource", resource, "reason", err)
103119
continue
@@ -412,3 +428,21 @@ func (set GVRSet) Insert(gvrs ...schema.GroupVersionResource) {
412428
set[gvr] = struct{}{}
413429
}
414430
}
431+
432+
func getNewAvailableVersions(supportedVersions, excludedVersions []string) []string {
433+
if len(excludedVersions) == 0 {
434+
return []string{}
435+
}
436+
excludedVersionSet := sets.New(excludedVersions...)
437+
if excludedVersionSet.Has("*") {
438+
return []string{}
439+
}
440+
441+
res := make([]string, 0)
442+
for _, version := range supportedVersions {
443+
if !excludedVersionSet.Has(version) {
444+
res = append(res, version)
445+
}
446+
}
447+
return res
448+
}

pkg/synchromanager/clustersynchro_manager.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
340340

341341
var warnMsg string
342342
syncResources := cluster.Spec.SyncResources
343+
excludedSyncResources := cluster.Spec.ExcludedSyncResources
343344
if refName := cluster.Spec.SyncResourcesRefName; refName != "" {
344345
if ref, err := manager.clusterSyncResourcesLister.Get(refName); err != nil {
345346
if !apierrors.IsNotFound(err) {
@@ -354,6 +355,7 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
354355
warnMsg = "Warning: sync resource ref is not found"
355356
} else {
356357
syncResources = append(syncResources, ref.Spec.SyncResources...)
358+
excludedSyncResources = append(excludedSyncResources, ref.Spec.ExcludedSyncResources...)
357359
}
358360
}
359361

@@ -439,7 +441,7 @@ func (manager *Manager) reconcileCluster(cluster *clusterv1alpha2.PediaCluster)
439441
manager.synchrolock.Unlock()
440442
}
441443

442-
synchro.SetResources(syncResources, cluster.Spec.SyncAllCustomResources)
444+
synchro.SetResources(syncResources, excludedSyncResources, cluster.Spec.SyncAllCustomResources)
443445
return controller.NoRequeueResult
444446
}
445447

staging/src/github.com/clusterpedia-io/api/cluster/v1alpha2/types.go

+5
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ type ClusterSpec struct {
8989
// +required
9090
SyncResources []ClusterGroupResources `json:"syncResources"`
9191

92+
// +optional
93+
ExcludedSyncResources []ClusterGroupResources `json:"excludedSyncResources"`
94+
9295
// +optional
9396
SyncAllCustomResources bool `json:"syncAllCustomResources,omitempty"`
9497

@@ -242,6 +245,8 @@ type ClusterSyncResources struct {
242245
type ClusterSyncResourcesSpec struct {
243246
// +required
244247
SyncResources []ClusterGroupResources `json:"syncResources"`
248+
// +optional
249+
ExcludedSyncResources []ClusterGroupResources `json:"excludedSyncResources"`
245250
}
246251

247252
// +kubebuilder:object:root=true

staging/src/github.com/clusterpedia-io/api/cluster/v1alpha2/zz_generated.deepcopy.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)