Skip to content

Commit 48e7d16

Browse files
Merge pull request #2524 from zimnx/remote-configmaps
Mirror ConfigMaps and Secrets referenced in ScyllaDBCluster into remote datacenters
2 parents c132101 + 48b523d commit 48e7d16

File tree

16 files changed

+857
-6
lines changed

16 files changed

+857
-6
lines changed

deploy/operator.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ rules:
443443
- endpoints
444444
- namespaces
445445
- services
446+
- secrets
447+
- configmaps
446448
verbs:
447449
- create
448450
- delete

deploy/operator/00_operator_remote.clusterrole_def.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ rules:
4747
- endpoints
4848
- namespaces
4949
- services
50+
- secrets
51+
- configmaps
5052
verbs:
5153
- create
5254
- delete

helm/scylla-operator/templates/operator_remote.clusterrole_def.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ rules:
4747
- endpoints
4848
- namespaces
4949
- services
50+
- secrets
51+
- configmaps
5052
verbs:
5153
- create
5254
- delete

pkg/cmd/operator/operator.go

+60
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,18 @@ func (o *OperatorOptions) run(ctx context.Context, streams genericclioptions.IOS
325325
),
326326
)
327327

328+
remoteOperatorManagedResourcesOnlyInformer := remoteinformers.NewSharedInformerFactoryWithOptions[kubernetes.Interface](
329+
&o.clusterKubeClient,
330+
resyncPeriod,
331+
remoteinformers.WithTweakListOptions[kubernetes.Interface](
332+
func(options *metav1.ListOptions) {
333+
options.LabelSelector = labels.SelectorFromSet(map[string]string{
334+
naming.KubernetesManagedByLabel: naming.RemoteOperatorAppNameWithDomain,
335+
}).String()
336+
},
337+
),
338+
)
339+
328340
scyllaOperatorConfigInformers := scyllainformers.NewSharedInformerFactoryWithOptions(o.scyllaClient, resyncPeriod, scyllainformers.WithTweakListOptions(
329341
func(options *metav1.ListOptions) {
330342
options.FieldSelector = fields.OneTermEqualSelector("metadata.name", naming.SingletonName).String()
@@ -476,6 +488,8 @@ func (o *OperatorOptions) run(ctx context.Context, streams genericclioptions.IOS
476488
&o.clusterScyllaClient,
477489
scyllaInformers.Scylla().V1alpha1().ScyllaDBClusters(),
478490
scyllaInformers.Scylla().V1alpha1().ScyllaOperatorConfigs(),
491+
kubeInformers.Core().V1().ConfigMaps(),
492+
kubeInformers.Core().V1().Secrets(),
479493
remoteScyllaInformer.ForResource(&scyllav1alpha1.RemoteOwner{}, remoteinformers.ClusterListWatch[scyllaversionedclient.Interface]{
480494
ListFunc: func(client remoteclient.ClusterClientInterface[scyllaversionedclient.Interface], cluster, ns string) cache.ListFunc {
481495
return func(options metav1.ListOptions) (runtime.Object, error) {
@@ -616,6 +630,46 @@ func (o *OperatorOptions) run(ctx context.Context, streams genericclioptions.IOS
616630
}
617631
},
618632
}),
633+
remoteOperatorManagedResourcesOnlyInformer.ForResource(&corev1.ConfigMap{}, remoteinformers.ClusterListWatch[kubernetes.Interface]{
634+
ListFunc: func(client remoteclient.ClusterClientInterface[kubernetes.Interface], cluster, ns string) cache.ListFunc {
635+
return func(options metav1.ListOptions) (runtime.Object, error) {
636+
clusterClient, err := client.Cluster(cluster)
637+
if err != nil {
638+
return nil, err
639+
}
640+
return clusterClient.CoreV1().ConfigMaps(ns).List(ctx, options)
641+
}
642+
},
643+
WatchFunc: func(client remoteclient.ClusterClientInterface[kubernetes.Interface], cluster, ns string) cache.WatchFunc {
644+
return func(options metav1.ListOptions) (watch.Interface, error) {
645+
clusterClient, err := client.Cluster(cluster)
646+
if err != nil {
647+
return nil, err
648+
}
649+
return clusterClient.CoreV1().ConfigMaps(ns).Watch(ctx, options)
650+
}
651+
},
652+
}),
653+
remoteOperatorManagedResourcesOnlyInformer.ForResource(&corev1.Secret{}, remoteinformers.ClusterListWatch[kubernetes.Interface]{
654+
ListFunc: func(client remoteclient.ClusterClientInterface[kubernetes.Interface], cluster, ns string) cache.ListFunc {
655+
return func(options metav1.ListOptions) (runtime.Object, error) {
656+
clusterClient, err := client.Cluster(cluster)
657+
if err != nil {
658+
return nil, err
659+
}
660+
return clusterClient.CoreV1().Secrets(ns).List(ctx, options)
661+
}
662+
},
663+
WatchFunc: func(client remoteclient.ClusterClientInterface[kubernetes.Interface], cluster, ns string) cache.WatchFunc {
664+
return func(options metav1.ListOptions) (watch.Interface, error) {
665+
clusterClient, err := client.Cluster(cluster)
666+
if err != nil {
667+
return nil, err
668+
}
669+
return clusterClient.CoreV1().Secrets(ns).Watch(ctx, options)
670+
}
671+
},
672+
}),
619673
)
620674
if err != nil {
621675
return fmt.Errorf("can't create ScyllaDBCluster controller: %w", err)
@@ -672,6 +726,12 @@ func (o *OperatorOptions) run(ctx context.Context, streams genericclioptions.IOS
672726
remoteScyllaPodInformer.Start(ctx.Done())
673727
}()
674728

729+
wg.Add(1)
730+
go func() {
731+
defer wg.Done()
732+
remoteOperatorManagedResourcesOnlyInformer.Start(ctx.Done())
733+
}()
734+
675735
wg.Add(1)
676736
go func() {
677737
defer wg.Done()

pkg/controller/scylladbcluster/conditions.go

+4
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,8 @@ const (
1515
remoteEndpointsControllerDegradedCondition = "RemoteEndpointsControllerDegraded"
1616
scyllaDBClusterFinalizerProgressingCondition = "ScyllaDBClusterFinalizerProgressing"
1717
scyllaDBClusterFinalizerDegradedCondition = "ScyllaDBClusterFinalizerDegraded"
18+
remoteConfigMapControllerProgressingCondition = "RemoteConfigMapControllerProgressing"
19+
remoteConfigMapControllerDegradedCondition = "RemoteConfigMapControllerDegraded"
20+
remoteSecretControllerProgressingCondition = "RemoteSecretControllerProgressing"
21+
remoteSecretControllerDegradedCondition = "RemoteSecretControllerDegraded"
1822
)

pkg/controller/scylladbcluster/controller.go

+86
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"sync"
77
"time"
88

9+
corev1informers "k8s.io/client-go/informers/core/v1"
10+
911
scyllav1alpha1 "github.com/scylladb/scylla-operator/pkg/api/scylla/v1alpha1"
1012
scyllaclient "github.com/scylladb/scylla-operator/pkg/client/scylla/clientset/versioned"
1113
scyllav1alpha1informers "github.com/scylladb/scylla-operator/pkg/client/scylla/informers/externalversions/scylla/v1alpha1"
@@ -54,6 +56,8 @@ type Controller struct {
5456

5557
scyllaDBClusterLister scyllav1alpha1listers.ScyllaDBClusterLister
5658
scyllaOperatorConfigLister scyllav1alpha1listers.ScyllaOperatorConfigLister
59+
configMapLister corev1listers.ConfigMapLister
60+
secretLister corev1listers.SecretLister
5761

5862
remoteRemoteOwnerLister remotelister.GenericClusterLister[scyllav1alpha1listers.RemoteOwnerLister]
5963
remoteScyllaDBDatacenterLister remotelister.GenericClusterLister[scyllav1alpha1listers.ScyllaDBDatacenterLister]
@@ -62,6 +66,8 @@ type Controller struct {
6266
remoteEndpointSliceLister remotelister.GenericClusterLister[discoveryv1listers.EndpointSliceLister]
6367
remoteEndpointsLister remotelister.GenericClusterLister[corev1listers.EndpointsLister]
6468
remotePodLister remotelister.GenericClusterLister[corev1listers.PodLister]
69+
remoteConfigMapLister remotelister.GenericClusterLister[corev1listers.ConfigMapLister]
70+
remoteSecretLister remotelister.GenericClusterLister[corev1listers.SecretLister]
6571

6672
cachesToSync []cache.InformerSynced
6773

@@ -78,13 +84,17 @@ func NewController(
7884
scyllaRemoteClient remoteclient.ClusterClientInterface[scyllaclient.Interface],
7985
scyllaDBClusterInformer scyllav1alpha1informers.ScyllaDBClusterInformer,
8086
scyllaOperatorConfigInformer scyllav1alpha1informers.ScyllaOperatorConfigInformer,
87+
configMapInformer corev1informers.ConfigMapInformer,
88+
secretInformer corev1informers.SecretInformer,
8189
remoteRemoteOwnerInformer remoteinformers.GenericClusterInformer,
8290
remoteScyllaDBDatacenterInformer remoteinformers.GenericClusterInformer,
8391
remoteNamespaceInformer remoteinformers.GenericClusterInformer,
8492
remoteServiceInformer remoteinformers.GenericClusterInformer,
8593
remoteEndpointSliceInformer remoteinformers.GenericClusterInformer,
8694
remoteEndpointsInformer remoteinformers.GenericClusterInformer,
8795
remotePodInformer remoteinformers.GenericClusterInformer,
96+
remoteConfigMapInformer remoteinformers.GenericClusterInformer,
97+
remoteSecretInformer remoteinformers.GenericClusterInformer,
8898
) (*Controller, error) {
8999
eventBroadcaster := record.NewBroadcaster()
90100
eventBroadcaster.StartStructuredLogging(0)
@@ -98,6 +108,8 @@ func NewController(
98108

99109
scyllaDBClusterLister: scyllaDBClusterInformer.Lister(),
100110
scyllaOperatorConfigLister: scyllaOperatorConfigInformer.Lister(),
111+
configMapLister: configMapInformer.Lister(),
112+
secretLister: secretInformer.Lister(),
101113

102114
remoteRemoteOwnerLister: remotelister.NewClusterLister(scyllav1alpha1listers.NewRemoteOwnerLister, remoteRemoteOwnerInformer.Indexer().Cluster),
103115
remoteScyllaDBDatacenterLister: remotelister.NewClusterLister(scyllav1alpha1listers.NewScyllaDBDatacenterLister, remoteScyllaDBDatacenterInformer.Indexer().Cluster),
@@ -106,16 +118,23 @@ func NewController(
106118
remoteEndpointSliceLister: remotelister.NewClusterLister(discoveryv1listers.NewEndpointSliceLister, remoteEndpointSliceInformer.Indexer().Cluster),
107119
remoteEndpointsLister: remotelister.NewClusterLister(corev1listers.NewEndpointsLister, remoteEndpointsInformer.Indexer().Cluster),
108120
remotePodLister: remotelister.NewClusterLister(corev1listers.NewPodLister, remotePodInformer.Indexer().Cluster),
121+
remoteConfigMapLister: remotelister.NewClusterLister(corev1listers.NewConfigMapLister, remoteConfigMapInformer.Indexer().Cluster),
122+
remoteSecretLister: remotelister.NewClusterLister(corev1listers.NewSecretLister, remoteSecretInformer.Indexer().Cluster),
109123

110124
cachesToSync: []cache.InformerSynced{
111125
scyllaDBClusterInformer.Informer().HasSynced,
126+
scyllaOperatorConfigInformer.Informer().HasSynced,
127+
configMapInformer.Informer().HasSynced,
128+
secretInformer.Informer().HasSynced,
112129
remoteRemoteOwnerInformer.Informer().HasSynced,
113130
remoteScyllaDBDatacenterInformer.Informer().HasSynced,
114131
remoteNamespaceInformer.Informer().HasSynced,
115132
remoteServiceInformer.Informer().HasSynced,
116133
remoteEndpointSliceInformer.Informer().HasSynced,
117134
remoteEndpointsInformer.Informer().HasSynced,
118135
remotePodInformer.Informer().HasSynced,
136+
remoteConfigMapInformer.Informer().HasSynced,
137+
remoteSecretInformer.Informer().HasSynced,
119138
},
120139

121140
eventRecorder: eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: "scylladbcluster-controller"}),
@@ -154,6 +173,11 @@ func NewController(
154173
errs = append(errs, fmt.Errorf("can't register to ScyllaDBCluster events: %w", err))
155174
}
156175

176+
// Local ConfigMap and Secret handlers are skipped to optimize number of syncs which doesn't do anything.
177+
// Applying configuration change requires rolling restart of ScyllaDBCluster, so these resources will be synced upon
178+
// ScyllaDBCluster update.
179+
// These could be added once ConfigMaps and Secrets would require immediate sync.
180+
157181
// TODO: add error handling once these start returning errors
158182
remoteRemoteOwnerInformer.Informer().AddEventHandler(
159183
cache.ResourceEventHandlerFuncs{
@@ -211,6 +235,22 @@ func NewController(
211235
},
212236
)
213237

238+
remoteConfigMapInformer.Informer().AddEventHandler(
239+
cache.ResourceEventHandlerFuncs{
240+
AddFunc: scc.addRemoteConfigMap,
241+
UpdateFunc: scc.updateRemoteConfigMap,
242+
DeleteFunc: scc.deleteRemoteConfigMap,
243+
},
244+
)
245+
246+
remoteSecretInformer.Informer().AddEventHandler(
247+
cache.ResourceEventHandlerFuncs{
248+
AddFunc: scc.addRemoteSecret,
249+
UpdateFunc: scc.updateRemoteSecret,
250+
DeleteFunc: scc.deleteRemoteSecret,
251+
},
252+
)
253+
214254
err = utilerrors.NewAggregate(errs)
215255
if err != nil {
216256
return nil, fmt.Errorf("can't register event handlers: %w", err)
@@ -540,3 +580,49 @@ func (scc *Controller) deleteRemotePod(obj interface{}) {
540580
scc.enqueueThroughParentLabel,
541581
)
542582
}
583+
584+
func (scc *Controller) addRemoteConfigMap(obj interface{}) {
585+
scc.handlers.HandleAdd(
586+
obj.(*corev1.ConfigMap),
587+
scc.enqueueThroughParentLabel,
588+
)
589+
}
590+
591+
func (scc *Controller) updateRemoteConfigMap(old, cur interface{}) {
592+
scc.handlers.HandleUpdate(
593+
old.(*corev1.ConfigMap),
594+
cur.(*corev1.ConfigMap),
595+
scc.enqueueThroughParentLabel,
596+
scc.deleteRemoteConfigMap,
597+
)
598+
}
599+
600+
func (scc *Controller) deleteRemoteConfigMap(obj interface{}) {
601+
scc.handlers.HandleDelete(
602+
obj,
603+
scc.enqueueThroughParentLabel,
604+
)
605+
}
606+
607+
func (scc *Controller) addRemoteSecret(obj interface{}) {
608+
scc.handlers.HandleAdd(
609+
obj.(*corev1.Secret),
610+
scc.enqueueThroughParentLabel,
611+
)
612+
}
613+
614+
func (scc *Controller) updateRemoteSecret(old, cur interface{}) {
615+
scc.handlers.HandleUpdate(
616+
old.(*corev1.Secret),
617+
cur.(*corev1.Secret),
618+
scc.enqueueThroughParentLabel,
619+
scc.deleteRemoteSecret,
620+
)
621+
}
622+
623+
func (scc *Controller) deleteRemoteSecret(obj interface{}) {
624+
scc.handlers.HandleDelete(
625+
obj,
626+
scc.enqueueThroughParentLabel,
627+
)
628+
}

0 commit comments

Comments
 (0)