diff --git a/pkg/loader/compose/v3.go b/pkg/loader/compose/v3.go index 10bb3367..94e1ecfa 100644 --- a/pkg/loader/compose/v3.go +++ b/pkg/loader/compose/v3.go @@ -635,6 +635,26 @@ func mergeComposeObject(oldCompose *types.Config, newCompose *types.Config) (*ty oldCompose.Services[index] = tmpOldService } + // Merge the networks information + for idx, network := range newCompose.Networks { + oldCompose.Networks[idx] = network + } + + // Merge the volumes information + for idx, volume := range newCompose.Volumes { + oldCompose.Volumes[idx] = volume + } + + // Merge the secrets information + for idx, secret := range newCompose.Secrets { + oldCompose.Secrets[idx] = secret + } + + // Merge the configs information + for idx, config := range newCompose.Configs { + oldCompose.Configs[idx] = config + } + return oldCompose, nil } diff --git a/script/test/cmd/tests.sh b/script/test/cmd/tests.sh index d4dcf45b..e61b7e8f 100755 --- a/script/test/cmd/tests.sh +++ b/script/test/cmd/tests.sh @@ -140,6 +140,17 @@ cmd="kompose --provider=openshift convert -f $KOMPOSE_ROOT/script/test/fixtures/ sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/output-openshift-template.json > /tmp/output-os.json convert::expect_success "$cmd" "/tmp/output-os.json" +# Test other top level keys +# In merge +cmd="kompose convert -f $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/other-toplevel-dev.yml -f $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/other-toplevel-ext.yml --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/output-other-toplevel-merge-template.json > /tmp/output-k8s.json +convert::expect_success "$cmd" "/tmp/output-k8s.json" + +# In Override +cmd="kompose convert -f $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/other-toplevel-base.yml -f $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/other-toplevel-override.yml --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/fixtures/merge-multiple-compose/output-other-toplevel-override-template.json > /tmp/output-k8s.json +convert::expect_success "$cmd" "/tmp/output-k8s.json" + ###### # Tests related to docker-compose file in /script/test/fixtures/ports-with-proto # kubernetes test diff --git a/script/test/fixtures/merge-multiple-compose/first_config.txt b/script/test/fixtures/merge-multiple-compose/first_config.txt new file mode 100644 index 00000000..5af95a1b --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/first_config.txt @@ -0,0 +1 @@ +First config diff --git a/script/test/fixtures/merge-multiple-compose/other-toplevel-base.yml b/script/test/fixtures/merge-multiple-compose/other-toplevel-base.yml new file mode 100644 index 00000000..18f5db9a --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/other-toplevel-base.yml @@ -0,0 +1,15 @@ +version: "3.3" + +services: + other-toplevel-base: + image: nginx + volumes: + - firstvolume:/var/www/nginx + configs: + - source: firstconfig + target: /etc/nginx.conf + mode: 644 + +configs: + firstconfig: + file: ./first_config.txt diff --git a/script/test/fixtures/merge-multiple-compose/other-toplevel-dev.yml b/script/test/fixtures/merge-multiple-compose/other-toplevel-dev.yml new file mode 100644 index 00000000..b2ffc033 --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/other-toplevel-dev.yml @@ -0,0 +1,20 @@ +version: "3.3" + +services: + other-toplevel-dev: + image: nginx + volumes: + - firstvolume:/var/www/nginx + configs: + - source: firstconfig + target: /etc/nginx.conf + mode: 644 + +volumes: + firstvolume: + driver_opts: + type: "nfs" + +configs: + firstconfig: + file: ./first_config.txt diff --git a/script/test/fixtures/merge-multiple-compose/other-toplevel-ext.yml b/script/test/fixtures/merge-multiple-compose/other-toplevel-ext.yml new file mode 100644 index 00000000..3aeacb60 --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/other-toplevel-ext.yml @@ -0,0 +1,19 @@ +version: "3.3" + +services: + other-toplevel-second: + image: nginx + volumes: + - secondvolume:/var/www/nginx + configs: + - source: secondconfig + target: /etc/nginx.conf + mode: 644 + +volumes: + secondvolume: + external: true + +configs: + secondconfig: + file: ./second_config.txt diff --git a/script/test/fixtures/merge-multiple-compose/other-toplevel-override.yml b/script/test/fixtures/merge-multiple-compose/other-toplevel-override.yml new file mode 100644 index 00000000..7ce65d05 --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/other-toplevel-override.yml @@ -0,0 +1,9 @@ +version: "3.3" + +volumes: + firstvolume: + external: true + +configs: + firstconfig: + file: ./second_config.txt diff --git a/script/test/fixtures/merge-multiple-compose/output-other-toplevel-merge-template.json b/script/test/fixtures/merge-multiple-compose/output-other-toplevel-merge-template.json new file mode 100644 index 00000000..2d3cfa7a --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/output-other-toplevel-merge-template.json @@ -0,0 +1,217 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "firstconfig", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-dev" + } + }, + "data": { + "first-config.txt": "First config\n" + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "other-toplevel-dev", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-dev" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-dev" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "volumes": [ + { + "name": "firstconfig", + "configMap": { + "name": "firstconfig", + "defaultMode": 644 + } + }, + { + "name": "firstvolume", + "persistentVolumeClaim": { + "claimName": "firstvolume" + } + } + ], + "containers": [ + { + "name": "other-toplevel-dev", + "image": "nginx", + "resources": {}, + "volumeMounts": [ + { + "name": "firstconfig", + "mountPath": "/nginx.conf" + }, + { + "name": "firstvolume", + "mountPath": "/var/www/nginx" + } + ] + } + ], + "restartPolicy": "Always" + } + }, + "strategy": { + "type": "Recreate" + } + }, + "status": {} + }, + { + "kind": "PersistentVolumeClaim", + "apiVersion": "v1", + "metadata": { + "name": "firstvolume", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "firstvolume" + } + }, + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "resources": { + "requests": { + "storage": "100Mi" + } + } + }, + "status": {} + }, + { + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "secondconfig", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-second" + } + }, + "data": { + "second-config.txt": "Second config\n" + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "other-toplevel-second", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-second" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-second" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "volumes": [ + { + "name": "secondconfig", + "configMap": { + "name": "secondconfig", + "defaultMode": 644 + } + }, + { + "name": "secondvolume", + "persistentVolumeClaim": { + "claimName": "secondvolume" + } + } + ], + "containers": [ + { + "name": "other-toplevel-second", + "image": "nginx", + "resources": {}, + "volumeMounts": [ + { + "name": "secondconfig", + "mountPath": "/nginx.conf" + }, + { + "name": "secondvolume", + "mountPath": "/var/www/nginx" + } + ] + } + ], + "restartPolicy": "Always" + } + }, + "strategy": { + "type": "Recreate" + } + }, + "status": {} + }, + { + "kind": "PersistentVolumeClaim", + "apiVersion": "v1", + "metadata": { + "name": "secondvolume", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "secondvolume" + } + }, + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "resources": { + "requests": { + "storage": "100Mi" + } + } + }, + "status": {} + } + ] +} diff --git a/script/test/fixtures/merge-multiple-compose/output-other-toplevel-override-template.json b/script/test/fixtures/merge-multiple-compose/output-other-toplevel-override-template.json new file mode 100644 index 00000000..b7354e1b --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/output-other-toplevel-override-template.json @@ -0,0 +1,112 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "ConfigMap", + "apiVersion": "v1", + "metadata": { + "name": "firstconfig", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-base" + } + }, + "data": { + "second-config.txt": "Second config\n" + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "other-toplevel-base", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-base" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "other-toplevel-base" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "volumes": [ + { + "name": "firstconfig", + "configMap": { + "name": "firstconfig", + "defaultMode": 644 + } + }, + { + "name": "firstvolume", + "persistentVolumeClaim": { + "claimName": "firstvolume" + } + } + ], + "containers": [ + { + "name": "other-toplevel-base", + "image": "nginx", + "resources": {}, + "volumeMounts": [ + { + "name": "firstconfig", + "mountPath": "/nginx.conf" + }, + { + "name": "firstvolume", + "mountPath": "/var/www/nginx" + } + ] + } + ], + "restartPolicy": "Always" + } + }, + "strategy": { + "type": "Recreate" + } + }, + "status": {} + }, + { + "kind": "PersistentVolumeClaim", + "apiVersion": "v1", + "metadata": { + "name": "firstvolume", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "firstvolume" + } + }, + "spec": { + "accessModes": [ + "ReadWriteOnce" + ], + "resources": { + "requests": { + "storage": "100Mi" + } + } + }, + "status": {} + } + ] +} diff --git a/script/test/fixtures/merge-multiple-compose/second_config.txt b/script/test/fixtures/merge-multiple-compose/second_config.txt new file mode 100644 index 00000000..edd602b2 --- /dev/null +++ b/script/test/fixtures/merge-multiple-compose/second_config.txt @@ -0,0 +1 @@ +Second config