Skip to content

Commit 98b5c9b

Browse files
authored
Refactor Bindinfo controller logic on object event watching and reconciliation triggering condition (#1149) (#1154)
* Use Reader for fetching Secrets, ConfigMaps, Routes, and Services * Revert "Fix concurrent access issues by copying labels map in SetupWithManager (#1145)" This reverts commit c285f60. * Refactor toOpbiRequest method to use Reader for fetching object labels and simplify predicate logic * Enhance toOpbiRequest method when it is deletion event on object --------- Signed-off-by: Daniel Fan <[email protected]>
1 parent 6901401 commit 98b5c9b

File tree

1 file changed

+54
-30
lines changed

1 file changed

+54
-30
lines changed

controllers/operandbindinfo/operandbindinfo_controller.go

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func (r *Reconciler) copySecret(ctx context.Context, sourceName, targetName, sou
274274
}
275275

276276
secret := &corev1.Secret{}
277-
if err := r.Client.Get(ctx, types.NamespacedName{Name: sourceName, Namespace: sourceNs}, secret); err != nil {
277+
if err := r.Reader.Get(ctx, types.NamespacedName{Name: sourceName, Namespace: sourceNs}, secret); err != nil {
278278
if apierrors.IsNotFound(err) {
279279
klog.V(3).Infof("Secret %s is not found from the namespace %s", sourceName, sourceNs)
280280
r.Recorder.Eventf(bindInfoInstance, corev1.EventTypeNormal, "NotFound", "No Secret %s in the namespace %s", sourceName, sourceNs)
@@ -376,7 +376,7 @@ func (r *Reconciler) copyConfigmap(ctx context.Context, sourceName, targetName,
376376
}
377377

378378
cm := &corev1.ConfigMap{}
379-
if err := r.Client.Get(ctx, types.NamespacedName{Name: sourceName, Namespace: sourceNs}, cm); err != nil {
379+
if err := r.Reader.Get(ctx, types.NamespacedName{Name: sourceName, Namespace: sourceNs}, cm); err != nil {
380380
if apierrors.IsNotFound(err) {
381381
klog.V(3).Infof("Configmap %s/%s is not found", sourceNs, sourceName)
382382
r.Recorder.Eventf(bindInfoInstance, corev1.EventTypeNormal, "NotFound", "No Configmap %s in the namespace %s", sourceName, sourceNs)
@@ -478,7 +478,7 @@ func (r *Reconciler) copyRoute(ctx context.Context, route operatorv1alpha1.Route
478478
}
479479

480480
sourceRoute := &ocproute.Route{}
481-
if err := r.Client.Get(ctx, types.NamespacedName{Name: route.Name, Namespace: sourceNs}, sourceRoute); err != nil {
481+
if err := r.Reader.Get(ctx, types.NamespacedName{Name: route.Name, Namespace: sourceNs}, sourceRoute); err != nil {
482482
if apierrors.IsNotFound(err) {
483483
klog.V(3).Infof("Route %s/%s is not found", sourceNs, route.Name)
484484
r.Recorder.Eventf(bindInfoInstance, corev1.EventTypeNormal, "NotFound", "No Route %s in the namespace %s", route.Name, sourceNs)
@@ -574,7 +574,7 @@ func (r *Reconciler) copyService(ctx context.Context, service operatorv1alpha1.S
574574
}
575575

576576
sourceService := &corev1.Service{}
577-
if err := r.Client.Get(ctx, types.NamespacedName{Name: service.Name, Namespace: sourceNs}, sourceService); err != nil {
577+
if err := r.Reader.Get(ctx, types.NamespacedName{Name: service.Name, Namespace: sourceNs}, sourceService); err != nil {
578578
if apierrors.IsNotFound(err) {
579579
klog.V(3).Infof("Route %s/%s is not found", sourceNs, service.Name)
580580
r.Recorder.Eventf(bindInfoInstance, corev1.EventTypeNormal, "NotFound", "No Service %s in the namespace %s", service.Name, sourceNs)
@@ -877,20 +877,56 @@ func unique(stringSlice []string) []string {
877877
return list
878878
}
879879

880-
func toOpbiRequest() handler.MapFunc {
880+
func (r *Reconciler) toOpbiRequest() handler.MapFunc {
881881
return func(object client.Object) []reconcile.Request {
882-
opbiInstance := []reconcile.Request{}
883882
labels := object.GetLabels()
883+
884+
// Get a complete copy of the object using the Reader
885+
var objectInCluster client.Object
886+
887+
switch v := object.(type) {
888+
case *corev1.Secret:
889+
objectInCluster = &corev1.Secret{}
890+
case *corev1.ConfigMap:
891+
objectInCluster = &corev1.ConfigMap{}
892+
case *ocproute.Route:
893+
objectInCluster = &ocproute.Route{}
894+
default:
895+
klog.Errorf("Unsupported object type: %T", v)
896+
return nil
897+
}
898+
if err := r.Reader.Get(context.Background(), types.NamespacedName{
899+
Name: object.GetName(), Namespace: object.GetNamespace(),
900+
}, objectInCluster); apierrors.IsNotFound(err) {
901+
klog.V(2).Infof("Object %s/%s not found, it is a deleted object, using the cache", object.GetNamespace(), object.GetName())
902+
} else if err != nil {
903+
klog.Errorf("Failed to get object %s/%s: %v", object.GetNamespace(), object.GetName(), err)
904+
return nil
905+
} else {
906+
klog.V(2).Infof("Object %s/%s found in the cluster", object.GetNamespace(), object.GetName())
907+
labels = objectInCluster.GetLabels()
908+
}
909+
910+
// check if the label contains the OperandBindInfo label
911+
if labels == nil {
912+
klog.V(2).Infof("No labels found in object %s/%s", objectInCluster.GetNamespace(), objectInCluster.GetName())
913+
return nil
914+
}
915+
if _, ok := labels[constant.OpbiTypeLabel]; !ok {
916+
klog.V(2).Infof("No OperandBindInfo label found in object %s/%s", objectInCluster.GetNamespace(), objectInCluster.GetName())
917+
return nil
918+
}
919+
opbiInstances := []reconcile.Request{}
884920
reg, _ := regexp.Compile(`^(.*)\.(.*)\/bindinfo`)
885-
for annotation := range labels {
886-
if reg.MatchString(annotation) {
887-
annotationSlices := strings.Split(annotation, ".")
888-
bindinfoNamespace := annotationSlices[0]
889-
bindinfoName := strings.Split(annotationSlices[1], "/")[0]
890-
opbiInstance = append(opbiInstance, reconcile.Request{NamespacedName: types.NamespacedName{Name: bindinfoName, Namespace: bindinfoNamespace}})
921+
for key := range labels {
922+
if reg.MatchString(key) {
923+
keySlices := strings.Split(key, ".")
924+
bindinfoNamespace := keySlices[0]
925+
bindinfoName := strings.Split(keySlices[1], "/")[0]
926+
opbiInstances = append(opbiInstances, reconcile.Request{NamespacedName: types.NamespacedName{Name: bindinfoName, Namespace: bindinfoNamespace}})
891927
}
892928
}
893-
return opbiInstance
929+
return opbiInstances
894930
}
895931
}
896932

@@ -1046,22 +1082,10 @@ func (r *Reconciler) refreshPodsFromDaemonSet(ns, name, resourceType string) err
10461082
func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
10471083
bindablePredicates := predicate.Funcs{
10481084
CreateFunc: func(e event.CreateEvent) bool {
1049-
labels := e.Object.GetLabels()
1050-
for labelKey, labelValue := range labels {
1051-
if labelKey == constant.OpbiTypeLabel {
1052-
return labelValue == "original"
1053-
}
1054-
}
1055-
return false
1085+
return true
10561086
},
10571087
UpdateFunc: func(e event.UpdateEvent) bool {
1058-
labels := e.ObjectNew.GetLabels()
1059-
for labelKey, labelValue := range labels {
1060-
if labelKey == constant.OpbiTypeLabel {
1061-
return labelValue == "original"
1062-
}
1063-
}
1064-
return false
1088+
return true
10651089
},
10661090
DeleteFunc: func(e event.DeleteEvent) bool {
10671091
return true
@@ -1113,12 +1137,12 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
11131137
For(&operatorv1alpha1.OperandBindInfo{}).
11141138
Watches(
11151139
&source.Kind{Type: &corev1.ConfigMap{}},
1116-
handler.EnqueueRequestsFromMapFunc(toOpbiRequest()),
1140+
handler.EnqueueRequestsFromMapFunc(r.toOpbiRequest()),
11171141
builder.WithPredicates(bindablePredicates),
11181142
).
11191143
Watches(
11201144
&source.Kind{Type: &corev1.Secret{}},
1121-
handler.EnqueueRequestsFromMapFunc(toOpbiRequest()),
1145+
handler.EnqueueRequestsFromMapFunc(r.toOpbiRequest()),
11221146
builder.WithPredicates(bindablePredicates),
11231147
).
11241148
Watches(
@@ -1134,7 +1158,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
11341158
if isRouteAPI {
11351159
controller.Watches(
11361160
&source.Kind{Type: &ocproute.Route{}},
1137-
handler.EnqueueRequestsFromMapFunc(toOpbiRequest()),
1161+
handler.EnqueueRequestsFromMapFunc(r.toOpbiRequest()),
11381162
builder.WithPredicates(bindablePredicates),
11391163
)
11401164
}

0 commit comments

Comments
 (0)