@@ -118,7 +118,7 @@ func (r *DRPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
118
118
119
119
log .Info ("create/update" )
120
120
121
- reason , err := validateDRPolicy (ctx , drpolicy , drclusters , r . APIReader , drClusterIDsToNames )
121
+ reason , err := validateDRPolicy (drpolicy , drclusters )
122
122
if err != nil {
123
123
statusErr := u .validatedSetFalse (reason , err )
124
124
if ! errors .Is (statusErr , err ) || reason != ReasonDRClusterNotFound {
@@ -135,15 +135,7 @@ func (r *DRPolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
135
135
return ctrl.Result {}, fmt .Errorf ("finalizer add update: %w" , u .validatedSetFalse ("FinalizerAddFailed" , err ))
136
136
}
137
137
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 )
147
139
}
148
140
149
141
//nolint:unparam
@@ -152,6 +144,7 @@ func (r *DRPolicyReconciler) reconcile(
152
144
drclusters * ramen.DRClusterList ,
153
145
secretsUtil * util.SecretsUtil ,
154
146
ramenConfig * ramen.RamenConfig ,
147
+ drClusterIDsToNames map [string ]string ,
155
148
) (ctrl.Result , error ) {
156
149
if err := propagateS3Secret (u .object , drclusters , secretsUtil , ramenConfig , u .log ); err != nil {
157
150
return ctrl.Result {}, fmt .Errorf ("drpolicy deploy: %w" , err )
@@ -161,6 +154,21 @@ func (r *DRPolicyReconciler) reconcile(
161
154
return ctrl.Result {}, fmt .Errorf ("drpolicy peerClass update: %w" , err )
162
155
}
163
156
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
+
164
172
return ctrl.Result {}, nil
165
173
}
166
174
@@ -202,18 +210,9 @@ func (r *DRPolicyReconciler) getDRClusterDetails(ctx context.Context) (*ramen.DR
202
210
return drClusters , drClusterIDsToNames , nil
203
211
}
204
212
205
- func validateDRPolicy (ctx context.Context ,
206
- drpolicy * ramen.DRPolicy ,
213
+ func validateDRPolicy (drpolicy * ramen.DRPolicy ,
207
214
drclusters * ramen.DRClusterList ,
208
- apiReader client.Reader ,
209
- drClusterIDsToNames map [string ]string ,
210
215
) (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
-
217
216
// TODO: Ensure DRClusters exist and are validated? Also ensure they are not in a deleted state!?
218
217
// If new DRPolicy and clusters are deleted, then fail reconciliation?
219
218
if len (drpolicy .Spec .DRClusters ) == 0 {
@@ -225,11 +224,6 @@ func validateDRPolicy(ctx context.Context,
225
224
return reason , err
226
225
}
227
226
228
- err = validatePolicyConflicts (ctx , apiReader , drpolicy , drclusters , drClusterIDsToNames )
229
- if err != nil {
230
- return ReasonValidationFailed , err
231
- }
232
-
233
227
return "" , nil
234
228
}
235
229
@@ -290,6 +284,11 @@ func validatePolicyConflicts(ctx context.Context,
290
284
return fmt .Errorf ("validate managed cluster in drpolicy %v failed: %w" , drpolicy .Name , err )
291
285
}
292
286
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
+
293
292
err = hasConflictingDRPolicy (drpolicy , drclusters , drpolicies , drClusterIDsToNames )
294
293
if err != nil {
295
294
return fmt .Errorf ("validate managed cluster in drpolicy failed: %w" , err )
@@ -327,7 +326,7 @@ func hasConflictingDRPolicy(
327
326
328
327
// None of the common managed clusters should belong to Metro clusters in either of the drpolicies.
329
328
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 )
331
330
}
332
331
}
333
332
0 commit comments