From 2f8e8fa3af4b8adce5562dd1a033fd37ea8244d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Wiesm=C3=BCller?= Date: Mon, 18 Feb 2019 11:44:07 +0100 Subject: [PATCH 1/3] add fieldmanager tests for stripFields --- .../fieldmanager/fieldmanager_test.go | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go new file mode 100644 index 00000000000..29d690152f1 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -0,0 +1,140 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fieldmanager_test + +import ( + "errors" + "testing" + "time" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" +) + +type mockObjectConvertor struct{} + +func (c *mockObjectConvertor) Convert(in, out, context interface{}) error { + out = in + return nil +} + +func (c *mockObjectConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) { + return in, nil +} + +func (c *mockObjectConvertor) ConvertFieldLabel(_ schema.GroupVersionKind, _, _ string) (string, string, error) { + return "", "", errors.New("not implemented") +} + +type mockObjectDefaulter struct{} + +func (d *mockObjectDefaulter) Default(in runtime.Object) {} + +func NewTestFieldManager(t *testing.T) *fieldmanager.FieldManager { + gv := schema.GroupVersion{ + Group: "apps", + Version: "v1", + } + + return fieldmanager.NewCRDFieldManager( + &mockObjectConvertor{}, + &mockObjectDefaulter{}, + gv, + gv, + ) +} + +func TestFieldManagerCreation(t *testing.T) { + _ = NewTestFieldManager(t) +} + +func TestApplyStripsFields(t *testing.T) { + f := NewTestFieldManager(t) + + obj := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "a", + Namespace: "a", + CreationTimestamp: metav1.Time{Time: time.Now().UTC()}, + SelfLink: "a", + }, + } + + newObj, err := f.Apply(obj, []byte(`{ + "apiVersion": "v1", + "kind": "Deployment", + "metadata": { + "name": "b", + "namespace": "b", + "creationTimestamp": "`+time.Now().UTC().Format(time.RFC3339)+`", + "selfLink": "b", + "uid": "b", + "resourceVersion": "b" + } + }`), false) + if err != nil { + t.Fatalf("failed to apply object: %v", err) + } + + accessor, err := meta.Accessor(newObj) + if err != nil { + t.Fatalf("couldn't get accessor: %v", err) + } + + if m := accessor.GetManagedFields(); len(m) != 0 { + t.Fatalf("fields did not get stripped on apply: %v", m) + } +} +func TestApplyDoesNotStripLabels(t *testing.T) { + f := NewTestFieldManager(t) + + obj := &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "a", + Namespace: "a", + CreationTimestamp: metav1.Time{Time: time.Now().UTC()}, + SelfLink: "a", + }, + } + + newObj, err := f.Apply(obj, []byte(`{ + "apiVersion": "v1", + "kind": "Pod", + "metadata": { + "labels": { + "a": "b" + }, + } + }`), false) + if err != nil { + t.Fatalf("failed to apply object: %v", err) + } + + accessor, err := meta.Accessor(newObj) + if err != nil { + t.Fatalf("couldn't get accessor: %v", err) + } + + if m := accessor.GetManagedFields(); len(m) != 1 { + t.Fatalf("labels shouldn't get stripped on apply: %v", m) + } +} + From 96d4fa7e4678430046d8fee98bc715f385242e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Wiesm=C3=BCller?= Date: Tue, 19 Feb 2019 19:13:49 +0100 Subject: [PATCH 2/3] rename mocks to fakes and add nil check --- .../pkg/endpoints/handlers/fieldmanager/BUILD | 15 ++++++++++- .../fieldmanager/fieldmanager_test.go | 26 ++++++++++--------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD index 9efbdb642c7..6abb2845a93 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/BUILD @@ -1,4 +1,4 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -34,3 +34,16 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) + +go_test( + name = "go_default_test", + srcs = ["fieldmanager_test.go"], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + ], +) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go index 29d690152f1..5685f7d809e 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -29,24 +29,24 @@ import ( "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" ) -type mockObjectConvertor struct{} +type fakeObjectConvertor struct{} -func (c *mockObjectConvertor) Convert(in, out, context interface{}) error { +func (c *fakeObjectConvertor) Convert(in, out, context interface{}) error { out = in return nil } -func (c *mockObjectConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) { +func (c *fakeObjectConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) { return in, nil } -func (c *mockObjectConvertor) ConvertFieldLabel(_ schema.GroupVersionKind, _, _ string) (string, string, error) { +func (c *fakeObjectConvertor) ConvertFieldLabel(_ schema.GroupVersionKind, _, _ string) (string, string, error) { return "", "", errors.New("not implemented") } -type mockObjectDefaulter struct{} +type fakeObjectDefaulter struct{} -func (d *mockObjectDefaulter) Default(in runtime.Object) {} +func (d *fakeObjectDefaulter) Default(in runtime.Object) {} func NewTestFieldManager(t *testing.T) *fieldmanager.FieldManager { gv := schema.GroupVersion{ @@ -55,25 +55,28 @@ func NewTestFieldManager(t *testing.T) *fieldmanager.FieldManager { } return fieldmanager.NewCRDFieldManager( - &mockObjectConvertor{}, - &mockObjectDefaulter{}, + &fakeObjectConvertor{}, + &fakeObjectDefaulter{}, gv, gv, ) } func TestFieldManagerCreation(t *testing.T) { - _ = NewTestFieldManager(t) + if NewTestFieldManager(t) == nil { + t.Fatal("failed to create FieldManager") + } } func TestApplyStripsFields(t *testing.T) { f := NewTestFieldManager(t) + ti, _ := time.Parse(time.RFC3339, "2016-05-19T09:59:00Z") obj := &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "a", Namespace: "a", - CreationTimestamp: metav1.Time{Time: time.Now().UTC()}, + CreationTimestamp: metav1.Time{Time: ti}, SelfLink: "a", }, } @@ -84,7 +87,7 @@ func TestApplyStripsFields(t *testing.T) { "metadata": { "name": "b", "namespace": "b", - "creationTimestamp": "`+time.Now().UTC().Format(time.RFC3339)+`", + "creationTimestamp": "`+ti.Add(1*time.Minute).Format(time.RFC3339)+`", "selfLink": "b", "uid": "b", "resourceVersion": "b" @@ -137,4 +140,3 @@ func TestApplyDoesNotStripLabels(t *testing.T) { t.Fatalf("labels shouldn't get stripped on apply: %v", m) } } - From 332bb15476ed6f7ef0b55a5a3a3a735b915ccee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Wiesm=C3=BCller?= Date: Tue, 19 Feb 2019 20:17:33 +0100 Subject: [PATCH 3/3] hardcode time --- .../endpoints/handlers/fieldmanager/fieldmanager_test.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go index 5685f7d809e..c4edbc2adae 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -70,13 +70,12 @@ func TestFieldManagerCreation(t *testing.T) { func TestApplyStripsFields(t *testing.T) { f := NewTestFieldManager(t) - ti, _ := time.Parse(time.RFC3339, "2016-05-19T09:59:00Z") obj := &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "a", Namespace: "a", - CreationTimestamp: metav1.Time{Time: ti}, + CreationTimestamp: metav1.Time{Time: time.Time{}}, SelfLink: "a", }, } @@ -87,7 +86,7 @@ func TestApplyStripsFields(t *testing.T) { "metadata": { "name": "b", "namespace": "b", - "creationTimestamp": "`+ti.Add(1*time.Minute).Format(time.RFC3339)+`", + "creationTimestamp": "2016-05-19T09:59:00Z", "selfLink": "b", "uid": "b", "resourceVersion": "b" @@ -113,7 +112,7 @@ func TestApplyDoesNotStripLabels(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Name: "a", Namespace: "a", - CreationTimestamp: metav1.Time{Time: time.Now().UTC()}, + CreationTimestamp: metav1.Time{Time: time.Time{}}, SelfLink: "a", }, }