Merge pull request #81453 from joshmsamuels/master
Apply will fail with managed fields + tests
This commit is contained in:
		@@ -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(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
						}
 | 
					
 | 
				
			||||||
					}
 | 
						updatedObj, err := f.Update(obj, newObj, "fieldmanager_test")
 | 
				
			||||||
				}],
 | 
					 | 
				
			||||||
			"resourceVersion": "b"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}`), "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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user