@@ -34,9 +34,6 @@ type Updater struct {
34
34
}
35
35
36
36
func (s * Updater ) update (oldObject , newObject typed.TypedValue , version fieldpath.APIVersion , managers fieldpath.ManagedFields , workflow string , force bool ) (fieldpath.ManagedFields , error ) {
37
- if managers == nil {
38
- managers = fieldpath.ManagedFields {}
39
- }
40
37
conflicts := fieldpath.ManagedFields {}
41
38
removed := fieldpath.ManagedFields {}
42
39
type Versioned struct {
@@ -124,6 +121,7 @@ func (s *Updater) update(oldObject, newObject typed.TypedValue, version fieldpat
124
121
// this is a CREATE call).
125
122
func (s * Updater ) Update (liveObject , newObject typed.TypedValue , version fieldpath.APIVersion , managers fieldpath.ManagedFields , manager string ) (fieldpath.ManagedFields , error ) {
126
123
var err error
124
+ managers = shallowCopyManagers (managers )
127
125
managers , err = s .update (liveObject , newObject , version , managers , manager , true )
128
126
if err != nil {
129
127
return fieldpath.ManagedFields {}, err
@@ -149,36 +147,41 @@ func (s *Updater) Update(liveObject, newObject typed.TypedValue, version fieldpa
149
147
// well as the configuration that is applied. This will merge the object
150
148
// and return it.
151
149
func (s * Updater ) Apply (liveObject , configObject typed.TypedValue , version fieldpath.APIVersion , managers fieldpath.ManagedFields , manager string , force bool ) (typed.TypedValue , fieldpath.ManagedFields , error ) {
150
+ managers = shallowCopyManagers (managers )
152
151
newObject , err := liveObject .Merge (configObject )
153
152
if err != nil {
154
153
return nil , fieldpath.ManagedFields {}, fmt .Errorf ("failed to merge config: %v" , err )
155
154
}
155
+ lastSet := managers [manager ]
156
156
set , err := configObject .ToFieldSet ()
157
157
if err != nil {
158
158
return nil , fieldpath.ManagedFields {}, fmt .Errorf ("failed to get field set: %v" , err )
159
159
}
160
- appliedSet : = & fieldpath.VersionedSet {
160
+ managers [ manager ] = & fieldpath.VersionedSet {
161
161
Set : set ,
162
162
APIVersion : version ,
163
163
Applied : true ,
164
164
}
165
- newObject , err = s .prune (newObject , managers , manager , appliedSet )
165
+ newObject , err = s .prune (newObject , managers , manager , lastSet )
166
166
if err != nil {
167
167
return nil , fieldpath.ManagedFields {}, fmt .Errorf ("failed to prune fields: %v" , err )
168
168
}
169
169
managers , err = s .update (liveObject , newObject , version , managers , manager , force )
170
170
if err != nil {
171
171
return nil , fieldpath.ManagedFields {}, err
172
172
}
173
- managers [manager ] = appliedSet
174
- if managers [manager ].Set .Empty () {
175
- delete (managers , manager )
176
- }
177
173
return newObject , managers , nil
178
174
}
179
175
180
- func (s * Updater ) prune (merged typed.TypedValue , managers fieldpath.ManagedFields , applyingManager string , appliedSet * fieldpath.VersionedSet ) (typed.TypedValue , error ) {
181
- lastSet := managers [applyingManager ]
176
+ func shallowCopyManagers (managers fieldpath.ManagedFields ) fieldpath.ManagedFields {
177
+ newManagers := fieldpath.ManagedFields {}
178
+ for manager , set := range managers {
179
+ newManagers [manager ] = set
180
+ }
181
+ return newManagers
182
+ }
183
+
184
+ func (s * Updater ) prune (merged typed.TypedValue , managers fieldpath.ManagedFields , applyingManager string , lastSet * fieldpath.VersionedSet ) (typed.TypedValue , error ) {
182
185
if lastSet == nil || lastSet .Set .Empty () {
183
186
return merged , nil
184
187
}
@@ -190,30 +193,29 @@ func (s *Updater) prune(merged typed.TypedValue, managers fieldpath.ManagedField
190
193
return nil , fmt .Errorf ("failed to convert merged object to last applied version: %v" , err )
191
194
}
192
195
pruned := convertedMerged .RemoveItems (lastSet .Set )
193
- pruned , err = s .addBackOwnedItems (convertedMerged , pruned , managers , applyingManager , appliedSet )
196
+ pruned , err = s .addBackOwnedItems (convertedMerged , pruned , managers , applyingManager )
194
197
if err != nil {
195
198
return nil , fmt .Errorf ("failed add back owned items: %v" , err )
196
199
}
197
200
pruned , err = s .addBackDanglingItems (convertedMerged , pruned , lastSet )
198
201
if err != nil {
199
202
return nil , fmt .Errorf ("failed add back dangling items: %v" , err )
200
203
}
201
- return s .Converter .Convert (pruned , appliedSet .APIVersion )
204
+ return s .Converter .Convert (pruned , managers [ applyingManager ] .APIVersion )
202
205
}
203
206
204
- func (s * Updater ) addBackOwnedItems (merged , pruned typed.TypedValue , managedFields fieldpath.ManagedFields , applyingManager string , appliedSet * fieldpath. VersionedSet ) (typed.TypedValue , error ) {
207
+ func (s * Updater ) addBackOwnedItems (merged , pruned typed.TypedValue , managedFields fieldpath.ManagedFields , applyingManager string ) (typed.TypedValue , error ) {
205
208
var err error
206
- managersAtVersion := map [fieldpath.APIVersion ][] string {}
207
- for manager , managerSet := range managedFields {
208
- if ! managerSet .Applied {
209
- continue
210
- }
211
- if manager == applyingManager {
212
- managerSet = appliedSet
209
+ managedAtVersion := map [fieldpath.APIVersion ]* fieldpath. Set {}
210
+ for _ , managerSet := range managedFields {
211
+ if managerSet .Applied {
212
+ if _ , ok := managedAtVersion [ managerSet . APIVersion ]; ! ok {
213
+ managedAtVersion [ managerSet . APIVersion ] = fieldpath . NewSet ()
214
+ }
215
+ managedAtVersion [ managerSet . APIVersion ] = managedAtVersion [ managerSet . APIVersion ]. Union ( managerSet . Set )
213
216
}
214
- managersAtVersion [managerSet .APIVersion ] = append (managersAtVersion [managerSet .APIVersion ], manager )
215
217
}
216
- for version , managers := range managersAtVersion {
218
+ for version , managed := range managedAtVersion {
217
219
merged , err = s .Converter .Convert (merged , version )
218
220
if err != nil {
219
221
if s .Converter .IsMissingVersionError (err ) {
@@ -236,15 +238,7 @@ func (s *Updater) addBackOwnedItems(merged, pruned typed.TypedValue, managedFiel
236
238
if err != nil {
237
239
return nil , fmt .Errorf ("failed to create field set from pruned object at version %v: %v" , version , err )
238
240
}
239
- toAddBack := prunedSet
240
- for _ , manager := range managers {
241
- managerSet := managedFields [manager ]
242
- if manager == applyingManager {
243
- managerSet = appliedSet
244
- }
245
- toAddBack = toAddBack .Union (managerSet .Set )
246
- }
247
- pruned = merged .RemoveItems (mergedSet .Difference (toAddBack ))
241
+ pruned = merged .RemoveItems (mergedSet .Difference (prunedSet .Union (managed )))
248
242
}
249
243
return pruned , nil
250
244
}
0 commit comments