Merge pull request #81453 from joshmsamuels/master

Apply will fail with managed fields + tests
This commit is contained in:
Kubernetes Prow Robot 2019-09-10 14:30:47 -07:00 committed by GitHub
commit 64718f6786
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 27 deletions

View File

@ -192,6 +192,11 @@ func (f *FieldManager) Apply(liveObj runtime.Object, patch []byte, fieldManager
if err := yaml.Unmarshal(patch, &patchObj.Object); err != nil { if err := yaml.Unmarshal(patch, &patchObj.Object); err != nil {
return nil, fmt.Errorf("error decoding YAML: %v", err) return nil, fmt.Errorf("error decoding YAML: %v", err)
} }
if patchObj.GetManagedFields() != nil {
return nil, fmt.Errorf("managed fields must be nil but was %v", patchObj.GetManagedFields())
}
if patchObj.GetAPIVersion() != f.groupVersion.String() { if patchObj.GetAPIVersion() != f.groupVersion.String() {
return nil, return nil,
errors.NewBadRequest( errors.NewBadRequest(

View File

@ -22,6 +22,8 @@ import (
"net/http" "net/http"
"testing" "testing"
"time"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -104,37 +106,36 @@ func TestApplyStripsFields(t *testing.T) {
obj := &corev1.Pod{} obj := &corev1.Pod{}
obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}} obj.ObjectMeta.ManagedFields = []metav1.ManagedFieldsEntry{{}}
newObj, err := f.Apply(obj, []byte(`{ newObj := &corev1.Pod{
"apiVersion": "apps/v1", TypeMeta: metav1.TypeMeta{
"kind": "Deployment", APIVersion: "apps/v1",
"metadata": { Kind: "Deployment",
"name": "b", },
"namespace": "b", ObjectMeta: metav1.ObjectMeta{
"creationTimestamp": "2016-05-19T09:59:00Z", Name: "b",
"selfLink": "b", Namespace: "b",
"uid": "b", CreationTimestamp: metav1.NewTime(time.Now()),
"clusterName": "b", SelfLink: "b",
"generation": 0, UID: "b",
"managedFields": [{ ClusterName: "b",
"manager": "apply", Generation: 0,
"operation": "Apply", ManagedFields: []metav1.ManagedFieldsEntry{
"apiVersion": "apps/v1", {
"fields": { Manager: "update",
"f:metadata": { Operation: metav1.ManagedFieldsOperationApply,
"f:labels": { APIVersion: "apps/v1",
"f:test-label": {} },
} },
} ResourceVersion: "b",
} },
}], }
"resourceVersion": "b"
} updatedObj, err := f.Update(obj, newObj, "fieldmanager_test")
}`), "fieldmanager_test", false)
if err != nil { if err != nil {
t.Fatalf("failed to apply object: %v", err) t.Fatalf("failed to apply object: %v", err)
} }
accessor, err := meta.Accessor(newObj) accessor, err := meta.Accessor(updatedObj)
if err != nil { if err != nil {
t.Fatalf("couldn't get accessor: %v", err) t.Fatalf("couldn't get accessor: %v", err)
} }
@ -468,3 +469,41 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
} }
} }
} }
func TestApplyFailsWithManagedFields(t *testing.T) {
f := NewTestFieldManager()
_, err := f.Apply(&corev1.Pod{}, []byte(`{
"apiVersion": "apps/v1",
"kind": "Pod",
"metadata": {
"managedFields": [
{
"manager": "test",
}
]
}
}`), "fieldmanager_test", false)
if err == nil {
t.Fatalf("successfully applied with set managed fields")
}
}
func TestApplySuccessWithNoManagedFields(t *testing.T) {
f := NewTestFieldManager()
_, err := f.Apply(&corev1.Pod{}, []byte(`{
"apiVersion": "apps/v1",
"kind": "Pod",
"metadata": {
"labels": {
"a": "b"
},
}
}`), "fieldmanager_test", false)
if err != nil {
t.Fatalf("failed to apply object: %v", err)
}
}