mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-14 06:15:45 +00:00
Apply will fail with managed fields + tests
This commit is contained in:
parent
65e5439faf
commit
d13420f751
@ -149,9 +149,11 @@ func (f *FieldManager) Update(liveObj, newObj runtime.Object, manager string) (r
|
|||||||
// Apply is used when server-side apply is called, as it merges the
|
// Apply is used when server-side apply is called, as it merges the
|
||||||
// object and update the managed fields.
|
// object and update the managed fields.
|
||||||
func (f *FieldManager) Apply(liveObj runtime.Object, patch []byte, fieldManager string, force bool) (runtime.Object, error) {
|
func (f *FieldManager) Apply(liveObj runtime.Object, patch []byte, fieldManager string, force bool) (runtime.Object, error) {
|
||||||
// If the object doesn't have metadata, apply isn't allowed.
|
// If the object doesn't have metadata or managed fields is not empty, apply isn't allowed.
|
||||||
if _, err := meta.Accessor(liveObj); err != nil {
|
if objMeta, err := meta.Accessor(liveObj); err != nil {
|
||||||
return nil, fmt.Errorf("couldn't get accessor: %v", err)
|
return nil, fmt.Errorf("couldn't get accessor: %v", err)
|
||||||
|
} else if objMeta.GetManagedFields() != nil && len(objMeta.GetManagedFields()) != 0 {
|
||||||
|
return nil, fmt.Errorf("apply is not allowed with managed fields set but was: %v", objMeta.GetManagedFields())
|
||||||
}
|
}
|
||||||
|
|
||||||
managed, err := internal.DecodeObjectManagedFields(liveObj)
|
managed, err := internal.DecodeObjectManagedFields(liveObj)
|
||||||
|
@ -25,6 +25,7 @@ import (
|
|||||||
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"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
@ -439,3 +440,75 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApplyFailsWithManagedFields(t *testing.T) {
|
||||||
|
f := NewTestFieldManager()
|
||||||
|
|
||||||
|
obj := &corev1.Pod{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
ManagedFields: []metav1.ManagedFieldsEntry{
|
||||||
|
{
|
||||||
|
Manager: "test",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := f.Apply(obj, []byte(`{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Pod",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"a": "b"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}`), "fieldmanager_test", false)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("successfully applied with set managed fields")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApplySuccessWithEmptyManagedFields(t *testing.T) {
|
||||||
|
f := NewTestFieldManager()
|
||||||
|
|
||||||
|
obj := &corev1.Pod{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
ManagedFields: []metav1.ManagedFieldsEntry{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := f.Apply(obj, []byte(`{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Pod",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"a": "b"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}`), "fieldmanager_test", false)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to apply object: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApplySuccessWithNilManagedFields(t *testing.T) {
|
||||||
|
f := NewTestFieldManager()
|
||||||
|
|
||||||
|
obj := &corev1.Pod{}
|
||||||
|
|
||||||
|
_, err := f.Apply(obj, []byte(`{
|
||||||
|
"apiVersion": "apps/v1",
|
||||||
|
"kind": "Pod",
|
||||||
|
"metadata": {
|
||||||
|
"labels": {
|
||||||
|
"a": "b"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}`), "fieldmanager_test", false)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to apply object: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user