From dc5866a7818f17bd9976176ba0bcba48aa806c6a Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Fri, 1 Jun 2018 22:24:03 +0000 Subject: [PATCH] conversions: don't mutate in.ObjectMeta.Annotations --- pkg/api/testing/serialization_test.go | 3 +++ pkg/apis/apps/v1/conversion.go | 17 ++++++++++++++--- pkg/apis/apps/v1beta2/conversion.go | 16 +++++++++++++--- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/pkg/api/testing/serialization_test.go b/pkg/api/testing/serialization_test.go index 39f60d2992f..d94fb0f06be 100644 --- a/pkg/api/testing/serialization_test.go +++ b/pkg/api/testing/serialization_test.go @@ -299,6 +299,9 @@ func TestObjectWatchFraming(t *testing.T) { f := fuzzer.FuzzerFor(FuzzerFuncs, rand.NewSource(benchmarkSeed), legacyscheme.Codecs) secret := &api.Secret{} f.Fuzz(secret) + if secret.Data == nil { + secret.Data = map[string][]byte{} + } secret.Data["binary"] = []byte{0x00, 0x10, 0x30, 0x55, 0xff, 0x00} secret.Data["utf8"] = []byte("a string with \u0345 characters") secret.Data["long"] = bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x00}, 1000) diff --git a/pkg/apis/apps/v1/conversion.go b/pkg/apis/apps/v1/conversion.go index 0908f7fc2bb..565430b0e96 100644 --- a/pkg/apis/apps/v1/conversion.go +++ b/pkg/apis/apps/v1/conversion.go @@ -182,6 +182,7 @@ func Convert_v1_Deployment_To_extensions_Deployment(in *appsv1.Deployment, out * out.Spec.RollbackTo = new(extensions.RollbackConfig) out.Spec.RollbackTo.Revision = revision64 } + out.Annotations = deepCopyStringMap(out.Annotations) delete(out.Annotations, appsv1.DeprecatedRollbackTo) } else { out.Spec.RollbackTo = nil @@ -195,6 +196,8 @@ func Convert_v1_Deployment_To_extensions_Deployment(in *appsv1.Deployment, out * func Convert_extensions_Deployment_To_v1_Deployment(in *extensions.Deployment, out *appsv1.Deployment, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta + out.Annotations = deepCopyStringMap(out.Annotations) // deep copy because we modify it below + if err := Convert_extensions_DeploymentSpec_To_v1_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { return err } @@ -235,9 +238,8 @@ func Convert_v1_RollingUpdateDaemonSet_To_extensions_RollingUpdateDaemonSet(in * func Convert_extensions_DaemonSet_To_v1_DaemonSet(in *extensions.DaemonSet, out *appsv1.DaemonSet, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if out.Annotations == nil { - out.Annotations = make(map[string]string) - } + out.Annotations = deepCopyStringMap(out.Annotations) // deep copy annotations because we change them below + out.Annotations[appsv1.DeprecatedTemplateGeneration] = strconv.FormatInt(in.Spec.TemplateGeneration, 10) if err := Convert_extensions_DaemonSetSpec_To_v1_DaemonSetSpec(&in.Spec, &out.Spec, s); err != nil { return err @@ -287,6 +289,7 @@ func Convert_v1_DaemonSet_To_extensions_DaemonSet(in *appsv1.DaemonSet, out *ext return err } else { out.Spec.TemplateGeneration = value64 + out.Annotations = deepCopyStringMap(out.Annotations) delete(out.Annotations, appsv1.DeprecatedTemplateGeneration) } } @@ -496,3 +499,11 @@ func Convert_apps_StatefulSetStatus_To_v1_StatefulSetStatus(in *apps.StatefulSet } return nil } + +func deepCopyStringMap(m map[string]string) map[string]string { + ret := make(map[string]string, len(m)) + for k, v := range m { + ret[k] = v + } + return ret +} diff --git a/pkg/apis/apps/v1beta2/conversion.go b/pkg/apis/apps/v1beta2/conversion.go index f71de4f28e7..a3671668fcb 100644 --- a/pkg/apis/apps/v1beta2/conversion.go +++ b/pkg/apis/apps/v1beta2/conversion.go @@ -415,6 +415,7 @@ func Convert_v1beta2_Deployment_To_extensions_Deployment(in *appsv1beta2.Deploym out.Spec.RollbackTo = new(extensions.RollbackConfig) out.Spec.RollbackTo.Revision = revision64 } + out.Annotations = deepCopyStringMap(out.Annotations) delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo) } else { out.Spec.RollbackTo = nil @@ -440,6 +441,8 @@ func Convert_v1beta2_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *appsv1beta2 func Convert_extensions_Deployment_To_v1beta2_Deployment(in *extensions.Deployment, out *appsv1beta2.Deployment, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta + out.Annotations = deepCopyStringMap(out.Annotations) // deep copy because we modify annotations below + if err := Convert_extensions_DeploymentSpec_To_v1beta2_DeploymentSpec(&in.Spec, &out.Spec, s); err != nil { return err } @@ -463,9 +466,7 @@ func Convert_extensions_Deployment_To_v1beta2_Deployment(in *extensions.Deployme func Convert_extensions_DaemonSet_To_v1beta2_DaemonSet(in *extensions.DaemonSet, out *appsv1beta2.DaemonSet, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if out.Annotations == nil { - out.Annotations = make(map[string]string) - } + out.Annotations = deepCopyStringMap(out.Annotations) out.Annotations[appsv1beta2.DeprecatedTemplateGeneration] = strconv.FormatInt(in.Spec.TemplateGeneration, 10) if err := Convert_extensions_DaemonSetSpec_To_v1beta2_DaemonSetSpec(&in.Spec, &out.Spec, s); err != nil { return err @@ -515,6 +516,7 @@ func Convert_v1beta2_DaemonSet_To_extensions_DaemonSet(in *appsv1beta2.DaemonSet return err } else { out.Spec.TemplateGeneration = value64 + out.Annotations = deepCopyStringMap(out.Annotations) delete(out.Annotations, appsv1beta2.DeprecatedTemplateGeneration) } } @@ -552,3 +554,11 @@ func Convert_v1beta2_DaemonSetUpdateStrategy_To_extensions_DaemonSetUpdateStrate } return nil } + +func deepCopyStringMap(m map[string]string) map[string]string { + ret := make(map[string]string, len(m)) + for k, v := range m { + ret[k] = v + } + return ret +}