Skip to content

Commit 2754fee

Browse files
committed
move validatePolicyConflicts()
move validatePolicyConflicts() after updating drpolicy.PeerClasses Signed-off-by: rakeshgm <[email protected]>
1 parent 1350e76 commit 2754fee

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

internal/controller/drpolicy_controller.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func (r *DRPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
118118

119119
log.Info("create/update")
120120

121-
reason, err := validateDRPolicy(ctx, drpolicy, drclusters, r.APIReader, drClusterIDsToNames)
121+
reason, err := validateDRPolicy(drpolicy, drclusters)
122122
if err != nil {
123123
statusErr := u.validatedSetFalse(reason, err)
124124
if !errors.Is(statusErr, err) || reason != ReasonDRClusterNotFound {
@@ -135,15 +135,7 @@ func (r *DRPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
135135
return ctrl.Result{}, fmt.Errorf("finalizer add update: %w", u.validatedSetFalse("FinalizerAddFailed", err))
136136
}
137137

138-
if err := u.validatedSetTrue("Succeeded", "drpolicy validated"); err != nil {
139-
return ctrl.Result{}, fmt.Errorf("unable to set drpolicy validation: %w", err)
140-
}
141-
142-
if err := r.initiateDRPolicyMetrics(drpolicy, drclusters); err != nil {
143-
return ctrl.Result{}, fmt.Errorf("error in intiating policy metrics: %w", err)
144-
}
145-
146-
return r.reconcile(u, drclusters, secretsUtil, ramenConfig)
138+
return r.reconcile(u, drclusters, secretsUtil, ramenConfig, drClusterIDsToNames)
147139
}
148140

149141
//nolint:unparam
@@ -152,6 +144,7 @@ func (r *DRPolicyReconciler) reconcile(
152144
drclusters *ramen.DRClusterList,
153145
secretsUtil *util.SecretsUtil,
154146
ramenConfig *ramen.RamenConfig,
147+
drClusterIDsToNames map[string]string,
155148
) (ctrl.Result, error) {
156149
if err := propagateS3Secret(u.object, drclusters, secretsUtil, ramenConfig, u.log); err != nil {
157150
return ctrl.Result{}, fmt.Errorf("drpolicy deploy: %w", err)
@@ -161,6 +154,21 @@ func (r *DRPolicyReconciler) reconcile(
161154
return ctrl.Result{}, fmt.Errorf("drpolicy peerClass update: %w", err)
162155
}
163156

157+
// we will be able to validate conflicts only after PeerClasses are updated
158+
err := validatePolicyConflicts(u.ctx, r.APIReader, u.object, drclusters, drClusterIDsToNames)
159+
if err != nil {
160+
return ctrl.Result{}, fmt.Errorf("drpolicy conflict validate: %w",
161+
u.validatedSetFalse("DRPolicyConflictFound", err))
162+
}
163+
164+
if err := u.validatedSetTrue("Succeeded", "drpolicy validated"); err != nil {
165+
return ctrl.Result{}, fmt.Errorf("unable to set drpolicy validation: %w", err)
166+
}
167+
168+
if err := r.initiateDRPolicyMetrics(u.object, drclusters); err != nil {
169+
return ctrl.Result{}, fmt.Errorf("error in intiating policy metrics: %w", err)
170+
}
171+
164172
return ctrl.Result{}, nil
165173
}
166174

@@ -202,18 +210,9 @@ func (r *DRPolicyReconciler) getDRClusterDetails(ctx context.Context) (*ramen.DR
202210
return drClusters, drClusterIDsToNames, nil
203211
}
204212

205-
func validateDRPolicy(ctx context.Context,
206-
drpolicy *ramen.DRPolicy,
213+
func validateDRPolicy(drpolicy *ramen.DRPolicy,
207214
drclusters *ramen.DRClusterList,
208-
apiReader client.Reader,
209-
drClusterIDsToNames map[string]string,
210215
) (string, error) {
211-
// DRPolicy does not support both Sync and Async configurations in one single DRPolicy
212-
if len(drpolicy.Status.Sync.PeerClasses) > 0 && len(drpolicy.Status.Async.PeerClasses) > 0 {
213-
return ReasonValidationFailed,
214-
fmt.Errorf("invalid DRPolicy: DRPolicy cannot contain both Sync and Async Configurations")
215-
}
216-
217216
// TODO: Ensure DRClusters exist and are validated? Also ensure they are not in a deleted state!?
218217
// If new DRPolicy and clusters are deleted, then fail reconciliation?
219218
if len(drpolicy.Spec.DRClusters) == 0 {
@@ -225,11 +224,6 @@ func validateDRPolicy(ctx context.Context,
225224
return reason, err
226225
}
227226

228-
err = validatePolicyConflicts(ctx, apiReader, drpolicy, drclusters, drClusterIDsToNames)
229-
if err != nil {
230-
return ReasonValidationFailed, err
231-
}
232-
233227
return "", nil
234228
}
235229

@@ -290,6 +284,11 @@ func validatePolicyConflicts(ctx context.Context,
290284
return fmt.Errorf("validate managed cluster in drpolicy %v failed: %w", drpolicy.Name, err)
291285
}
292286

287+
// DRPolicy does not support both Sync and Async configurations in one single DRPolicy
288+
if len(drpolicy.Status.Sync.PeerClasses) > 0 && len(drpolicy.Status.Async.PeerClasses) > 0 {
289+
return fmt.Errorf("invalid DRPolicy: a policy cannot contain both sync and async configurations")
290+
}
291+
293292
err = hasConflictingDRPolicy(drpolicy, drclusters, drpolicies, drClusterIDsToNames)
294293
if err != nil {
295294
return fmt.Errorf("validate managed cluster in drpolicy failed: %w", err)
@@ -327,7 +326,7 @@ func hasConflictingDRPolicy(
327326

328327
// None of the common managed clusters should belong to Metro clusters in either of the drpolicies.
329328
if haveOverlappingMetroZones(match, drp, drclusters, drClusterIDsToNames) {
330-
return fmt.Errorf("drpolicy: %v has overlapping metro region with another drpolicy %v", match.Name, drp.Name)
329+
return fmt.Errorf("drpolicy: %v has overlapping clusters with another drpolicy %v", match.Name, drp.Name)
331330
}
332331
}
333332

0 commit comments

Comments
 (0)