@@ -45,21 +45,25 @@ type ResourceSyncer struct {
4545
4646 destDummy * unstructured.Unstructured
4747
48- mutator mutation.Mutator
48+ // cached mutators (for those transformers that are expensive to compile, like CEL)
49+ primaryMutator mutation.Mutator
50+ relatedMutators map [string ]mutation.Mutator
4951
5052 agentName string
5153
5254 // newObjectStateStore is used for testing purposes
5355 newObjectStateStore newObjectStateStoreFunc
5456}
5557
58+ type MutatorCreatorFunc func (* syncagentv1alpha1.ResourceMutationSpec ) (mutation.Mutator , error )
59+
5660func NewResourceSyncer (
5761 log * zap.SugaredLogger ,
5862 localClient ctrlruntimeclient.Client ,
5963 remoteClient ctrlruntimeclient.Client ,
6064 pubRes * syncagentv1alpha1.PublishedResource ,
6165 localCRD * apiextensionsv1.CustomResourceDefinition ,
62- mutator mutation. Mutator ,
66+ mutatorCreator MutatorCreatorFunc ,
6367 stateNamespace string ,
6468 agentName string ,
6569) (* ResourceSyncer , error ) {
@@ -94,6 +98,21 @@ func NewResourceSyncer(
9498 }
9599 }
96100
101+ primaryMutator , err := mutatorCreator (pubRes .Spec .Mutation )
102+ if err != nil {
103+ return nil , fmt .Errorf ("failed to create primary object mutator: %w" , err )
104+ }
105+
106+ relatedMutators := map [string ]mutation.Mutator {}
107+ for _ , rr := range pubRes .Spec .Related {
108+ mutator , err := mutatorCreator (rr .Mutation )
109+ if err != nil {
110+ return nil , fmt .Errorf ("failed to create related object %q mutator: %w" , rr .Identifier , err )
111+ }
112+
113+ relatedMutators [rr .Identifier ] = mutator
114+ }
115+
97116 return & ResourceSyncer {
98117 log : log .With ("local-gvk" , localGVK , "remote-gvk" , remoteGVK ),
99118 localClient : localClient ,
@@ -102,7 +121,8 @@ func NewResourceSyncer(
102121 localCRD : localCRD ,
103122 subresources : subresources ,
104123 destDummy : localDummy ,
105- mutator : mutator ,
124+ primaryMutator : primaryMutator ,
125+ relatedMutators : relatedMutators ,
106126 agentName : agentName ,
107127 newObjectStateStore : newKubernetesStateStoreCreator (stateNamespace ),
108128 }, nil
@@ -162,7 +182,7 @@ func (s *ResourceSyncer) Process(ctx Context, remoteObj *unstructured.Unstructur
162182 // in kcp is deleted
163183 blockSourceDeletion : true ,
164184 // use the configured mutations from the PublishedResource
165- mutator : s .mutator ,
185+ mutator : s .primaryMutator ,
166186 // make sure the syncer can remember the current state of any object
167187 stateStore : stateStore ,
168188 // For the main resource, we need to store metadata on the destination copy
0 commit comments