From 88b8e316b9bc94aff51f45ae07eced0dedb994ef Mon Sep 17 00:00:00 2001 From: Hang Yan Date: Sat, 31 Mar 2018 11:59:11 +0800 Subject: [PATCH] Support hostname and domainname --- docs/conversion.md | 2 + pkg/kobject/kobject.go | 2 + pkg/loader/compose/compose.go | 2 - pkg/loader/compose/compose_test.go | 2 +- pkg/loader/compose/v1v2.go | 2 + pkg/loader/compose/v3.go | 2 + pkg/transformer/kubernetes/k8sutils.go | 9 ++ script/test/cmd/tests.sh | 30 +++- .../fixtures/domain/docker-compose-v3.yaml | 6 + .../test/fixtures/domain/docker-compose.yaml | 6 + script/test/fixtures/domain/output-k8s.json | 78 +++++++++++ script/test/fixtures/domain/output-os.json | 130 ++++++++++++++++++ .../fixtures/v3/output-k8s-full-example.json | 4 +- .../fixtures/v3/output-os-full-example.json | 4 +- 14 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 script/test/fixtures/domain/docker-compose-v3.yaml create mode 100644 script/test/fixtures/domain/docker-compose.yaml create mode 100644 script/test/fixtures/domain/output-k8s.json create mode 100644 script/test/fixtures/domain/output-os.json diff --git a/docs/conversion.md b/docs/conversion.md index 25a50fb6..7d156530 100644 --- a/docs/conversion.md +++ b/docs/conversion.md @@ -40,6 +40,7 @@ __Glossary:__ | depends_on | x | x | x | | | | dns | x | x | x | | Not used within Kubernetes. Kubernetes uses a managed DNS server | | dns_search | x | x | x | | See `dns` key | +| dommainname | ✓ | ✓ | ✓ | Pod.Spec.SubDomain | | tmpfs | ✓ | ✓ | ✓ | Pod.Spec.Containers.Volumes.EmptyDir | Creates emptyDirvolume with medium set to Memory & mounts given directory inside container | | entrypoint | ✓ | ✓ | ✓ | Pod.Spec.Container.Command | Same as command | | env_file | n | n | ✓ | | | @@ -50,6 +51,7 @@ __Glossary:__ | extra_hosts | n | n | n | | | | group_add | ✓ | ✓ | ✓ | | | | healthcheck | - | n | ✓ | | | +| hostname | ✓ | ✓ | ✓ | Pod.Spec.HostName | | | image | ✓ | ✓ | ✓ | Deployment.Spec.Containers.Image | | | isolation | x | x | x | | Not applicable as this applies to Windows with HyperV support | | labels | ✓ | ✓ | ✓ | Metadata.Annotations | | diff --git a/pkg/kobject/kobject.go b/pkg/kobject/kobject.go index 40e44953..7952fb53 100644 --- a/pkg/kobject/kobject.go +++ b/pkg/kobject/kobject.go @@ -69,6 +69,8 @@ type ServiceConfig struct { Port []Ports `compose:"ports"` Command []string `compose:"command"` WorkingDir string `compose:""` + DomainName string `compose:"domainname"` + HostName string `compose:"hostname"` Args []string `compose:"args"` VolList []string `compose:"volumes"` Network []string `compose:"network"` diff --git a/pkg/loader/compose/compose.go b/pkg/loader/compose/compose.go index e019c110..45b7bf13 100644 --- a/pkg/loader/compose/compose.go +++ b/pkg/loader/compose/compose.go @@ -53,11 +53,9 @@ func checkUnsupportedKey(composeProject *project.Project) []string { "DependsOn": false, "DNS": false, "DNSSearch": false, - "DomainName": false, "EnvFile": false, "ExternalLinks": false, "ExtraHosts": false, - "Hostname": false, "Ipc": false, "Logging": false, "MacAddress": false, diff --git a/pkg/loader/compose/compose_test.go b/pkg/loader/compose/compose_test.go index e8888610..db5c1767 100644 --- a/pkg/loader/compose/compose_test.go +++ b/pkg/loader/compose/compose_test.go @@ -318,7 +318,7 @@ func TestUnsupportedKeys(t *testing.T) { }{ "With Networks (service and root level)": { projectWithNetworks, - []string{"root level networks", "root level volumes", "hostname", "networks"}, + []string{"root level networks", "root level volumes", "networks"}, }, "Empty Networks on Service level": { projectWithEmptyNetwork, diff --git a/pkg/loader/compose/v1v2.go b/pkg/loader/compose/v1v2.go index 0cccd5fa..9d985564 100644 --- a/pkg/loader/compose/v1v2.go +++ b/pkg/loader/compose/v1v2.go @@ -199,6 +199,8 @@ func libComposeToKomposeMapping(composeObject *project.Project) (kobject.Kompose log.Infof("Container name in service %q has been changed from %q to %q", name, composeServiceConfig.ContainerName, newName) } serviceConfig.Command = composeServiceConfig.Entrypoint + serviceConfig.HostName = composeServiceConfig.Hostname + serviceConfig.DomainName = composeServiceConfig.DomainName serviceConfig.Args = composeServiceConfig.Command serviceConfig.Dockerfile = composeServiceConfig.Build.Dockerfile serviceConfig.BuildArgs = composeServiceConfig.Build.Args diff --git a/pkg/loader/compose/v3.go b/pkg/loader/compose/v3.go index 0b6fd4d2..f0553a92 100644 --- a/pkg/loader/compose/v3.go +++ b/pkg/loader/compose/v3.go @@ -241,6 +241,8 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose serviceConfig.Command = composeServiceConfig.Entrypoint serviceConfig.Args = composeServiceConfig.Command serviceConfig.Labels = composeServiceConfig.Labels + serviceConfig.HostName = composeServiceConfig.Hostname + serviceConfig.DomainName = composeServiceConfig.DomainName // // Deploy keys diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 8f0e6eab..5a69321e 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -514,6 +514,15 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic default: return errors.New("Unknown restart policy " + service.Restart + " for service " + name) } + + // Configure hostname/domain_name settings + if service.HostName != "" { + template.Spec.Hostname = service.HostName + } + if service.DomainName != "" { + template.Spec.Subdomain = service.DomainName + } + return nil } diff --git a/script/test/cmd/tests.sh b/script/test/cmd/tests.sh index 3e1c1498..cc558155 100755 --- a/script/test/cmd/tests.sh +++ b/script/test/cmd/tests.sh @@ -261,6 +261,30 @@ cmd="kompose -f $KOMPOSE_ROOT/script/test/fixtures/restart-options/docker-compos sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/restart-options/output-os-restart-unless-stopped.json" > /tmp/output-os.json convert::expect_success_and_warning "$cmd" /tmp/output-os.json + + +##### +# Test related to hostname/domainname in docker-compose +# kubernetes test +cmd="kompose -f $KOMPOSE_ROOT/script/test/fixtures/domain/docker-compose.yaml convert --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/domain/output-k8s.json" > /tmp/output-k8s.json +convert::expect_success "$cmd" /tmp/output-k8s.json + +cmd="kompose -f $KOMPOSE_ROOT/script/test/fixtures/domain/docker-compose-v3.yaml convert --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/domain/output-k8s.json" > /tmp/output-k8s.json +convert::expect_success "$cmd" /tmp/output-k8s.json + + +# openshift test +cmd="kompose --provider openshift -f $KOMPOSE_ROOT/script/test/fixtures/domain/docker-compose.yaml convert --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/domain/output-os.json" > /tmp/output-os.json +convert::expect_success "$cmd" /tmp/output-os.json + +cmd="kompose --provider openshift -f $KOMPOSE_ROOT/script/test/fixtures/domain/docker-compose-v3.yaml convert --stdout -j" +sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/domain/output-os.json" > /tmp/output-os.json +convert::expect_success "$cmd" /tmp/output-os.json + + ###### # Test key-only environment variable export $(cat $KOMPOSE_ROOT/script/test/fixtures/keyonly-envs/envs) @@ -448,9 +472,9 @@ sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/f convert::expect_success_and_warning "$cmd" "/tmp/output-k8s.json" "Volume mount on the host "\"."\" isn't supported - ignoring path on the host" #Failing test for `--volumes` option -convert::expect_failure "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/change-in-volume/docker-compose.yaml --volumes foobar" +convert::expect_failure "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/change-in-volume/docker-compose.yml --volumes foobar" -# Test related to support docker-compose.yaml beside docker-compose.yml +# Test related to support docker-compose.yml beside docker-compose.yml # Store the original path CURRENT_DIR=$(pwd) # Kubernets test @@ -543,7 +567,7 @@ convert::expect_success "$cmd" "/tmp/output-k8s.json" # Test that two files that are different versions fail -convert::expect_failure "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose.yaml -f $KOMPOSE_ROOT/script/test/fixtures/etherpad/docker-compose.yml" +convert::expect_failure "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose.yaml -f $KOMPOSE_ROOT/script/test/fixtures/etherpad/docker-compose.yaml" # Kubernetes cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose.yaml" diff --git a/script/test/fixtures/domain/docker-compose-v3.yaml b/script/test/fixtures/domain/docker-compose-v3.yaml new file mode 100644 index 00000000..6b454969 --- /dev/null +++ b/script/test/fixtures/domain/docker-compose-v3.yaml @@ -0,0 +1,6 @@ +version: '3' +services: + dns: + image: phensley/docker-dns + hostname: affy + domainname: affy.com diff --git a/script/test/fixtures/domain/docker-compose.yaml b/script/test/fixtures/domain/docker-compose.yaml new file mode 100644 index 00000000..23cc8107 --- /dev/null +++ b/script/test/fixtures/domain/docker-compose.yaml @@ -0,0 +1,6 @@ +version: 2 +services: + dns: + image: phensley/docker-dns + hostname: affy + domainname: affy.com diff --git a/script/test/fixtures/domain/output-k8s.json b/script/test/fixtures/domain/output-k8s.json new file mode 100644 index 00000000..8839a950 --- /dev/null +++ b/script/test/fixtures/domain/output-k8s.json @@ -0,0 +1,78 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "dns", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "ports": [ + { + "name": "headless", + "port": 55555, + "targetPort": 0 + } + ], + "selector": { + "io.kompose.service": "dns" + }, + "clusterIP": "None" + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "Deployment", + "apiVersion": "extensions/v1beta1", + "metadata": { + "name": "dns", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "replicas": 1, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + } + }, + "spec": { + "containers": [ + { + "name": "dns", + "image": "phensley/docker-dns", + "resources": {} + } + ], + "restartPolicy": "Always", + "hostname": "affy", + "subdomain": "affy.com" + } + }, + "strategy": {} + }, + "status": {} + } + ] +} diff --git a/script/test/fixtures/domain/output-os.json b/script/test/fixtures/domain/output-os.json new file mode 100644 index 00000000..1192ae37 --- /dev/null +++ b/script/test/fixtures/domain/output-os.json @@ -0,0 +1,130 @@ +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "dns", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "ports": [ + { + "name": "headless", + "port": 55555, + "targetPort": 0 + } + ], + "selector": { + "io.kompose.service": "dns" + }, + "clusterIP": "None" + }, + "status": { + "loadBalancer": {} + } + }, + { + "kind": "DeploymentConfig", + "apiVersion": "v1", + "metadata": { + "name": "dns", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + }, + "annotations": { + "kompose.cmd": "%CMD%", + "kompose.version": "%VERSION%" + } + }, + "spec": { + "strategy": { + "resources": {} + }, + "triggers": [ + { + "type": "ConfigChange" + }, + { + "type": "ImageChange", + "imageChangeParams": { + "automatic": true, + "containerNames": [ + "dns" + ], + "from": { + "kind": "ImageStreamTag", + "name": "dns:latest" + } + } + } + ], + "replicas": 1, + "test": false, + "selector": { + "io.kompose.service": "dns" + }, + "template": { + "metadata": { + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + } + }, + "spec": { + "containers": [ + { + "name": "dns", + "image": " ", + "resources": {} + } + ], + "restartPolicy": "Always", + "hostname": "affy", + "subdomain": "affy.com" + } + } + }, + "status": {} + }, + { + "kind": "ImageStream", + "apiVersion": "v1", + "metadata": { + "name": "dns", + "creationTimestamp": null, + "labels": { + "io.kompose.service": "dns" + } + }, + "spec": { + "tags": [ + { + "name": "latest", + "annotations": null, + "from": { + "kind": "DockerImage", + "name": "phensley/docker-dns" + }, + "generation": null, + "importPolicy": {} + } + ] + }, + "status": { + "dockerImageRepository": "" + } + } + ] +} diff --git a/script/test/fixtures/v3/output-k8s-full-example.json b/script/test/fixtures/v3/output-k8s-full-example.json index fce1c23f..a5541b69 100644 --- a/script/test/fixtures/v3/output-k8s-full-example.json +++ b/script/test/fixtures/v3/output-k8s-full-example.json @@ -223,7 +223,9 @@ "tty": true } ], - "restartPolicy": "OnFailure" + "restartPolicy": "OnFailure", + "hostname": "foo", + "subdomain": "foo.com" }, "status": {} }, diff --git a/script/test/fixtures/v3/output-os-full-example.json b/script/test/fixtures/v3/output-os-full-example.json index fce1c23f..a5541b69 100644 --- a/script/test/fixtures/v3/output-os-full-example.json +++ b/script/test/fixtures/v3/output-os-full-example.json @@ -223,7 +223,9 @@ "tty": true } ], - "restartPolicy": "OnFailure" + "restartPolicy": "OnFailure", + "hostname": "foo", + "subdomain": "foo.com" }, "status": {} },