...
1
16
17 package internal
18
19 import (
20 "time"
21
22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23 "k8s.io/apimachinery/pkg/runtime"
24 "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
25 )
26
27 type managedFieldsUpdater struct {
28 fieldManager Manager
29 }
30
31 var _ Manager = &managedFieldsUpdater{}
32
33
34
35
36
37
38 func NewManagedFieldsUpdater(fieldManager Manager) Manager {
39 return &managedFieldsUpdater{
40 fieldManager: fieldManager,
41 }
42 }
43
44
45 func (f *managedFieldsUpdater) Update(liveObj, newObj runtime.Object, managed Managed, manager string) (runtime.Object, Managed, error) {
46 self := "current-operation"
47 object, managed, err := f.fieldManager.Update(liveObj, newObj, managed, self)
48 if err != nil {
49 return object, managed, err
50 }
51
52
53
54 if vs, ok := managed.Fields()[self]; ok {
55 delete(managed.Fields(), self)
56
57 if previous, ok := managed.Fields()[manager]; ok {
58 managed.Fields()[manager] = fieldpath.NewVersionedSet(vs.Set().Union(previous.Set()), vs.APIVersion(), vs.Applied())
59 } else {
60 managed.Fields()[manager] = vs
61 }
62
63 managed.Times()[manager] = &metav1.Time{Time: time.Now().UTC()}
64 }
65
66 return object, managed, nil
67 }
68
69
70 func (f *managedFieldsUpdater) Apply(liveObj, appliedObj runtime.Object, managed Managed, fieldManager string, force bool) (runtime.Object, Managed, error) {
71 object, managed, err := f.fieldManager.Apply(liveObj, appliedObj, managed, fieldManager, force)
72 if err != nil {
73 return object, managed, err
74 }
75 if object != nil {
76 managed.Times()[fieldManager] = &metav1.Time{Time: time.Now().UTC()}
77 } else {
78 object = liveObj.DeepCopyObject()
79 RemoveObjectManagedFields(object)
80 }
81 return object, managed, nil
82 }
83
View as plain text