Skip to content

Commit 2524cd1

Browse files
committed
Address review feedback from kubernetes-sigs#2981
1 parent b3f4310 commit 2524cd1

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

pkg/client/fake/client.go

+19-10
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ type ClientBuilder struct {
135135
withStatusSubresource []client.Object
136136
objectTracker testing.ObjectTracker
137137
interceptorFuncs *interceptor.Funcs
138-
typeConverters []managedfields.TypeConverter
138+
typeConverter managedfields.TypeConverter
139139

140140
// indexes maps each GroupVersionKind (GVK) to the indexes registered for that GVK.
141141
// The inner map maps from index name to IndexerFunc.
@@ -243,7 +243,14 @@ func (f *ClientBuilder) WithInterceptorFuncs(interceptorFuncs interceptor.Funcs)
243243
// * clientgoapplyconfigurations.NewTypeConverter(clientgoscheme.Scheme),
244244
// * managedfields.NewDeducedTypeConverter(),
245245
func (f *ClientBuilder) WithTypeConverters(typeConverters ...managedfields.TypeConverter) *ClientBuilder {
246-
f.typeConverters = append(f.typeConverters, typeConverters...)
246+
if f.typeConverter == nil {
247+
f.typeConverter = &multiTypeConverter{upstream: typeConverters}
248+
} else if multiTypeConverter, ok := f.typeConverter.(*multiTypeConverter); ok {
249+
multiTypeConverter.upstream = append(multiTypeConverter.upstream, typeConverters...)
250+
} else {
251+
panic(fmt.Sprintf("unexpected type converter already specified: %T; this is incompatible with WithTypeConverters", f.typeConverter))
252+
}
253+
247254
return f
248255
}
249256

@@ -267,23 +274,25 @@ func (f *ClientBuilder) Build() client.WithWatch {
267274
withStatusSubResource.Insert(gvk)
268275
}
269276

270-
if f.objectTracker != nil && len(f.typeConverters) > 0 {
277+
if f.objectTracker != nil && f.typeConverter != nil {
271278
panic(errors.New("WithObjectTracker and WithTypeConverters are incompatible"))
272279
}
273280

274281
if f.objectTracker == nil {
275-
if len(f.typeConverters) == 0 {
276-
f.typeConverters = []managedfields.TypeConverter{
277-
// Use corresponding scheme to ensure the converter error
278-
// for types it can't handle.
279-
clientgoapplyconfigurations.NewTypeConverter(clientgoscheme.Scheme),
280-
managedfields.NewDeducedTypeConverter(),
282+
if f.typeConverter == nil {
283+
f.typeConverter = &multiTypeConverter{
284+
upstream: []managedfields.TypeConverter{
285+
// Use corresponding scheme to ensure the converter error
286+
// for types it can't handle.
287+
clientgoapplyconfigurations.NewTypeConverter(clientgoscheme.Scheme),
288+
managedfields.NewDeducedTypeConverter(),
289+
},
281290
}
282291
}
283292
f.objectTracker = testing.NewFieldManagedObjectTracker(
284293
f.scheme,
285294
serializer.NewCodecFactory(f.scheme).UniversalDecoder(),
286-
multiTypeConverter{upstream: f.typeConverters},
295+
f.typeConverter,
287296
)
288297
}
289298
tracker = versionedTracker{

pkg/client/fake/typeconverter.go

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import (
2525
"sigs.k8s.io/structured-merge-diff/v4/typed"
2626
)
2727

28+
// multiTypeConverter is an implementation detail for the fake client used to
29+
// support server-side apply.
30+
// NOTE: this type should not be exported!
2831
type multiTypeConverter struct {
2932
upstream []managedfields.TypeConverter
3033
}

0 commit comments

Comments
 (0)