mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-10 12:32:03 +00:00
Moved managed fields validation to server-side apply
This commit is contained in:
parent
d13420f751
commit
d61b833161
@ -149,11 +149,9 @@ 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 or managed fields is not empty, apply isn't allowed.
|
// If the object doesn't have metadata, apply isn't allowed.
|
||||||
if objMeta, err := meta.Accessor(liveObj); err != nil {
|
if _, 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)
|
||||||
@ -166,6 +164,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(
|
||||||
|
@ -25,7 +25,6 @@ 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"
|
||||||
@ -444,23 +443,15 @@ func BenchmarkRepeatedUpdate(b *testing.B) {
|
|||||||
func TestApplyFailsWithManagedFields(t *testing.T) {
|
func TestApplyFailsWithManagedFields(t *testing.T) {
|
||||||
f := NewTestFieldManager()
|
f := NewTestFieldManager()
|
||||||
|
|
||||||
obj := &corev1.Pod{
|
_, err := f.Apply(&corev1.Pod{}, []byte(`{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
ManagedFields: []metav1.ManagedFieldsEntry{
|
|
||||||
{
|
|
||||||
Manager: "test",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := f.Apply(obj, []byte(`{
|
|
||||||
"apiVersion": "apps/v1",
|
"apiVersion": "apps/v1",
|
||||||
"kind": "Pod",
|
"kind": "Pod",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"labels": {
|
"managedFields": [
|
||||||
"a": "b"
|
{
|
||||||
},
|
"manager": "test",
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}`), "fieldmanager_test", false)
|
}`), "fieldmanager_test", false)
|
||||||
|
|
||||||
@ -469,36 +460,10 @@ func TestApplyFailsWithManagedFields(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestApplySuccessWithEmptyManagedFields(t *testing.T) {
|
func TestApplySuccessWithNoManagedFields(t *testing.T) {
|
||||||
f := NewTestFieldManager()
|
f := NewTestFieldManager()
|
||||||
|
|
||||||
obj := &corev1.Pod{
|
_, err := f.Apply(&corev1.Pod{}, []byte(`{
|
||||||
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",
|
"apiVersion": "apps/v1",
|
||||||
"kind": "Pod",
|
"kind": "Pod",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
|
Loading…
Reference in New Issue
Block a user