Merge pull request #114835 from apelisse/testfield-configurable-typeconverter

Give TypeConverter to TestFieldManager
This commit is contained in:
Kubernetes Prow Robot 2023-01-05 11:08:21 -08:00 committed by GitHub
commit cd1115ced0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 76 additions and 95 deletions

View File

@ -48,7 +48,7 @@ func (*fakeManager) Apply(_, _ runtime.Object, _ fieldmanager.Managed, _ string,
} }
func TestCapManagersManagerMergesEntries(t *testing.T) { func TestCapManagersManagerMergesEntries(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"),
"", "",
func(m fieldmanager.Manager) fieldmanager.Manager { func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewCapManagersManager(m, 3) return fieldmanager.NewCapManagersManager(m, 3)
@ -114,7 +114,7 @@ func TestCapManagersManagerMergesEntries(t *testing.T) {
} }
func TestCapUpdateManagers(t *testing.T) { func TestCapUpdateManagers(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"),
"", "",
func(m fieldmanager.Manager) fieldmanager.Manager { func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewCapManagersManager(m, 3) return fieldmanager.NewCapManagersManager(m, 3)

View File

@ -17,9 +17,11 @@ limitations under the License.
package fieldmanager_test package fieldmanager_test
import ( import (
"encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"path/filepath"
"reflect" "reflect"
"strings" "strings"
"testing" "testing"
@ -34,15 +36,34 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
yamlutil "k8s.io/apimachinery/pkg/util/yaml" yamlutil "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanagertest" "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanagertest"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal" "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal"
"k8s.io/kube-openapi/pkg/validation/spec"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
) )
var fakeTypeConverter = func() fieldmanager.TypeConverter {
data, err := ioutil.ReadFile(filepath.Join(strings.Repeat(".."+string(filepath.Separator), 8),
"api", "openapi-spec", "swagger.json"))
if err != nil {
panic(err)
}
spec := spec.Swagger{}
if err := json.Unmarshal(data, &spec); err != nil {
panic(err)
}
typeConverter, err := fieldmanager.NewTypeConverter(&spec, false)
if err != nil {
panic(err)
}
return typeConverter
}()
// TestUpdateApplyConflict tests that applying to an object, which // TestUpdateApplyConflict tests that applying to an object, which
// wasn't created by apply, will give conflicts // wasn't created by apply, will give conflicts
func TestUpdateApplyConflict(t *testing.T) { func TestUpdateApplyConflict(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
patch := []byte(`{ patch := []byte(`{
"apiVersion": "apps/v1", "apiVersion": "apps/v1",
@ -103,7 +124,7 @@ func TestUpdateApplyConflict(t *testing.T) {
} }
func TestApplyStripsFields(t *testing.T) { func TestApplyStripsFields(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
newObj := &unstructured.Unstructured{ newObj := &unstructured.Unstructured{
Object: map[string]interface{}{ Object: map[string]interface{}{
@ -135,7 +156,7 @@ func TestApplyStripsFields(t *testing.T) {
} }
func TestVersionCheck(t *testing.T) { func TestVersionCheck(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -175,7 +196,7 @@ func TestVersionCheck(t *testing.T) {
} }
} }
func TestVersionCheckDoesNotPanic(t *testing.T) { func TestVersionCheckDoesNotPanic(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -214,7 +235,7 @@ func TestVersionCheckDoesNotPanic(t *testing.T) {
} }
func TestApplyDoesNotStripLabels(t *testing.T) { func TestApplyDoesNotStripLabels(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -268,7 +289,7 @@ func TestApplyNewObject(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.gvk.String(), func(t *testing.T) { t.Run(test.gvk.String(), func(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(test.gvk) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, test.gvk)
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal(test.obj, &appliedObj.Object); err != nil { if err := yaml.Unmarshal(test.obj, &appliedObj.Object); err != nil {
@ -306,7 +327,7 @@ func BenchmarkNewObject(b *testing.B) {
} }
for _, test := range tests { for _, test := range tests {
b.Run(test.gvk.Kind, func(b *testing.B) { b.Run(test.gvk.Kind, func(b *testing.B) {
f := fieldmanagertest.NewDefaultTestFieldManager(test.gvk) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, test.gvk)
decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion()) decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion())
newObj, err := runtime.Decode(decoder, test.obj) newObj, err := runtime.Decode(decoder, test.obj)
@ -412,8 +433,6 @@ func BenchmarkConvertObjectToTyped(b *testing.B) {
for _, test := range tests { for _, test := range tests {
b.Run(test.gvk.Kind, func(b *testing.B) { b.Run(test.gvk.Kind, func(b *testing.B) {
decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion()) decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion())
typeConverter := fieldmanagertest.NewBuiltinTypeConverter()
structured, err := runtime.Decode(decoder, test.obj) structured, err := runtime.Decode(decoder, test.obj)
if err != nil { if err != nil {
b.Fatalf("Failed to parse yaml object: %v", err) b.Fatalf("Failed to parse yaml object: %v", err)
@ -422,7 +441,7 @@ func BenchmarkConvertObjectToTyped(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
_, err := typeConverter.ObjectToTyped(structured) _, err := fakeTypeConverter.ObjectToTyped(structured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
@ -435,7 +454,7 @@ func BenchmarkConvertObjectToTyped(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
_, err := typeConverter.ObjectToTyped(unstructured) _, err := fakeTypeConverter.ObjectToTyped(unstructured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
@ -473,17 +492,15 @@ func BenchmarkCompare(b *testing.B) {
for _, test := range tests { for _, test := range tests {
b.Run(test.gvk.Kind, func(b *testing.B) { b.Run(test.gvk.Kind, func(b *testing.B) {
decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion()) decoder := serializer.NewCodecFactory(scheme).UniversalDecoder(test.gvk.GroupVersion())
typeConverter := fieldmanagertest.NewBuiltinTypeConverter()
structured, err := runtime.Decode(decoder, test.obj) structured, err := runtime.Decode(decoder, test.obj)
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
tv1, err := typeConverter.ObjectToTyped(structured) tv1, err := fakeTypeConverter.ObjectToTyped(structured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
tv2, err := typeConverter.ObjectToTyped(structured) tv2, err := fakeTypeConverter.ObjectToTyped(structured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
@ -499,11 +516,11 @@ func BenchmarkCompare(b *testing.B) {
}) })
unstructured := toUnstructured(b, structured) unstructured := toUnstructured(b, structured)
utv1, err := typeConverter.ObjectToTyped(unstructured) utv1, err := fakeTypeConverter.ObjectToTyped(unstructured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
utv2, err := typeConverter.ObjectToTyped(unstructured) utv2, err := fakeTypeConverter.ObjectToTyped(unstructured)
if err != nil { if err != nil {
b.Errorf("Error in ObjectToTyped: %v", err) b.Errorf("Error in ObjectToTyped: %v", err)
} }
@ -523,7 +540,7 @@ func BenchmarkCompare(b *testing.B) {
} }
func BenchmarkRepeatedUpdate(b *testing.B) { func BenchmarkRepeatedUpdate(b *testing.B) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
podBytes := getObjectBytes("pod.yaml") podBytes := getObjectBytes("pod.yaml")
var obj *corev1.Pod var obj *corev1.Pod
@ -562,7 +579,7 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
} }
func TestApplyFailsWithManagedFields(t *testing.T) { func TestApplyFailsWithManagedFields(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -587,7 +604,7 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
} }
func TestApplySuccessWithNoManagedFields(t *testing.T) { func TestApplySuccessWithNoManagedFields(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}} appliedObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -610,7 +627,7 @@ func TestApplySuccessWithNoManagedFields(t *testing.T) {
// Run an update and apply, and make sure that nothing has changed. // Run an update and apply, and make sure that nothing has changed.
func TestNoOpChanges(t *testing.T) { func TestNoOpChanges(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
obj := &unstructured.Unstructured{Object: map[string]interface{}{}} obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -661,7 +678,7 @@ func TestNoOpChanges(t *testing.T) {
// Tests that one can reset the managedFields by sending either an empty // Tests that one can reset the managedFields by sending either an empty
// list // list
func TestResetManagedFieldsEmptyList(t *testing.T) { func TestResetManagedFieldsEmptyList(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
obj := &unstructured.Unstructured{Object: map[string]interface{}{}} obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -702,7 +719,7 @@ func TestResetManagedFieldsEmptyList(t *testing.T) {
// Tests that one can reset the managedFields by sending either a list with one empty item. // Tests that one can reset the managedFields by sending either a list with one empty item.
func TestResetManagedFieldsEmptyItem(t *testing.T) { func TestResetManagedFieldsEmptyItem(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
obj := &unstructured.Unstructured{Object: map[string]interface{}{}} obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -742,7 +759,7 @@ func TestResetManagedFieldsEmptyItem(t *testing.T) {
} }
func TestServerSideApplyWithInvalidLastApplied(t *testing.T) { func TestServerSideApplyWithInvalidLastApplied(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
// create object with client-side apply // create object with client-side apply
newObj := &unstructured.Unstructured{Object: map[string]interface{}{}} newObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
@ -821,7 +838,7 @@ spec:
} }
func TestInteropForClientSideApplyAndServerSideApply(t *testing.T) { func TestInteropForClientSideApplyAndServerSideApply(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
// create object with client-side apply // create object with client-side apply
newObj := &unstructured.Unstructured{Object: map[string]interface{}{}} newObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
@ -905,7 +922,7 @@ spec:
} }
func TestNoTrackManagedFieldsForClientSideApply(t *testing.T) { func TestNoTrackManagedFieldsForClientSideApply(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
// create object // create object
newObj := &unstructured.Unstructured{Object: map[string]interface{}{}} newObj := &unstructured.Unstructured{Object: map[string]interface{}{}}
@ -1085,7 +1102,7 @@ func getLastApplied(obj runtime.Object) (string, error) {
} }
func TestUpdateViaSubresources(t *testing.T) { func TestUpdateViaSubresources(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), "scale", nil) f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"), "scale", nil)
obj := &unstructured.Unstructured{Object: map[string]interface{}{}} obj := &unstructured.Unstructured{Object: map[string]interface{}{}}
if err := yaml.Unmarshal([]byte(`{ if err := yaml.Unmarshal([]byte(`{
@ -1140,7 +1157,7 @@ func TestUpdateViaSubresources(t *testing.T) {
// Ensures that a no-op Apply does not mutate managed fields // Ensures that a no-op Apply does not mutate managed fields
func TestApplyDoesNotChangeManagedFields(t *testing.T) { func TestApplyDoesNotChangeManagedFields(t *testing.T) {
originalManagedFields := []metav1.ManagedFieldsEntry{} originalManagedFields := []metav1.ManagedFieldsEntry{}
f := fieldmanagertest.NewDefaultTestFieldManager( f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter,
schema.FromAPIVersionAndKind("apps/v1", "Deployment")) schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
newObj := &unstructured.Unstructured{ newObj := &unstructured.Unstructured{
Object: map[string]interface{}{}, Object: map[string]interface{}{},
@ -1234,7 +1251,7 @@ func TestApplyDoesNotChangeManagedFields(t *testing.T) {
// Ensures that a no-op Update does not mutate managed fields // Ensures that a no-op Update does not mutate managed fields
func TestUpdateDoesNotChangeManagedFields(t *testing.T) { func TestUpdateDoesNotChangeManagedFields(t *testing.T) {
originalManagedFields := []metav1.ManagedFieldsEntry{} originalManagedFields := []metav1.ManagedFieldsEntry{}
f := fieldmanagertest.NewDefaultTestFieldManager( f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter,
schema.FromAPIVersionAndKind("apps/v1", "Deployment")) schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
newObj := &unstructured.Unstructured{ newObj := &unstructured.Unstructured{
Object: map[string]interface{}{}, Object: map[string]interface{}{},
@ -1306,7 +1323,7 @@ func TestUpdateDoesNotChangeManagedFields(t *testing.T) {
// This test makes sure that the liveObject during a patch does not mutate // This test makes sure that the liveObject during a patch does not mutate
// its managed fields. // its managed fields.
func TestLiveObjectManagedFieldsNotRemoved(t *testing.T) { func TestLiveObjectManagedFieldsNotRemoved(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager( f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter,
schema.FromAPIVersionAndKind("apps/v1", "Deployment")) schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
newObj := &unstructured.Unstructured{ newObj := &unstructured.Unstructured{
Object: map[string]interface{}{}, Object: map[string]interface{}{},

View File

@ -17,12 +17,8 @@ limitations under the License.
package fieldmanagertest package fieldmanagertest
import ( import (
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"path/filepath"
"strings"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -30,36 +26,11 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"k8s.io/kube-openapi/pkg/validation/spec"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath" "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
"sigs.k8s.io/structured-merge-diff/v4/merge" "sigs.k8s.io/structured-merge-diff/v4/merge"
"sigs.k8s.io/structured-merge-diff/v4/typed" "sigs.k8s.io/structured-merge-diff/v4/typed"
) )
var builtinConverter = func() fieldmanager.TypeConverter {
data, err := ioutil.ReadFile(filepath.Join(
strings.Repeat(".."+string(filepath.Separator), 8),
"api", "openapi-spec", "swagger.json"))
if err != nil {
panic(err)
}
spec := spec.Swagger{}
if err := json.Unmarshal(data, &spec); err != nil {
panic(err)
}
tc, err := fieldmanager.NewTypeConverter(&spec, false)
if err != nil {
panic(fmt.Errorf("Failed to build TypeConverter: %v", err))
}
return tc
}()
// NewBuiltinTypeConverter creates a TypeConverter with all the built-in
// types defined, given the committed kubernetes swagger.json.
func NewBuiltinTypeConverter() fieldmanager.TypeConverter {
return builtinConverter
}
type fakeObjectConvertor struct { type fakeObjectConvertor struct {
converter merge.Converter converter merge.Converter
apiVersion fieldpath.APIVersion apiVersion fieldpath.APIVersion
@ -132,13 +103,12 @@ type TestFieldManager struct {
// NewDefaultTestFieldManager returns a new TestFieldManager built for // NewDefaultTestFieldManager returns a new TestFieldManager built for
// the given gvk, on the main resource. // the given gvk, on the main resource.
func NewDefaultTestFieldManager(gvk schema.GroupVersionKind) TestFieldManager { func NewDefaultTestFieldManager(typeConverter fieldmanager.TypeConverter, gvk schema.GroupVersionKind) TestFieldManager {
return NewTestFieldManager(gvk, "", nil) return NewTestFieldManager(typeConverter, gvk, "", nil)
} }
// NewTestFieldManager creates a new manager for the given GVK. // NewTestFieldManager creates a new manager for the given GVK.
func NewTestFieldManager(gvk schema.GroupVersionKind, subresource string, chainFieldManager func(fieldmanager.Manager) fieldmanager.Manager) TestFieldManager { func NewTestFieldManager(typeConverter fieldmanager.TypeConverter, gvk schema.GroupVersionKind, subresource string, chainFieldManager func(fieldmanager.Manager) fieldmanager.Manager) TestFieldManager {
typeConverter := NewBuiltinTypeConverter()
apiVersion := fieldpath.APIVersion(gvk.GroupVersion().String()) apiVersion := fieldpath.APIVersion(gvk.GroupVersion().String())
objectConverter := &fakeObjectConvertor{sameVersionConverter{}, apiVersion} objectConverter := &fakeObjectConvertor{sameVersionConverter{}, apiVersion}
f, err := fieldmanager.NewStructuredMergeManager( f, err := fieldmanager.NewStructuredMergeManager(

View File

@ -44,7 +44,7 @@ type testArgs struct {
// created with the client-side apply last-applied annotation // created with the client-side apply last-applied annotation
// will not give conflicts // will not give conflicts
func TestApplyUsingLastAppliedAnnotation(t *testing.T) { func TestApplyUsingLastAppliedAnnotation(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"))
tests := []testArgs{ tests := []testArgs{
{ {
@ -564,7 +564,7 @@ spec:
} }
func TestServiceApply(t *testing.T) { func TestServiceApply(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Service")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Service"))
tests := []testArgs{ tests := []testArgs{
{ {
@ -675,7 +675,7 @@ spec:
} }
func TestReplicationControllerApply(t *testing.T) { func TestReplicationControllerApply(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ReplicationController")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ReplicationController"))
tests := []testArgs{ tests := []testArgs{
{ {
@ -738,7 +738,7 @@ spec:
} }
func TestPodApply(t *testing.T) { func TestPodApply(t *testing.T) {
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"))
tests := []testArgs{ tests := []testArgs{
{ {

View File

@ -32,7 +32,7 @@ import (
) )
func TestLastAppliedUpdater(t *testing.T) { func TestLastAppliedUpdater(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment"), f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("apps/v1", "Deployment"),
"", "",
func(m fieldmanager.Manager) fieldmanager.Manager { func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewLastAppliedUpdater(m) return fieldmanager.NewLastAppliedUpdater(m)
@ -189,7 +189,7 @@ func TestLargeLastApplied(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap"), f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"),
"", "",
func(m fieldmanager.Manager) fieldmanager.Manager { func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewLastAppliedUpdater(m) return fieldmanager.NewLastAppliedUpdater(m)

View File

@ -36,7 +36,7 @@ import (
func TestManagedFieldsUpdateDoesModifyTime(t *testing.T) { func TestManagedFieldsUpdateDoesModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = updateObject(&f, "fieldmanager_test", []byte(`{ err = updateObject(&f, "fieldmanager_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -77,7 +77,7 @@ func TestManagedFieldsUpdateDoesModifyTime(t *testing.T) {
func TestManagedFieldsApplyDoesModifyTime(t *testing.T) { func TestManagedFieldsApplyDoesModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = applyObject(&f, "fieldmanager_test", []byte(`{ err = applyObject(&f, "fieldmanager_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -118,7 +118,7 @@ func TestManagedFieldsApplyDoesModifyTime(t *testing.T) {
func TestManagedFieldsUpdateWithoutChangesDoesNotModifyTime(t *testing.T) { func TestManagedFieldsUpdateWithoutChangesDoesNotModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = updateObject(&f, "fieldmanager_test", []byte(`{ err = updateObject(&f, "fieldmanager_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -159,7 +159,7 @@ func TestManagedFieldsUpdateWithoutChangesDoesNotModifyTime(t *testing.T) {
func TestManagedFieldsApplyWithoutChangesDoesNotModifyTime(t *testing.T) { func TestManagedFieldsApplyWithoutChangesDoesNotModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = applyObject(&f, "fieldmanager_test", []byte(`{ err = applyObject(&f, "fieldmanager_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -200,7 +200,7 @@ func TestManagedFieldsApplyWithoutChangesDoesNotModifyTime(t *testing.T) {
func TestNonManagedFieldsUpdateDoesNotModifyTime(t *testing.T) { func TestNonManagedFieldsUpdateDoesNotModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = updateObject(&f, "fieldmanager_a_test", []byte(`{ err = updateObject(&f, "fieldmanager_a_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -263,7 +263,7 @@ func TestNonManagedFieldsUpdateDoesNotModifyTime(t *testing.T) {
func TestNonManagedFieldsApplyDoesNotModifyTime(t *testing.T) { func TestNonManagedFieldsApplyDoesNotModifyTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = applyObject(&f, "fieldmanager_a_test", []byte(`{ err = applyObject(&f, "fieldmanager_a_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -326,7 +326,7 @@ func TestNonManagedFieldsApplyDoesNotModifyTime(t *testing.T) {
func TestTakingOverManagedFieldsDuringUpdateDoesNotModifyPreviousManagerTime(t *testing.T) { func TestTakingOverManagedFieldsDuringUpdateDoesNotModifyPreviousManagerTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = updateObject(&f, "fieldmanager_a_test", []byte(`{ err = updateObject(&f, "fieldmanager_a_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",
@ -377,7 +377,7 @@ func TestTakingOverManagedFieldsDuringUpdateDoesNotModifyPreviousManagerTime(t *
func TestTakingOverManagedFieldsDuringApplyDoesNotModifyPreviousManagerTime(t *testing.T) { func TestTakingOverManagedFieldsDuringApplyDoesNotModifyPreviousManagerTime(t *testing.T) {
var err error var err error
f := fieldmanagertest.NewDefaultTestFieldManager(schema.FromAPIVersionAndKind("v1", "ConfigMap")) f := fieldmanagertest.NewDefaultTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "ConfigMap"))
err = applyObject(&f, "fieldmanager_a_test", []byte(`{ err = applyObject(&f, "fieldmanager_a_test", []byte(`{
"apiVersion": "v1", "apiVersion": "v1",

View File

@ -30,7 +30,7 @@ import (
) )
func TestNoUpdateBeforeFirstApply(t *testing.T) { func TestNoUpdateBeforeFirstApply(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), "", func(m fieldmanager.Manager) fieldmanager.Manager { f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"), "", func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewSkipNonAppliedManager( return fieldmanager.NewSkipNonAppliedManager(
m, m,
fieldmanagertest.NewFakeObjectCreater(), fieldmanagertest.NewFakeObjectCreater(),
@ -70,7 +70,7 @@ func TestNoUpdateBeforeFirstApply(t *testing.T) {
} }
func TestUpdateBeforeFirstApply(t *testing.T) { func TestUpdateBeforeFirstApply(t *testing.T) {
f := fieldmanagertest.NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), "", func(m fieldmanager.Manager) fieldmanager.Manager { f := fieldmanagertest.NewTestFieldManager(fakeTypeConverter, schema.FromAPIVersionAndKind("v1", "Pod"), "", func(m fieldmanager.Manager) fieldmanager.Manager {
return fieldmanager.NewSkipNonAppliedManager( return fieldmanager.NewSkipNonAppliedManager(
m, m,
fieldmanagertest.NewFakeObjectCreater(), fieldmanagertest.NewFakeObjectCreater(),

View File

@ -32,7 +32,7 @@ import (
"k8s.io/kube-openapi/pkg/validation/spec" "k8s.io/kube-openapi/pkg/validation/spec"
) )
var testSchema = func() *spec.Swagger { var testTypeConverter = func() fieldmanager.TypeConverter {
data, err := ioutil.ReadFile(filepath.Join("testdata", "swagger.json")) data, err := ioutil.ReadFile(filepath.Join("testdata", "swagger.json"))
if err != nil { if err != nil {
panic(err) panic(err)
@ -41,15 +41,14 @@ var testSchema = func() *spec.Swagger {
if err := json.Unmarshal(data, &spec); err != nil { if err := json.Unmarshal(data, &spec); err != nil {
panic(err) panic(err)
} }
return &spec typeConverter, err := fieldmanager.NewTypeConverter(&spec, false)
if err != nil {
panic(err)
}
return typeConverter
}() }()
func TestTypeConverter(t *testing.T) { func TestTypeConverter(t *testing.T) {
tc, err := fieldmanager.NewTypeConverter(testSchema, false)
if err != nil {
t.Fatalf("Failed to build TypeConverter: %v", err)
}
dtc := fieldmanager.DeducedTypeConverter{} dtc := fieldmanager.DeducedTypeConverter{}
testCases := []struct { testCases := []struct {
@ -119,7 +118,7 @@ spec:
for _, testCase := range testCases { for _, testCase := range testCases {
t.Run(fmt.Sprintf("%v ObjectToTyped with TypeConverter", testCase.name), func(t *testing.T) { t.Run(fmt.Sprintf("%v ObjectToTyped with TypeConverter", testCase.name), func(t *testing.T) {
testObjectToTyped(t, tc, testCase.yaml) testObjectToTyped(t, testTypeConverter, testCase.yaml)
}) })
t.Run(fmt.Sprintf("%v ObjectToTyped with DeducedTypeConverter", testCase.name), func(t *testing.T) { t.Run(fmt.Sprintf("%v ObjectToTyped with DeducedTypeConverter", testCase.name), func(t *testing.T) {
testObjectToTyped(t, dtc, testCase.yaml) testObjectToTyped(t, dtc, testCase.yaml)
@ -177,18 +176,13 @@ spec:
b.Fatalf("Failed to parse yaml object: %v", err) b.Fatalf("Failed to parse yaml object: %v", err)
} }
tc, err := fieldmanager.NewTypeConverter(testSchema, false)
if err != nil {
b.Fatalf("Failed to build TypeConverter: %v", err)
}
b.ResetTimer() b.ResetTimer()
b.ReportAllocs() b.ReportAllocs()
var r *typed.TypedValue var r *typed.TypedValue
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
var err error var err error
r, err = tc.ObjectToTyped(obj) r, err = testTypeConverter.ObjectToTyped(obj)
if err != nil { if err != nil {
b.Fatalf("Failed to convert object to typed: %v", err) b.Fatalf("Failed to convert object to typed: %v", err)
} }