cleanup managedFields admission and test

Kubernetes-commit: 2d1ba0c35829a2f146a712d49cb21f382c9894cb
This commit is contained in:
Kevin Wiesmueller 2021-03-04 23:20:51 +01:00 committed by Kubernetes Publisher
parent 8ef7c0686d
commit b101f44b76
2 changed files with 58 additions and 67 deletions

View File

@ -46,12 +46,12 @@ var _ admission.Interface = &managedFieldsValidatingAdmissionController{}
var _ admission.MutationInterface = &managedFieldsValidatingAdmissionController{} var _ admission.MutationInterface = &managedFieldsValidatingAdmissionController{}
var _ admission.ValidationInterface = &managedFieldsValidatingAdmissionController{} var _ admission.ValidationInterface = &managedFieldsValidatingAdmissionController{}
// Handles calls the wrapped admission.Interface if aplicable // Handles calls the wrapped admission.Interface if applicable
func (admit *managedFieldsValidatingAdmissionController) Handles(operation admission.Operation) bool { func (admit *managedFieldsValidatingAdmissionController) Handles(operation admission.Operation) bool {
return admit.wrap.Handles(operation) return admit.wrap.Handles(operation)
} }
// Admit calls the wrapped admission.Interface if aplicable and resets the managedFields to their state before admission if they // Admit calls the wrapped admission.Interface if applicable and resets the managedFields to their state before admission if they
// got modified in an invalid way // got modified in an invalid way
func (admit *managedFieldsValidatingAdmissionController) Admit(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) { func (admit *managedFieldsValidatingAdmissionController) Admit(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) (err error) {
mutationInterface, isMutationInterface := admit.wrap.(admission.MutationInterface) mutationInterface, isMutationInterface := admit.wrap.(admission.MutationInterface)

View File

@ -21,89 +21,80 @@ import (
"reflect" "reflect"
"testing" "testing"
v1 "k8s.io/api/core/v1"
"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"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
) )
func TestAdmission(t *testing.T) { func TestAdmission(t *testing.T) {
wrap := &mockAdmissionController{} wrap := &mockAdmissionController{}
ac := fieldmanager.NewManagedFieldsValidatingAdmissionController(wrap) ac := fieldmanager.NewManagedFieldsValidatingAdmissionController(wrap)
now := metav1.Now()
tests := []struct { validFieldsV1, err := internal.SetToFields(*fieldpath.NewSet(fieldpath.MakePathOrDie("metadata", "labels", "test-label")))
beforeAdmission []metav1.ManagedFieldsEntry if err != nil {
afterAdmission []metav1.ManagedFieldsEntry t.Fatal(err)
expected []metav1.ManagedFieldsEntry }
}{ validManagedFieldsEntry := metav1.ManagedFieldsEntry{
{ APIVersion: "v1",
beforeAdmission: []metav1.ManagedFieldsEntry{ Operation: metav1.ManagedFieldsOperationApply,
{ Time: &now,
Manager: "test", Manager: "test",
}, FieldsType: "FieldsV1",
}, FieldsV1: &validFieldsV1,
afterAdmission: []metav1.ManagedFieldsEntry{ }
{
Manager: "", managedFieldsMutators := map[string]func(in metav1.ManagedFieldsEntry) (out metav1.ManagedFieldsEntry, shouldReset bool){
}, "invalid APIVersion": func(managedFields metav1.ManagedFieldsEntry) (metav1.ManagedFieldsEntry, bool) {
}, managedFields.APIVersion = ""
expected: []metav1.ManagedFieldsEntry{ return managedFields, true
{
Manager: "test",
},
},
}, },
{ "invalid Operation": func(managedFields metav1.ManagedFieldsEntry) (metav1.ManagedFieldsEntry, bool) {
beforeAdmission: []metav1.ManagedFieldsEntry{ managedFields.Operation = "invalid operation"
{ return managedFields, true
APIVersion: "test",
},
},
afterAdmission: []metav1.ManagedFieldsEntry{
{
APIVersion: "",
},
},
expected: []metav1.ManagedFieldsEntry{
{
APIVersion: "test",
},
},
}, },
{ "invalid fieldsType": func(managedFields metav1.ManagedFieldsEntry) (metav1.ManagedFieldsEntry, bool) {
beforeAdmission: []metav1.ManagedFieldsEntry{ managedFields.FieldsType = "invalid fieldsType"
{ return managedFields, true
FieldsType: "FieldsV1", },
}, "invalid fieldsV1": func(managedFields metav1.ManagedFieldsEntry) (metav1.ManagedFieldsEntry, bool) {
}, managedFields.FieldsV1 = &metav1.FieldsV1{Raw: []byte("{invalid}")}
afterAdmission: []metav1.ManagedFieldsEntry{ return managedFields, true
{ },
FieldsType: "test", "invalid manager": func(managedFields metav1.ManagedFieldsEntry) (metav1.ManagedFieldsEntry, bool) {
}, managedFields.Manager = ""
}, return managedFields, false
expected: []metav1.ManagedFieldsEntry{
{
FieldsType: "FieldsV1",
},
},
}, },
} }
for _, test := range tests { for name, mutate := range managedFieldsMutators {
obj := &unstructured.Unstructured{} t.Run(name, func(t *testing.T) {
obj.SetManagedFields(test.beforeAdmission) mutated, shouldReset := mutate(validManagedFieldsEntry)
wrap.admit = replaceManagedFields(test.afterAdmission) validEntries := []metav1.ManagedFieldsEntry{validManagedFieldsEntry}
mutatedEntries := []metav1.ManagedFieldsEntry{mutated}
attrs := admission.NewAttributesRecord(obj, obj, schema.GroupVersionKind{}, "default", "", schema.GroupVersionResource{}, "", admission.Update, nil, false, nil) obj := &v1.ConfigMap{}
if err := ac.(admission.MutationInterface).Admit(context.TODO(), attrs, nil); err != nil { obj.SetManagedFields(validEntries)
t.Fatal(err)
}
if !reflect.DeepEqual(obj.GetManagedFields(), test.expected) { wrap.admit = replaceManagedFields(mutatedEntries)
t.Fatalf("expected: \n%v\ngot:\n%v", test.expected, obj.GetManagedFields())
} attrs := admission.NewAttributesRecord(obj, obj, schema.GroupVersionKind{}, "default", "", schema.GroupVersionResource{}, "", admission.Update, nil, false, nil)
if err := ac.(admission.MutationInterface).Admit(context.TODO(), attrs, nil); err != nil {
t.Fatal(err)
}
if shouldReset && !reflect.DeepEqual(obj.GetManagedFields(), validEntries) {
t.Fatalf("expected: \n%v\ngot:\n%v", validEntries, obj.GetManagedFields())
}
if !shouldReset && reflect.DeepEqual(obj.GetManagedFields(), validEntries) {
t.Fatalf("expected: \n%v\ngot:\n%v", mutatedEntries, obj.GetManagedFields())
}
})
} }
} }