Test Headless Services

This commit is contained in:
Tomas Kral 2017-01-23 14:19:02 +01:00
parent 5a62864ef9
commit 8f2dd5b03b
No known key found for this signature in database
GPG Key ID: E690DA7E4F291FA6
4 changed files with 73 additions and 1 deletions

View File

@ -0,0 +1,27 @@
package testutils
import (
"errors"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/runtime"
)
// CheckForHeadless is helper function for tests.
// It checks if all Services in objects are Headless Services and if there is at least one such Services.
func CheckForHeadless(objects []runtime.Object) error {
serviceCreated := false
for _, obj := range objects {
if svc, ok := obj.(*api.Service); ok {
serviceCreated = true
// Check if it is a headless services
if svc.Spec.ClusterIP != "None" {
return errors.New("this is not a Headless services")
}
}
}
if !serviceCreated {
return errors.New("no Service created")
}
return nil
}

View File

@ -282,7 +282,11 @@ func (k *Kubernetes) CreateService(name string, service kobject.ServiceConfig, o
return svc
}
// CreateHeadlessService creates a k8s headless service
// 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.
// 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
func (k *Kubernetes) CreateHeadlessService(name string, service kobject.ServiceConfig, objects []runtime.Object) *api.Service {
svc := k.InitSvc(name, service)

View File

@ -24,6 +24,8 @@ import (
"path/filepath"
"github.com/kubernetes-incubator/kompose/pkg/kobject"
"github.com/kubernetes-incubator/kompose/pkg/testutils"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/extensions"
)
@ -161,3 +163,22 @@ func TestIsDir(t *testing.T) {
t.Errorf("Error removing the temporary directory during cleanup: %v", err)
}
}
// TestServiceWithoutPort this tests if Headless Service is created for services without Port.
func TestServiceWithoutPort(t *testing.T) {
service := kobject.ServiceConfig{
ContainerName: "name",
Image: "image",
}
komposeObject := kobject.KomposeObject{
ServiceConfigs: map[string]kobject.ServiceConfig{"app": service},
}
k := Kubernetes{}
objects := k.Transform(komposeObject, kobject.ConvertOptions{CreateD: true, Replicas: 1})
if err := testutils.CheckForHeadless(objects); err != nil {
t.Error(err)
}
}

View File

@ -28,6 +28,7 @@ import (
"github.com/kubernetes-incubator/kompose/pkg/kobject"
"github.com/kubernetes-incubator/kompose/pkg/testutils"
"github.com/kubernetes-incubator/kompose/pkg/transformer/kubernetes"
)
func newServiceConfig() kobject.ServiceConfig {
@ -309,3 +310,22 @@ func TestInitBuildConfig(t *testing.T) {
}
}
}
// TestServiceWithoutPort this tests if Headless Service is created for services without Port.
func TestServiceWithoutPort(t *testing.T) {
service := kobject.ServiceConfig{
ContainerName: "name",
Image: "image",
}
komposeObject := kobject.KomposeObject{
ServiceConfigs: map[string]kobject.ServiceConfig{"app": service},
}
o := OpenShift{Kubernetes: kubernetes.Kubernetes{}}
objects := o.Transform(komposeObject, kobject.ConvertOptions{CreateD: true, Replicas: 1})
if err := testutils.CheckForHeadless(objects); err != nil {
t.Error(err)
}
}