Skip to content

Commit

Permalink
Merge pull request #979 from hangyan/restart-and-service
Browse files Browse the repository at this point in the history
Add headless service type label
  • Loading branch information
cdrage committed Apr 16, 2018
2 parents 25f8ba4 + f3412a7 commit 5fc22fd
Show file tree
Hide file tree
Showing 54 changed files with 389 additions and 801 deletions.
4 changes: 2 additions & 2 deletions docs/user-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,12 +297,12 @@ The currently supported options are:

| Key | Value |
|----------------------|-------------------------------------|
| kompose.service.type | nodeport / clusterip / loadbalancer |
| kompose.service.type | nodeport / clusterip / loadbalancer / headless |
| kompose.service.expose | true / hostname |
| kompose.service.expose.tls-secret | secret name |
| kompose.volume.size | kubernetes supported volume size |

**Note**: `kompose.service.type` label should be defined with `ports` only, otherwise `kompose` will fail.
**Note**: `kompose.service.type` label should be defined with `ports` only (except for headless service), otherwise `kompose` will fail.



Expand Down
7 changes: 6 additions & 1 deletion pkg/loader/compose/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ const (
LabelServiceExpose = "kompose.service.expose"
// LabelServiceExposeTLSSecret provides the name of the TLS secret to use with the Kubernetes ingress controller
LabelServiceExposeTLSSecret = "kompose.service.expose.tls-secret"

// ServiceTypeHeadless...
ServiceTypeHeadless = "Headless"
)

// load environment variables from compose file
Expand Down Expand Up @@ -100,8 +103,10 @@ func handleServiceType(ServiceType string) (string, error) {
return string(api.ServiceTypeNodePort), nil
case "loadbalancer":
return string(api.ServiceTypeLoadBalancer), nil
case "headless":
return ServiceTypeHeadless, nil
default:
return "", errors.New("Unknown value " + ServiceType + " , supported values are 'NodePort, ClusterIP or LoadBalancer'")
return "", errors.New("Unknown value " + ServiceType + " , supported values are 'nodeport, clusterip, headless or loadbalancer'")
}
}

Expand Down
9 changes: 7 additions & 2 deletions pkg/transformer/kubernetes/k8sutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,12 @@ func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, o
servicePorts := k.ConfigServicePorts(name, service)
svc.Spec.Ports = servicePorts

svc.Spec.Type = api.ServiceType(service.ServiceType)
if service.ServiceType == "Headless" {
svc.Spec.Type = api.ServiceTypeClusterIP
svc.Spec.ClusterIP = "None"
} else {
svc.Spec.Type = api.ServiceType(service.ServiceType)
}

// Configure annotations
annotations := transformer.ConfigAnnotations(service)
Expand All @@ -311,7 +316,7 @@ func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, o
}

// CreateHeadlessService creates a k8s headless service.
// Thi is used for docker-compose services without ports. For such services we can't create regular Kubernetes Service.
// This is used for docker-compose services without ports. For such services we can't create regular Kubernetes Service.
// and without Service Pods can't find each other using DNS names.
// Instead of regular Kubernetes Service we create Headless Service. DNS of such service points directly to Pod IP address.
// You can find more about Headless Services in Kubernetes documentation https://kubernetes.io/docs/user-guide/services/#headless-services
Expand Down
1 change: 1 addition & 0 deletions pkg/transformer/kubernetes/k8sutils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,7 @@ func TestServiceWithoutPort(t *testing.T) {
service := kobject.ServiceConfig{
ContainerName: "name",
Image: "image",
ServiceType: "Headless",
}

komposeObject := kobject.KomposeObject{
Expand Down
18 changes: 10 additions & 8 deletions pkg/transformer/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -725,15 +725,17 @@ func (k *Kubernetes) Transform(komposeObject kobject.KomposeObject, opt kobject.
objects = append(objects, pod)
} else {
objects = k.CreateKubernetesObjects(name, service, opt)
// If ports not provided in configuration we will not make service
if k.PortsExist(name, service) {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)
}

if service.ExposeService != "" {
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
} else {
if k.PortsExist(name, service) {
svc := k.CreateService(name, service, objects)
objects = append(objects, svc)

if service.ExposeService != "" {
objects = append(objects, k.initIngress(name, service, svc.Spec.Ports[0].Port))
}
} else {
if service.ServiceType == "Headless" {
svc := k.CreateHeadlessService(name, service, objects)
objects = append(objects, svc)
}
Expand Down
20 changes: 10 additions & 10 deletions pkg/transformer/openshift/openshift.go
Original file line number Diff line number Diff line change
Expand Up @@ -384,18 +384,18 @@ func (o *OpenShift) Transform(komposeObject kobject.KomposeObject, opt kobject.C
log.Infof("Buildconfig using %s::%s as source.", buildRepo, buildBranch)
}

// If ports not provided in configuration we will not make service
if o.PortsExist(name, service) {
svc := o.CreateService(name, service, objects)
objects = append(objects, svc)
}

if service.ExposeService != "" {
objects = append(objects, o.initRoute(name, service, svc.Spec.Ports[0].Port))
}
} else {
svc := o.CreateHeadlessService(name, service, objects)
objects = append(objects, svc)
if o.PortsExist(name, service) {
svc := o.CreateService(name, service, objects)
objects = append(objects, svc)

if service.ExposeService != "" {
objects = append(objects, o.initRoute(name, service, svc.Spec.Ports[0].Port))
}
} else if service.ServiceType == "Headless" {
svc := o.CreateHeadlessService(name, service, objects)
objects = append(objects, svc)
}

err := o.UpdateKubernetesObjects(name, service, opt, &objects)
Expand Down
3 changes: 2 additions & 1 deletion pkg/transformer/openshift/openshift_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -347,11 +347,12 @@ func TestInitBuildConfig(t *testing.T) {
}
}

// TestServiceWithoutPort this tests if Headless Service is created for services without Port.
// TestServiceWithoutPort this tests if Headless Service is created for services without Port (with label)
func TestServiceWithoutPort(t *testing.T) {
service := kobject.ServiceConfig{
ContainerName: "name",
Image: "image",
ServiceType: "Headless",
}

komposeObject := kobject.KomposeObject{
Expand Down
9 changes: 7 additions & 2 deletions script/test/cmd/tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -624,10 +624,14 @@ convert::expect_success "$cmd" "/tmp/output-os.json"
# Test the "full example" from https://raw.githubusercontent.com/aanand/compose-file/master/loader/example1.env

# Kubernetes
convert::expect_success_and_warning "kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-full-example.yaml" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-k8s-full-example.json"
cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-full-example.yaml"
sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-k8s-full-example.json" > /tmp/output-k8s.json
convert::expect_success_and_warning "$cmd" "/tmp/output-k8s.json"

# Openshift
convert::expect_success_and_warning "kompose convert --provider=openshift --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-full-example.yaml" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-os-full-example.json"
cmd="kompose convert --provider=openshift --stdout -j -f $KOMPOSE_ROOT/script/test/fixtures/v3/docker-compose-full-example.yaml"
sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" "$KOMPOSE_ROOT/script/test/fixtures/v3/output-os-full-example.json" > /tmp/output-os.json
convert::expect_success_and_warning "$cmd" "/tmp/output-os.json"

### Test for docker-compose files present in Examples Directory

Expand Down Expand Up @@ -688,6 +692,7 @@ convert::expect_success "$cmd" "/tmp/output-os.json"
# voting

# Kubernetes
# This test also contains headless service test (not create by default)
cmd="kompose convert --stdout -j -f $KOMPOSE_ROOT/examples/docker-voting.yaml"
sed -e "s;%VERSION%;$version;g" -e "s;%CMD%;$cmd;g" $KOMPOSE_ROOT/script/test/fixtures/examples/output-voting-k8s.json > /tmp/output-k8s.json
convert::expect_success "$cmd" "/tmp/output-k8s.json"
Expand Down
62 changes: 0 additions & 62 deletions script/test/fixtures/buildargs/output-os-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,68 +3,6 @@
"apiVersion": "v1",
"metadata": {},
"items": [
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "foo",
"creationTimestamp": null,
"labels": {
"io.kompose.service": "foo"
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.version": "%VERSION%"
}
},
"spec": {
"ports": [
{
"name": "headless",
"port": 55555,
"targetPort": 0
}
],
"selector": {
"io.kompose.service": "foo"
},
"clusterIP": "None"
},
"status": {
"loadBalancer": {}
}
},
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "foo1",
"creationTimestamp": null,
"labels": {
"io.kompose.service": "foo1"
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.version": "%VERSION%"
}
},
"spec": {
"ports": [
{
"name": "headless",
"port": 55555,
"targetPort": 0
}
],
"selector": {
"io.kompose.service": "foo1"
},
"clusterIP": "None"
},
"status": {
"loadBalancer": {}
}
},
{
"kind": "DeploymentConfig",
"apiVersion": "v1",
Expand Down
2 changes: 2 additions & 0 deletions script/test/fixtures/change-in-volume/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@ services:
- redis
redis:
image: redis
labels:
kompose.service.type: headless
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down Expand Up @@ -75,6 +76,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down Expand Up @@ -75,6 +76,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down
2 changes: 2 additions & 0 deletions script/test/fixtures/change-in-volume/output-os-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down Expand Up @@ -75,6 +76,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down
31 changes: 0 additions & 31 deletions script/test/fixtures/domain/output-k8s.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,6 @@
"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",
Expand Down
31 changes: 0 additions & 31 deletions script/test/fixtures/domain/output-os.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,6 @@
"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",
Expand Down
2 changes: 2 additions & 0 deletions script/test/fixtures/entrypoint-command/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ services:
image: busybox
entrypoint: echo
command: foo
labels:
kompose.service.type: headless
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down Expand Up @@ -45,6 +46,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down Expand Up @@ -45,6 +46,7 @@
},
"annotations": {
"kompose.cmd": "%CMD%",
"kompose.service.type": "headless",
"kompose.version": "%VERSION%"
}
},
Expand Down
Loading

0 comments on commit 5fc22fd

Please sign in to comment.