@@ -1847,10 +1847,11 @@ func (v *VRGInstance) updateVRGConditions() {
1847
1847
v .log .Info (msg , "finalCondition" , finalCondition )
1848
1848
}
1849
1849
1850
- var volSyncDataReady , volSyncDataProtected , volSyncClusterDataProtected * metav1.Condition
1850
+ var volSyncDataReady , volSyncDataProtected , volSyncClusterDataProtected , volSyncClusterDataConflict * metav1.Condition
1851
1851
if v .instance .Spec .Sync == nil {
1852
1852
volSyncDataReady = v .aggregateVolSyncDataReadyCondition ()
1853
1853
volSyncDataProtected , volSyncClusterDataProtected = v .aggregateVolSyncDataProtectedConditions ()
1854
+ volSyncClusterDataConflict = v .aggregateVolSyncClusterDataConflictCondition ()
1854
1855
}
1855
1856
1856
1857
logAndSet (VRGConditionTypeDataReady ,
@@ -1869,6 +1870,7 @@ func (v *VRGInstance) updateVRGConditions() {
1869
1870
v .kubeObjectsProtected ,
1870
1871
)
1871
1872
logAndSet (VRGConditionTypeNoClusterDataConflict ,
1873
+ volSyncClusterDataConflict ,
1872
1874
v .aggregateVRGNoClusterDataConflictCondition (),
1873
1875
)
1874
1876
v .updateVRGLastGroupSyncTime ()
@@ -2263,6 +2265,60 @@ func (v *VRGInstance) CheckForVMNameConflictOnSecondary(vmNamespaceList, vmList
2263
2265
}
2264
2266
2265
2267
func (v * VRGInstance ) aggregateVRGNoClusterDataConflictCondition () * metav1.Condition {
2268
+ var vmResourceConflict , pvcResourceConflict bool
2269
+ vmResourceConflict = false
2270
+ pvcResourceConflict = false
2271
+
2272
+ vmConflictCondition := v .aggregateVMNoClusterDataConflictCondition ()
2273
+
2274
+ if vmConflictCondition != nil {
2275
+ if vmConflictCondition .Status == metav1 .ConditionFalse {
2276
+ vmResourceConflict = true
2277
+ }
2278
+ }
2279
+
2280
+ pvcConflictCondition := v .aggregateVolRepClusterDataConflictCondition ()
2281
+
2282
+ if pvcConflictCondition != nil {
2283
+ if vmConflictCondition .Status == metav1 .ConditionFalse {
2284
+ pvcResourceConflict = true
2285
+ }
2286
+ }
2287
+
2288
+ if ! vmResourceConflict && ! pvcResourceConflict {
2289
+ return vmConflictCondition
2290
+ }
2291
+
2292
+ // Priortize the resource conflict condition on Primary cluster
2293
+ if vmResourceConflict && pvcResourceConflict {
2294
+ return v .PriortizePrimaryClusterDataConflictCondition (vmConflictCondition , pvcConflictCondition )
2295
+ }
2296
+
2297
+ if vmResourceConflict {
2298
+ return vmConflictCondition
2299
+ }
2300
+
2301
+ return pvcConflictCondition
2302
+ }
2303
+
2304
+ func (v * VRGInstance ) PriortizePrimaryClusterDataConflictCondition (
2305
+ vmConflictCondition , pvcConflictCondition * metav1.Condition ,
2306
+ ) * metav1.Condition {
2307
+ if vmConflictCondition .Reason == pvcConflictCondition .Reason {
2308
+ vmConflictCondition .Message = fmt .Sprintf ("Both VM and PVC resource conflicting on %s cluster" ,
2309
+ v .instance .Spec .ReplicationState )
2310
+
2311
+ return vmConflictCondition
2312
+ }
2313
+
2314
+ if vmConflictCondition .Reason == VRGConditionReasonClusterDataConflictPrimary {
2315
+ return vmConflictCondition
2316
+ }
2317
+
2318
+ return pvcConflictCondition
2319
+ }
2320
+
2321
+ func (v * VRGInstance ) aggregateVMNoClusterDataConflictCondition () * metav1.Condition {
2266
2322
var msg string
2267
2323
2268
2324
if v .isVMRecipeProtection () {
@@ -2282,11 +2338,11 @@ func (v *VRGInstance) aggregateVRGNoClusterDataConflictCondition() *metav1.Condi
2282
2338
func (v * VRGInstance ) clusterDataConflict (msg string , status metav1.ConditionStatus ) * metav1.Condition {
2283
2339
if v .instance .Spec .ReplicationState == ramendrv1alpha1 .Primary {
2284
2340
return updateVRGNoClusterDataConflictCondition (
2285
- v .instance .Status .ObservedGeneration , status , VRGConditionReasonDataConflictPrimary ,
2341
+ v .instance .Status .ObservedGeneration , status , VRGConditionReasonClusterDataConflictPrimary ,
2286
2342
msg )
2287
2343
} else if v .instance .Spec .ReplicationState == ramendrv1alpha1 .Secondary {
2288
2344
return updateVRGNoClusterDataConflictCondition (
2289
- v .instance .Status .ObservedGeneration , status , VRGConditionReasonDataConflictSecondary ,
2345
+ v .instance .Status .ObservedGeneration , status , VRGConditionReasonClusterDataConflictSecondary ,
2290
2346
msg )
2291
2347
}
2292
2348
@@ -2302,3 +2358,51 @@ func (v *VRGInstance) isVMRecipeProtection() bool {
2302
2358
2303
2359
return false
2304
2360
}
2361
+
2362
+ func (v * VRGInstance ) aggregateVolRepClusterDataConflictCondition () * metav1.Condition {
2363
+ noClusterDataConflictCondition := & metav1.Condition {
2364
+ Status : metav1 .ConditionTrue ,
2365
+ Type : VRGConditionTypeNoClusterDataConflict ,
2366
+ Reason : VRGConditionReasonConflictResolved ,
2367
+ ObservedGeneration : v .instance .Generation ,
2368
+ Message : "No PVC conflict detected for VolumeReplication scheme" ,
2369
+ }
2370
+
2371
+ if conflictCondition := v .validateSecondaryPVCConflictForVolRep (); conflictCondition != nil {
2372
+ return conflictCondition
2373
+ }
2374
+
2375
+ return noClusterDataConflictCondition
2376
+ }
2377
+
2378
+ func (v * VRGInstance ) IsSecondaryVRG () bool {
2379
+ spec := v .instance .Spec
2380
+ status := v .instance .Status
2381
+
2382
+ isSecondary := spec .ReplicationState == ramendrv1alpha1 .Secondary
2383
+ isStateSecondary := status .State == ramendrv1alpha1 .SecondaryState
2384
+ isRelocateOrNone := spec .Action == ramendrv1alpha1 .VRGActionRelocate || spec .Action == ""
2385
+ isPrepareForFinalSyncFalse := ! spec .PrepareForFinalSync
2386
+ isRunFinalSyncFalse := ! spec .RunFinalSync
2387
+
2388
+ return isSecondary &&
2389
+ isStateSecondary &&
2390
+ isRelocateOrNone &&
2391
+ isPrepareForFinalSyncFalse &&
2392
+ isRunFinalSyncFalse
2393
+ }
2394
+
2395
+ func (v * VRGInstance ) isSecondaryWithVolRepProtectedPVCs () bool {
2396
+ return v .IsSecondaryVRG () && len (v .volRepPVCs ) > 0
2397
+ }
2398
+
2399
+ func (v * VRGInstance ) validateSecondaryPVCConflictForVolRep () * metav1.Condition {
2400
+ if v .isSecondaryWithVolRepProtectedPVCs () {
2401
+ return updateVRGNoClusterDataConflictCondition (
2402
+ v .instance .Generation , metav1 .ConditionFalse , VRGConditionReasonClusterDataConflictSecondary ,
2403
+ "No PVC on the secondary should match the label selector" ,
2404
+ )
2405
+ }
2406
+
2407
+ return nil
2408
+ }
0 commit comments