From bf27f0125d556394bd3e6d3df6ea8b2cc6e86e95 Mon Sep 17 00:00:00 2001 From: vbadrina Date: Wed, 4 Oct 2023 13:44:35 +0530 Subject: [PATCH] Fix issue with empty s3 profile config This commit fixes issue where s3 profile config is not updated in the Ramen config map. This is due to a race condition existing between MCO and Ramen where Ramen starts after MCO during upgrade at which point s3profile is updated and Ramen replaces this with newly created default config. This fix will ensure that any changes to Ramen configmap is watched and triggers reconcile for all secrets in the current namespace which should ensure that s3profile is properly updated regardless of the upgrade sequence. Signed-off-by: vbadrina --- controllers/mirrorpeersecret_controller.go | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/controllers/mirrorpeersecret_controller.go b/controllers/mirrorpeersecret_controller.go index 6593fddf..6b6429fd 100644 --- a/controllers/mirrorpeersecret_controller.go +++ b/controllers/mirrorpeersecret_controller.go @@ -21,13 +21,21 @@ import ( "github.com/red-hat-storage/odf-multicluster-orchestrator/controllers/utils" + ramendrv1alpha1 "github.com/ramendr/ramen/api/v1alpha1" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/selection" + "k8s.io/klog/v2" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/controller-runtime/pkg/source" + "sigs.k8s.io/yaml" ) // MirrorPeerSecretReconciler reconciles MirrorPeer CRs, @@ -97,5 +105,50 @@ func mirrorPeerSecretReconcile(ctx context.Context, rc client.Client, req ctrl.R func (r *MirrorPeerSecretReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&corev1.Secret{}, builder.WithPredicates(utils.SourceOrDestinationPredicate)). + Watches(&source.Kind{Type: &corev1.ConfigMap{}}, handler.EnqueueRequestsFromMapFunc(r.secretConfigMapFunc)). Complete(r) } + +func (r *MirrorPeerSecretReconciler) secretConfigMapFunc(obj client.Object) []reconcile.Request { + ConfigMapRamenConfigKeyName := "ramen_manager_config.yaml" + var cm *corev1.ConfigMap + cm, ok := obj.(*corev1.ConfigMap) + if !ok { + return []reconcile.Request{} + } + + if _, ok := cm.Data[ConfigMapRamenConfigKeyName]; !ok { + return []reconcile.Request{} + } + + ramenConfig := &ramendrv1alpha1.RamenConfig{} + err := yaml.Unmarshal([]byte(cm.Data[ConfigMapRamenConfigKeyName]), ramenConfig) + if err != nil { + return []reconcile.Request{} + } + + secrets := &corev1.SecretList{} + internalSecretLabel, err := labels.NewRequirement(utils.SecretLabelTypeKey, selection.Equals, []string{string(utils.InternalLabel)}) + if err != nil { + klog.Error(err, "cannot parse new requirement") + return []reconcile.Request{} + } + + internalSecretSelector := labels.NewSelector().Add(*internalSecretLabel) + listOpts := &client.ListOptions{ + Namespace: "", //All Namespaces + LabelSelector: internalSecretSelector, + } + + if err := r.Client.List(context.TODO(), secrets, listOpts); err != nil { + return []reconcile.Request{} + } + + requests := make([]reconcile.Request, len(secrets.Items)) + for i, secret := range secrets.Items { + requests[i].Name = secret.GetName() + requests[i].Namespace = secret.GetNamespace() + } + + return requests +}