@@ -565,40 +565,36 @@ func GetDRClusters(ctx context.Context, client client.Client, drPolicy *rmn.DRPo
565
565
}
566
566
567
567
// updateObjectMetadata updates drpc labels, annotations and finalizer, and also updates placementObj finalizer
568
- func (r DRPlacementControlReconciler ) updateObjectMetadata (ctx context.Context ,
569
- drpc * rmn.DRPlacementControl , placementObj client.Object , log logr.Logger ,
570
- ) error {
571
- var update bool
568
+ func (r DRPlacementControlReconciler ) updateObjectMetadata (
569
+ drpc * rmn.DRPlacementControl , placementObj client.Object ,
570
+ ) (drpcModified bool , placementModified bool , err error ) {
571
+ // Explicit initialization
572
+ drpcModified = false
573
+ placementModified = false
574
+
575
+ if rmnutil .AddLabel (drpc , rmnutil .OCMBackupLabelKey , rmnutil .OCMBackupLabelValue ) {
576
+ drpcModified = true
577
+ }
572
578
573
- update = rmnutil .AddLabel (drpc , rmnutil .OCMBackupLabelKey , rmnutil .OCMBackupLabelValue )
574
- update = rmnutil .AddFinalizer (drpc , DRPCFinalizer ) || update
579
+ added := rmnutil .AddFinalizer (drpc , DRPCFinalizer )
580
+ if added {
581
+ drpcModified = true
582
+ }
575
583
576
584
vrgNamespace , err := selectVRGNamespace (r .Client , r .Log , drpc , placementObj )
577
585
if err != nil {
578
- return err
586
+ return drpcModified , placementModified , err
579
587
}
580
588
581
- update = rmnutil .AddAnnotation (drpc , DRPCAppNamespace , vrgNamespace ) || update
582
-
583
- if update {
584
- if err := r .Update (ctx , drpc ); err != nil {
585
- log .Error (err , "Failed to add annotations, labels, or finalizer to drpc" )
586
-
587
- return fmt .Errorf ("%w" , err )
588
- }
589
+ if rmnutil .AddAnnotation (drpc , DRPCAppNamespace , vrgNamespace ) {
590
+ drpcModified = true
589
591
}
590
592
591
- // add finalizer to User PlacementRule/Placement
592
- finalizerAdded := rmnutil .AddFinalizer (placementObj , DRPCFinalizer )
593
- if finalizerAdded {
594
- if err := r .Update (ctx , placementObj ); err != nil {
595
- log .Error (err , "Failed to add finalizer to user placement rule" )
596
-
597
- return fmt .Errorf ("%w" , err )
598
- }
593
+ if rmnutil .AddFinalizer (placementObj , DRPCFinalizer ) {
594
+ placementModified = true
599
595
}
600
596
601
- return nil
597
+ return drpcModified , placementModified , nil
602
598
}
603
599
604
600
func (r * DRPlacementControlReconciler ) processDeletion (ctx context.Context ,
@@ -854,15 +850,76 @@ func (r *DRPlacementControlReconciler) updateAndSetOwner(
854
850
usrPlacement client.Object ,
855
851
log logr.Logger ,
856
852
) (bool , error ) {
857
- if err := r .annotateObject (ctx , drpc , usrPlacement , log ); err != nil {
853
+ var (
854
+ err error
855
+ updated bool
856
+ placementModified bool
857
+ placementAnnotateModified bool
858
+ placementMetadataModified bool
859
+ )
860
+
861
+ // Annotate the placement object
862
+ if placementAnnotateModified , err = r .annotateObject (drpc , usrPlacement , log ); err != nil {
858
863
return false , err
859
864
}
860
865
861
- if err := r .updateObjectMetadata (ctx , drpc , usrPlacement , log ); err != nil {
866
+ // Update object metadata
867
+ if _ , placementMetadataModified , err = r .updateObjectMetadata (drpc , usrPlacement ); err != nil {
862
868
return false , err
863
869
}
864
870
865
- return r .setDRPCOwner (ctx , drpc , usrPlacement , log )
871
+ // Merge both modifications
872
+ placementModified = placementAnnotateModified || placementMetadataModified
873
+
874
+ // Set DRPC Owner
875
+ updated , err = r .setDRPCOwner (drpc , usrPlacement , log )
876
+ if err != nil {
877
+ return false , err
878
+ }
879
+
880
+ if placementModified {
881
+ if err = r .updatePlacement (ctx , usrPlacement , log ); err != nil {
882
+ return false , err
883
+ }
884
+ }
885
+
886
+ if err = r .updateDRPC (ctx , drpc , log ); err != nil {
887
+ return false , err
888
+ }
889
+
890
+ return updated , nil
891
+ }
892
+
893
+ func (r * DRPlacementControlReconciler ) updatePlacement (
894
+ ctx context.Context ,
895
+ owner client.Object ,
896
+ log logr.Logger ,
897
+ ) error {
898
+ if err := r .Update (ctx , owner ); err != nil {
899
+ log .Error (err , "Failed to update Placement object" )
900
+
901
+ return fmt .Errorf ("failed to update placement %s: %w" , owner .GetName (), err )
902
+ }
903
+
904
+ log .Info ("Successfully updated Placement resource" , "placement" , owner .GetName ())
905
+
906
+ return nil
907
+ }
908
+
909
+ func (r * DRPlacementControlReconciler ) updateDRPC (
910
+ ctx context.Context ,
911
+ drpc * rmn.DRPlacementControl ,
912
+ log logr.Logger ,
913
+ ) error {
914
+ if err := r .Update (ctx , drpc ); err != nil {
915
+ log .Error (err , "Failed to update DRPC" )
916
+
917
+ return fmt .Errorf ("failed to update DRPC %s: %w" , drpc .GetName (), err )
918
+ }
919
+
920
+ log .Info ("Successfully updated DRPC resource" , "drpc" , drpc .GetName ())
921
+
922
+ return nil
866
923
}
867
924
868
925
func getPlacementOrPlacementRule (
@@ -984,11 +1041,13 @@ func getPlacement(ctx context.Context, k8sclient client.Client,
984
1041
return usrPlmnt , nil
985
1042
}
986
1043
987
- func (r * DRPlacementControlReconciler ) annotateObject (ctx context.Context ,
988
- drpc * rmn.DRPlacementControl , obj client.Object , log logr.Logger ,
989
- ) error {
1044
+ func (r * DRPlacementControlReconciler ) annotateObject (
1045
+ drpc * rmn.DRPlacementControl ,
1046
+ obj client.Object ,
1047
+ log logr.Logger ,
1048
+ ) (bool , error ) {
990
1049
if rmnutil .ResourceIsDeleted (obj ) {
991
- return nil
1050
+ return false , nil
992
1051
}
993
1052
994
1053
if obj .GetAnnotations () == nil {
@@ -1002,29 +1061,21 @@ func (r *DRPlacementControlReconciler) annotateObject(ctx context.Context,
1002
1061
obj .GetAnnotations ()[DRPCNameAnnotation ] = drpc .Name
1003
1062
obj .GetAnnotations ()[DRPCNamespaceAnnotation ] = drpc .Namespace
1004
1063
1005
- err := r .Update (ctx , obj )
1006
- if err != nil {
1007
- log .Error (err , "Failed to update Object annotation" , "objName" , obj .GetName ())
1008
-
1009
- return fmt .Errorf ("failed to update Object %s annotation '%s/%s' (%w)" ,
1010
- obj .GetName (), DRPCNameAnnotation , drpc .Name , err )
1011
- }
1012
-
1013
- return nil
1064
+ return true , nil
1014
1065
}
1015
1066
1016
1067
if ownerName != drpc .Name || ownerNamespace != drpc .Namespace {
1017
1068
log .Info ("Object not owned by this DRPC" , "objName" , obj .GetName ())
1018
1069
1019
- return fmt .Errorf ("object %s not owned by this DRPC '%s/%s'" ,
1070
+ return false , fmt .Errorf ("object %s not owned by this DRPC '%s/%s'" ,
1020
1071
obj .GetName (), drpc .Name , drpc .Namespace )
1021
1072
}
1022
1073
1023
- return nil
1074
+ return false , nil
1024
1075
}
1025
1076
1026
1077
func (r * DRPlacementControlReconciler ) setDRPCOwner (
1027
- ctx context. Context , drpc * rmn.DRPlacementControl , owner client.Object , log logr.Logger ,
1078
+ drpc * rmn.DRPlacementControl , owner client.Object , log logr.Logger ,
1028
1079
) (bool , error ) {
1029
1080
const updated = true
1030
1081
@@ -1039,11 +1090,6 @@ func (r *DRPlacementControlReconciler) setDRPCOwner(
1039
1090
return ! updated , fmt .Errorf ("failed to set DRPC owner %w" , err )
1040
1091
}
1041
1092
1042
- err = r .Update (ctx , drpc )
1043
- if err != nil {
1044
- return ! updated , fmt .Errorf ("failed to update drpc %s (%w)" , drpc .GetName (), err )
1045
- }
1046
-
1047
1093
log .Info (fmt .Sprintf ("Object %s owns DRPC %s" , owner .GetName (), drpc .GetName ()))
1048
1094
1049
1095
return updated , nil
0 commit comments