From 73ec0abab28446f33aa32d6da45778d817676bf0 Mon Sep 17 00:00:00 2001 From: Hang Yan Date: Thu, 26 Dec 2019 08:53:41 +0800 Subject: [PATCH] Remove duplicate of configmap (#1206) * also change the name of the generated cm --- pkg/transformer/kubernetes/k8sutils.go | 24 ++++ pkg/transformer/kubernetes/kubernetes.go | 5 +- pkg/transformer/openshift/openshift.go | 1 + .../configmap/output-k8s-template.json | 10 +- script/test/fixtures/env/docker-compose.yml | 6 +- script/test/fixtures/env/output-k8s.json | 96 +++++++++++--- script/test/fixtures/env/output-os.json | 118 +++++++++++++++++- 7 files changed, 231 insertions(+), 29 deletions(-) diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 3b681759..7e550afd 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -581,6 +581,30 @@ func (k *Kubernetes) SortServicesFirst(objs *[]runtime.Object) { *objs = ret } +// RemoveDupObjects remove objects that are dups...eg. configmaps from env. +// since we know for sure that the duplication can only happends on ConfigMap, so +// this code will looks like this for now. +func (k *Kubernetes) RemoveDupObjects(objs *[]runtime.Object) { + var result []runtime.Object + exist := map[string]bool{} + for _, obj := range *objs { + if us, ok := obj.(*api.ConfigMap); ok { + k := us.GroupVersionKind().String() + us.GetNamespace() + us.GetName() + if exist[k] { + log.Debugf("Remove duplicate configmap: %s", us.GetName()) + continue + } else { + result = append(result, obj) + exist[k] = true + } + } else { + result = append(result, obj) + } + + } + *objs = result +} + // SortedKeys Ensure the kubernetes objects are in a consistent order func SortedKeys(komposeObject kobject.KomposeObject) []string { var sortedKeys []string diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index ae641403..980a47ea 100755 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -250,7 +250,7 @@ func (k *Kubernetes) InitConfigMapForEnv(name string, service kobject.ServiceCon APIVersion: "v1", }, ObjectMeta: api.ObjectMeta{ - Name: name + "-" + envName, + Name: envName, Labels: transformer.ConfigLabels(name + "-" + envName), }, Data: envs, @@ -835,7 +835,7 @@ func (k *Kubernetes) ConfigEnvs(name string, service kobject.ServiceConfig, opt ValueFrom: &api.EnvVarSource{ ConfigMapKeyRef: &api.ConfigMapKeySelector{ LocalObjectReference: api.LocalObjectReference{ - Name: name + "-" + envName, + Name: envName, }, Key: k, }}, @@ -1097,6 +1097,7 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject. // sort all object so Services are first k.SortServicesFirst(&allobjects) + k.RemoveDupObjects(&allobjects) return allobjects, nil } diff --git a/pkg/transformer/openshift/openshift.go b/pkg/transformer/openshift/openshift.go index 61214564..54788ee6 100644 --- a/pkg/transformer/openshift/openshift.go +++ b/pkg/transformer/openshift/openshift.go @@ -427,6 +427,7 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C // sort all object so Services are first o.SortServicesFirst(&allobjects) + o.RemoveDupObjects(&allobjects) return allobjects, nil } diff --git a/script/test/fixtures/configmap/output-k8s-template.json b/script/test/fixtures/configmap/output-k8s-template.json index 9d37e79c..0b531ee2 100644 --- a/script/test/fixtures/configmap/output-k8s-template.json +++ b/script/test/fixtures/configmap/output-k8s-template.json @@ -79,7 +79,7 @@ "name": "ALLOW_EMPTY_PASSWORD", "valueFrom": { "configMapKeyRef": { - "name": "redis-foo-env", + "name": "foo-env", "key": "ALLOW_EMPTY_PASSWORD" } } @@ -88,7 +88,7 @@ "name": "BAR", "valueFrom": { "configMapKeyRef": { - "name": "redis-bar-env", + "name": "bar-env", "key": "BAR" } } @@ -97,7 +97,7 @@ "name": "FOO", "valueFrom": { "configMapKeyRef": { - "name": "redis-bar-env", + "name": "bar-env", "key": "FOO" } } @@ -117,7 +117,7 @@ "kind": "ConfigMap", "apiVersion": "v1", "metadata": { - "name": "redis-foo-env", + "name": "foo-env", "creationTimestamp": null, "labels": { "io.kompose.service": "redis-foo-env" @@ -131,7 +131,7 @@ "kind": "ConfigMap", "apiVersion": "v1", "metadata": { - "name": "redis-bar-env", + "name": "bar-env", "creationTimestamp": null, "labels": { "io.kompose.service": "redis-bar-env" diff --git a/script/test/fixtures/env/docker-compose.yml b/script/test/fixtures/env/docker-compose.yml index 93b89633..1949dca2 100644 --- a/script/test/fixtures/env/docker-compose.yml +++ b/script/test/fixtures/env/docker-compose.yml @@ -10,4 +10,8 @@ services: - ./hadoop-hive-namenode.env ports: - "50070:50070" - - "8020:8020" \ No newline at end of file + - "8020:8020" + another-namenode: + image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8 + env_file: + - ./hadoop-hive-namenode.env \ No newline at end of file diff --git a/script/test/fixtures/env/output-k8s.json b/script/test/fixtures/env/output-k8s.json index c74112ae..27ffd45c 100644 --- a/script/test/fixtures/env/output-k8s.json +++ b/script/test/fixtures/env/output-k8s.json @@ -38,6 +38,83 @@ "loadBalancer": {} } }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "another-namenode", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "containers": [ + { + "name": "another-namenode", + "image": "bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8", + "env": [ + { + "name": "BAR", + "valueFrom": { + "configMapKeyRef": { + "name": "hadoop-hive-namenode-env", + "key": "BAR" + } + } + }, + { + "name": "FOO", + "valueFrom": { + "configMapKeyRef": { + "name": "hadoop-hive-namenode-env", + "key": "FOO" + } + } + } + ], + "resources": {} + } + ], + "restartPolicy": "Always" + } + }, + "strategy": {} + }, + "status": {} + }, + { + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "hadoop-hive-namenode-env", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode-hadoop-hive-namenode-env" + } + }, + "data": { + "BAR": "FOO", + "FOO": "BAR" + } + }, { "kind": "Deployment", "apiVersion": "extensions/v1beta1", @@ -91,7 +168,7 @@ "name": "BAR", "valueFrom": { "configMapKeyRef": { - "name": "namenode-hadoop-hive-namenode-env", + "name": "hadoop-hive-namenode-env", "key": "BAR" } } @@ -104,7 +181,7 @@ "name": "FOO", "valueFrom": { "configMapKeyRef": { - "name": "namenode-hadoop-hive-namenode-env", + "name": "hadoop-hive-namenode-env", "key": "FOO" } } @@ -128,21 +205,6 @@ }, "status": {} }, - { - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "namenode-hadoop-hive-namenode-env", - "creationTimestamp": null, - "labels": { - "io.kompose.service": "namenode-hadoop-hive-namenode-env" - } - }, - "data": { - "BAR": "FOO", - "FOO": "BAR" - } - }, { "kind": "PersistentVolumeClaim", "apiVersion": "v1", diff --git a/script/test/fixtures/env/output-os.json b/script/test/fixtures/env/output-os.json index 63140ac7..db0694ef 100644 --- a/script/test/fixtures/env/output-os.json +++ b/script/test/fixtures/env/output-os.json @@ -42,10 +42,10 @@ "kind": "ConfigMap", "apiVersion": "v1", "metadata": { - "name": "namenode-hadoop-hive-namenode-env", + "name": "hadoop-hive-namenode-env", "creationTimestamp": null, "labels": { - "io.kompose.service": "namenode-hadoop-hive-namenode-env" + "io.kompose.service": "another-namenode-hadoop-hive-namenode-env" } }, "data": { @@ -53,6 +53,116 @@ "FOO": "BAR" } }, + { + "kind": "DeploymentConfig", + "apiVersion": "v1", + "metadata": { + "name": "another-namenode", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "strategy": { + "resources": {} + }, + "triggers": [ + { + "type": "ConfigChange" + }, + { + "type": "ImageChange", + "imageChangeParams": { + "automatic": true, + "containerNames": [ + "another-namenode" + ], + "from": { + "kind": "ImageStreamTag", + "name": "another-namenode:2.0.0-hadoop2.7.4-java8" + } + } + } + ], + "replicas": 1, + "test": false, + "selector": { + "io.kompose.service": "another-namenode" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode" + } + }, + "spec": { + "containers": [ + { + "name": "another-namenode", + "image": " ", + "env": [ + { + "name": "BAR", + "valueFrom": { + "configMapKeyRef": { + "name": "hadoop-hive-namenode-env", + "key": "BAR" + } + } + }, + { + "name": "FOO", + "valueFrom": { + "configMapKeyRef": { + "name": "hadoop-hive-namenode-env", + "key": "FOO" + } + } + } + ], + "resources": {} + } + ], + "restartPolicy": "Always" + } + } + }, + "status": {} + }, + { + "kind": "ImageStream", + "apiVersion": "v1", + "metadata": { + "name": "another-namenode", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "another-namenode" + } + }, + "spec": { + "tags": [ + { + "name": "2.0.0-hadoop2.7.4-java8", + "annotations": null, + "from": { + "kind": "DockerImage", + "name": "bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8" + }, + "generation": null, + "importPolicy": {} + } + ] + }, + "status": { + "dockerImageRepository": "" + } + }, { "kind": "DeploymentConfig", "apiVersion": "v1", @@ -128,7 +238,7 @@ "name": "BAR", "valueFrom": { "configMapKeyRef": { - "name": "namenode-hadoop-hive-namenode-env", + "name": "hadoop-hive-namenode-env", "key": "BAR" } } @@ -141,7 +251,7 @@ "name": "FOO", "valueFrom": { "configMapKeyRef": { - "name": "namenode-hadoop-hive-namenode-env", + "name": "hadoop-hive-namenode-env", "key": "FOO" } }