From c0456ce4ae811c21aef914e3eedfc97dfe63740f Mon Sep 17 00:00:00 2001 From: YuChen Date: Thu, 23 Nov 2023 18:11:35 -0800 Subject: [PATCH 1/2] allow to add multiple owners to cm/secret Signed-off-by: YuChen --- .../operandbindinfo_controller.go | 24 +++++++++++++++---- .../operandrequest/reconcile_operand.go | 2 +- controllers/util/util.go | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/controllers/operandbindinfo/operandbindinfo_controller.go b/controllers/operandbindinfo/operandbindinfo_controller.go index 2c1bab9c..11bd921d 100644 --- a/controllers/operandbindinfo/operandbindinfo_controller.go +++ b/controllers/operandbindinfo/operandbindinfo_controller.go @@ -296,8 +296,8 @@ func (r *Reconciler) copySecret(ctx context.Context, sourceName, targetName, sou Data: secret.Data, StringData: secret.StringData, } - // Set the OperandRequest as the controller of the Secret - if err := controllerutil.SetControllerReference(requestInstance, secretCopy, r.Scheme); err != nil { + // Set the OperandRequest as the owner of the Secret + if err := controllerutil.SetOwnerReference(requestInstance, secretCopy, r.Scheme); err != nil { return false, errors.Wrapf(err, "failed to set OperandRequest %s as the owner of Secret %s", requestInstance.Name, targetName) } @@ -310,6 +310,14 @@ func (r *Reconciler) copySecret(ctx context.Context, sourceName, targetName, sou if err := r.Client.Get(ctx, types.NamespacedName{Namespace: targetNs, Name: targetName}, existingSecret); err != nil { return false, errors.Wrapf(err, "failed to get secret %s/%s", targetNs, targetName) } + + // Copy the owner reference from the existing secret to the new secret + secretCopy.SetOwnerReferences(existingSecret.GetOwnerReferences()) + // Set the OperandRequest as the owner of the new Secret + if err := controllerutil.SetOwnerReference(requestInstance, secretCopy, r.Scheme); err != nil { + return false, errors.Wrapf(err, "failed to set OperandRequest %s as the owner of Secret %s", requestInstance.Name, targetName) + } + if needUpdate := util.CompareSecret(secretCopy, existingSecret); needUpdate { podRefreshment = true if err := r.Update(ctx, secretCopy); err != nil { @@ -389,8 +397,8 @@ func (r *Reconciler) copyConfigmap(ctx context.Context, sourceName, targetName, Data: cm.Data, BinaryData: cm.BinaryData, } - // Set the OperandRequest as the controller of the configmap - if err := controllerutil.SetControllerReference(requestInstance, cmCopy, r.Scheme); err != nil { + // Set OperandRequest as the owners of the configmap + if err := controllerutil.SetOwnerReference(requestInstance, cmCopy, r.Scheme); err != nil { return false, errors.Wrapf(err, "failed to set OperandRequest %s as the owner of ConfigMap %s", requestInstance.Name, sourceName) } @@ -403,6 +411,14 @@ func (r *Reconciler) copyConfigmap(ctx context.Context, sourceName, targetName, if err := r.Client.Get(ctx, types.NamespacedName{Namespace: targetNs, Name: targetName}, existingCm); err != nil { return false, errors.Wrapf(err, "failed to get ConfigMap %s/%s", targetNs, targetName) } + + // Copy the owner reference from the existing secret to the new configmap + cmCopy.SetOwnerReferences(existingCm.GetOwnerReferences()) + // Set the OperandRequest as the owner of the new configmap + if err := controllerutil.SetOwnerReference(requestInstance, cmCopy, r.Scheme); err != nil { + return false, errors.Wrapf(err, "failed to set OperandRequest %s as the owner of ConfigMap %s", requestInstance.Name, targetName) + } + if needUpdate := util.CompareConfigMap(cmCopy, existingCm); needUpdate { podRefreshment = true if err := r.Update(ctx, cmCopy); err != nil { diff --git a/controllers/operandrequest/reconcile_operand.go b/controllers/operandrequest/reconcile_operand.go index 1e8ffc43..28a3cff1 100644 --- a/controllers/operandrequest/reconcile_operand.go +++ b/controllers/operandrequest/reconcile_operand.go @@ -417,7 +417,7 @@ func (r *Reconciler) reconcileCRwithRequest(ctx context.Context, requestInstance crFromRequest.SetNamespace(requestKey.Namespace) crFromRequest.SetAPIVersion(operand.APIVersion) crFromRequest.SetKind(operand.Kind) - // Set the OperandRequest as the controller of the CR from request + // Set the OperandRequest as the owner of the CR from request if err := controllerutil.SetOwnerReference(requestInstance, &crFromRequest, r.Scheme); err != nil { merr.Add(errors.Wrapf(err, "failed to set ownerReference for custom resource %s/%s", requestKey.Namespace, name)) } diff --git a/controllers/util/util.go b/controllers/util/util.go index 5846d374..d4f94082 100644 --- a/controllers/util/util.go +++ b/controllers/util/util.go @@ -282,11 +282,11 @@ func EnsureLabelsForService(s *corev1.Service, labels map[string]string) { } func CompareSecret(secret *corev1.Secret, existingSecret *corev1.Secret) (needUpdate bool) { - return !equality.Semantic.DeepEqual(secret.GetLabels(), existingSecret.GetLabels()) || !equality.Semantic.DeepEqual(secret.Type, existingSecret.Type) || !equality.Semantic.DeepEqual(secret.Data, existingSecret.Data) || !equality.Semantic.DeepEqual(secret.StringData, existingSecret.StringData) + return !equality.Semantic.DeepEqual(secret.GetLabels(), existingSecret.GetLabels()) || !equality.Semantic.DeepEqual(secret.Type, existingSecret.Type) || !equality.Semantic.DeepEqual(secret.Data, existingSecret.Data) || !equality.Semantic.DeepEqual(secret.StringData, existingSecret.StringData) || !equality.Semantic.DeepEqual(secret.GetOwnerReferences(), existingSecret.GetOwnerReferences()) } func CompareConfigMap(configMap *corev1.ConfigMap, existingConfigMap *corev1.ConfigMap) (needUpdate bool) { - return !equality.Semantic.DeepEqual(configMap.GetLabels(), existingConfigMap.GetLabels()) || !equality.Semantic.DeepEqual(configMap.Data, existingConfigMap.Data) || !equality.Semantic.DeepEqual(configMap.BinaryData, existingConfigMap.BinaryData) + return !equality.Semantic.DeepEqual(configMap.GetLabels(), existingConfigMap.GetLabels()) || !equality.Semantic.DeepEqual(configMap.Data, existingConfigMap.Data) || !equality.Semantic.DeepEqual(configMap.BinaryData, existingConfigMap.BinaryData) || !equality.Semantic.DeepEqual(configMap.GetOwnerReferences(), existingConfigMap.GetOwnerReferences()) } // SanitizeObjectString takes a string, i.e. .metadata.namespace, and a K8s object From 8e044f98cd9e194e4cbe46b7409082a72675a59a Mon Sep 17 00:00:00 2001 From: YuChen Date: Mon, 27 Nov 2023 09:37:52 -0800 Subject: [PATCH 2/2] split the line to reduce its length Signed-off-by: YuChen --- controllers/util/util.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/controllers/util/util.go b/controllers/util/util.go index d4f94082..728e0f72 100644 --- a/controllers/util/util.go +++ b/controllers/util/util.go @@ -282,11 +282,18 @@ func EnsureLabelsForService(s *corev1.Service, labels map[string]string) { } func CompareSecret(secret *corev1.Secret, existingSecret *corev1.Secret) (needUpdate bool) { - return !equality.Semantic.DeepEqual(secret.GetLabels(), existingSecret.GetLabels()) || !equality.Semantic.DeepEqual(secret.Type, existingSecret.Type) || !equality.Semantic.DeepEqual(secret.Data, existingSecret.Data) || !equality.Semantic.DeepEqual(secret.StringData, existingSecret.StringData) || !equality.Semantic.DeepEqual(secret.GetOwnerReferences(), existingSecret.GetOwnerReferences()) + return !equality.Semantic.DeepEqual(secret.GetLabels(), existingSecret.GetLabels()) || + !equality.Semantic.DeepEqual(secret.Type, existingSecret.Type) || + !equality.Semantic.DeepEqual(secret.Data, existingSecret.Data) || + !equality.Semantic.DeepEqual(secret.StringData, existingSecret.StringData) || + !equality.Semantic.DeepEqual(secret.GetOwnerReferences(), existingSecret.GetOwnerReferences()) } func CompareConfigMap(configMap *corev1.ConfigMap, existingConfigMap *corev1.ConfigMap) (needUpdate bool) { - return !equality.Semantic.DeepEqual(configMap.GetLabels(), existingConfigMap.GetLabels()) || !equality.Semantic.DeepEqual(configMap.Data, existingConfigMap.Data) || !equality.Semantic.DeepEqual(configMap.BinaryData, existingConfigMap.BinaryData) || !equality.Semantic.DeepEqual(configMap.GetOwnerReferences(), existingConfigMap.GetOwnerReferences()) + return !equality.Semantic.DeepEqual(configMap.GetLabels(), existingConfigMap.GetLabels()) || + !equality.Semantic.DeepEqual(configMap.Data, existingConfigMap.Data) || + !equality.Semantic.DeepEqual(configMap.BinaryData, existingConfigMap.BinaryData) || + !equality.Semantic.DeepEqual(configMap.GetOwnerReferences(), existingConfigMap.GetOwnerReferences()) } // SanitizeObjectString takes a string, i.e. .metadata.namespace, and a K8s object