Skip to content

Commit aa7f512

Browse files
Merge pull request #75 from openshift-cherrypick-robot/cherry-pick-74-to-release-4.10
Bug 2054131: [release-4.10] Add hub recovery labels to mirrorpeer
2 parents 7525c6b + e82d171 commit aa7f512

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

controllers/mirrorpeer_controller.go

+26
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ type MirrorPeerReconciler struct {
4444
Scheme *runtime.Scheme
4545
}
4646

47+
const hubRecoveryLabel = "cluster.open-cluster-management.io/backup"
48+
4749
//+kubebuilder:rbac:groups=multicluster.odf.openshift.io,resources=mirrorpeers,verbs=get;list;watch;create;update;patch;delete
4850
//+kubebuilder:rbac:groups=multicluster.odf.openshift.io,resources=mirrorpeers/status,verbs=get;update;patch
4951
//+kubebuilder:rbac:groups=multicluster.odf.openshift.io,resources=mirrorpeers/finalizers,verbs=update
@@ -106,6 +108,30 @@ func (r *MirrorPeerReconciler) Reconcile(ctx context.Context, req ctrl.Request)
106108
}
107109
logger.V(2).Info("All validations for MirrorPeer passed", "MirrorPeer", req.NamespacedName)
108110

111+
mirrorPeerCopy := mirrorPeer.DeepCopy()
112+
if mirrorPeerCopy.Labels == nil {
113+
mirrorPeerCopy.Labels = make(map[string]string)
114+
}
115+
116+
if val, ok := mirrorPeerCopy.Labels[hubRecoveryLabel]; !ok || val != "resource" {
117+
logger.Info("Adding label to mirrorpeer for disaster recovery")
118+
mirrorPeerCopy.Labels[hubRecoveryLabel] = "resource"
119+
err = r.Client.Update(ctx, mirrorPeerCopy)
120+
121+
if k8serrors.IsConflict(err) {
122+
logger.Info("MirrorPeer is being updated by another process. Retrying", "MirrorPeer", mirrorPeerCopy.Name)
123+
return ctrl.Result{Requeue: true}, nil
124+
} else if k8serrors.IsNotFound(err) {
125+
logger.Info("MirrorPeer no longer exists. Ignoring since object must have been deleted", "MirrorPeer", mirrorPeerCopy.Name)
126+
return ctrl.Result{}, nil
127+
} else if err != nil {
128+
logger.Info("Warning: Failed to update mirrorpeer", "MirrorPeer", mirrorPeerCopy.Name, "Error", err)
129+
} else {
130+
logger.Info("Successfully added label to mirrorpeer for disaster recovery", "MirrorPeer", mirrorPeerCopy.Name)
131+
return ctrl.Result{Requeue: true}, nil
132+
}
133+
}
134+
109135
if mirrorPeer.Status.Phase == "" {
110136
mirrorPeer.Status.Phase = multiclusterv1alpha1.ExchangingSecret
111137
statusErr := r.Client.Status().Update(ctx, &mirrorPeer)

controllers/mirrorpeer_controller_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
//go:build unit
12
// +build unit
23

34
/*
@@ -92,4 +93,14 @@ func TestMirrorPeerReconcilerReconcile(t *testing.T) {
9293
if err != nil {
9394
t.Errorf("MirrorPeerReconciler Reconcile() failed. Error: %s", err)
9495
}
96+
97+
var mp multiclusterv1alpha1.MirrorPeer
98+
err = r.Get(ctx, req.NamespacedName, &mp)
99+
if err != nil {
100+
t.Errorf("Failed to get MirrorPeer. Error: %s", err)
101+
}
102+
103+
if val, ok := mp.Labels[hubRecoveryLabel]; !ok || val != "resource" {
104+
t.Errorf("MirrorPeer.Labels[%s] is not set correctly. Expected: %s, Actual: %s", hubRecoveryLabel, "resource", val)
105+
}
95106
}

0 commit comments

Comments
 (0)