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 {
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() {
return nil,
errors.NewBadRequest(

View File

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