@@ -820,17 +820,25 @@ func (a *Operator) copyToNamespace(prototype *v1alpha1.ClusterServiceVersion, ns
820
820
if _ , err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).UpdateStatus (context .TODO (), created , metav1.UpdateOptions {}); err != nil {
821
821
return nil , fmt .Errorf ("failed to update status on new CSV: %w" , err )
822
822
}
823
- prototype .Annotations [statusCopyHashAnnotation ] = status
824
- if _ , err = a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), prototype , metav1.UpdateOptions {}); err != nil {
825
- return nil , fmt .Errorf ("failed to update annotations after updating status: %w" , err )
826
- }
827
- return & v1alpha1.ClusterServiceVersion {
828
- ObjectMeta : metav1.ObjectMeta {
829
- Name : created .Name ,
830
- Namespace : created .Namespace ,
831
- UID : created .UID ,
832
- },
833
- }, nil
823
+ prototype .Annotations [statusCopyHashAnnotation ] = status
824
+ // persist status-hash annotation
825
+ updatedCreated , err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), prototype , metav1.UpdateOptions {})
826
+ if err != nil {
827
+ return nil , fmt .Errorf ("failed to update annotations after updating status: %w" , err )
828
+ }
829
+ // record observed generation and resourceVersion for metadata-drift guard
830
+ updatedCreated .Annotations [observedGenerationAnnotation ] = fmt .Sprint (updatedCreated .GetGeneration ())
831
+ updatedCreated .Annotations [observedResourceVersionAnnotation ] = updatedCreated .ResourceVersion
832
+ if _ , err := a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), updatedCreated , metav1.UpdateOptions {}); err != nil {
833
+ return nil , fmt .Errorf ("failed to update metadata guard annotations after creation: %w" , err )
834
+ }
835
+ return & v1alpha1.ClusterServiceVersion {
836
+ ObjectMeta : metav1.ObjectMeta {
837
+ Name : updatedCreated .Name ,
838
+ Namespace : updatedCreated .Namespace ,
839
+ UID : updatedCreated .UID ,
840
+ },
841
+ }, nil
834
842
} else if err != nil {
835
843
return nil , err
836
844
}
@@ -896,11 +904,18 @@ func (a *Operator) copyToNamespace(prototype *v1alpha1.ClusterServiceVersion, ns
896
904
}
897
905
// Update the status first if the existing copied CSV status hash doesn't match what we expect
898
906
// to prevent a scenario where the hash annotations match but the contents do not.
899
- // We also need to update the CSV itself in this case to ensure we set the status hash annotation.
900
- prototype .Annotations [statusCopyHashAnnotation ] = status
901
- if updated , err = a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), prototype , metav1.UpdateOptions {}); err != nil {
902
- return nil , fmt .Errorf ("failed to update: %w" , err )
903
- }
907
+ // persist status-hash annotation
908
+ prototype .Annotations [statusCopyHashAnnotation ] = status
909
+ updated , err = a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), prototype , metav1.UpdateOptions {})
910
+ if err != nil {
911
+ return nil , fmt .Errorf ("failed to update: %w" , err )
912
+ }
913
+ // record observed generation and resourceVersion for metadata-drift guard
914
+ updated .Annotations [observedGenerationAnnotation ] = fmt .Sprint (updated .GetGeneration ())
915
+ updated .Annotations [observedResourceVersionAnnotation ] = updated .ResourceVersion
916
+ if updated , err = a .client .OperatorsV1alpha1 ().ClusterServiceVersions (nsTo ).Update (context .TODO (), updated , metav1.UpdateOptions {}); err != nil {
917
+ return nil , fmt .Errorf ("failed to update metadata guard annotations after status update: %w" , err )
918
+ }
904
919
} else {
905
920
// Even if they're the same, ensure the returned prototype is annotated.
906
921
prototype .Annotations [statusCopyHashAnnotation ] = status
0 commit comments