@@ -29,6 +29,7 @@ import (
29
29
"k8s.io/klog/v2"
30
30
openapiproto "k8s.io/kube-openapi/pkg/util/proto"
31
31
"sigs.k8s.io/structured-merge-diff/v3/fieldpath"
32
+ "sigs.k8s.io/structured-merge-diff/v3/merge"
32
33
)
33
34
34
35
// DefaultMaxUpdateManagers defines the default maximum retained number of managedFields entries from updates
@@ -78,31 +79,46 @@ func NewFieldManager(f Manager) *FieldManager {
78
79
// NewDefaultFieldManager creates a new FieldManager that merges apply requests
79
80
// and update managed fields for other types of requests.
80
81
func NewDefaultFieldManager (models openapiproto.Models , objectConverter runtime.ObjectConvertor , objectDefaulter runtime.ObjectDefaulter , objectCreater runtime.ObjectCreater , kind schema.GroupVersionKind , hub schema.GroupVersion ) (* FieldManager , error ) {
81
- f , err := NewStructuredMergeManager (models , objectConverter , objectDefaulter , kind .GroupVersion (), hub )
82
+ typeConverter , err := internal .NewTypeConverter (models , false )
83
+ if err != nil {
84
+ return nil , err
85
+ }
86
+
87
+ f , err := NewStructuredMergeManager (typeConverter , objectConverter , objectDefaulter , kind .GroupVersion (), hub )
82
88
if err != nil {
83
89
return nil , fmt .Errorf ("failed to create field manager: %v" , err )
84
90
}
85
- return newDefaultFieldManager (f , objectCreater , kind ), nil
91
+ return newDefaultFieldManager (f , typeConverter , objectConverter , objectCreater , kind ), nil
86
92
}
87
93
88
94
// NewDefaultCRDFieldManager creates a new FieldManager specifically for
89
95
// CRDs. This allows for the possibility of fields which are not defined
90
96
// in models, as well as having no models defined at all.
91
97
func NewDefaultCRDFieldManager (models openapiproto.Models , objectConverter runtime.ObjectConvertor , objectDefaulter runtime.ObjectDefaulter , objectCreater runtime.ObjectCreater , kind schema.GroupVersionKind , hub schema.GroupVersion , preserveUnknownFields bool ) (_ * FieldManager , err error ) {
92
- f , err := NewCRDStructuredMergeManager (models , objectConverter , objectDefaulter , kind .GroupVersion (), hub , preserveUnknownFields )
98
+ var typeConverter internal.TypeConverter = internal.DeducedTypeConverter {}
99
+ if models != nil {
100
+ typeConverter , err = internal .NewTypeConverter (models , preserveUnknownFields )
101
+ if err != nil {
102
+ return nil , err
103
+ }
104
+ }
105
+ f , err := NewCRDStructuredMergeManager (typeConverter , objectConverter , objectDefaulter , kind .GroupVersion (), hub , preserveUnknownFields )
93
106
if err != nil {
94
107
return nil , fmt .Errorf ("failed to create field manager: %v" , err )
95
108
}
96
- return newDefaultFieldManager (f , objectCreater , kind ), nil
109
+ return newDefaultFieldManager (f , typeConverter , objectConverter , objectCreater , kind ), nil
97
110
}
98
111
99
112
// newDefaultFieldManager is a helper function which wraps a Manager with certain default logic.
100
- func newDefaultFieldManager (f Manager , objectCreater runtime.ObjectCreater , kind schema.GroupVersionKind ) * FieldManager {
113
+ func newDefaultFieldManager (f Manager , typeConverter internal. TypeConverter , objectConverter runtime. ObjectConvertor , objectCreater runtime.ObjectCreater , kind schema.GroupVersionKind ) * FieldManager {
101
114
f = NewStripMetaManager (f )
102
115
f = NewManagedFieldsUpdater (f )
103
116
f = NewBuildManagerInfoManager (f , kind .GroupVersion ())
104
117
f = NewCapManagersManager (f , DefaultMaxUpdateManagers )
105
118
f = NewProbabilisticSkipNonAppliedManager (f , objectCreater , kind , DefaultTrackOnCreateProbability )
119
+ f = NewLastAppliedManager (f , typeConverter , objectConverter , kind .GroupVersion ())
120
+ f = NewLastAppliedUpdater (f )
121
+
106
122
return NewFieldManager (f )
107
123
}
108
124
@@ -200,7 +216,11 @@ func (f *FieldManager) Apply(liveObj, appliedObj runtime.Object, manager string,
200
216
201
217
internal .RemoveObjectManagedFields (liveObj )
202
218
203
- if object , managed , err = f .fieldManager .Apply (liveObj , appliedObj , managed , manager , force ); err != nil {
219
+ object , managed , err = f .fieldManager .Apply (liveObj , appliedObj , managed , manager , force )
220
+ if err != nil {
221
+ if conflicts , ok := err .(merge.Conflicts ); ok {
222
+ return nil , internal .NewConflictError (conflicts )
223
+ }
204
224
return nil , err
205
225
}
206
226
0 commit comments