From 8f2dd5b03b70c387e26e4c0fbf06060470307e85 Mon Sep 17 00:00:00 2001 From: Tomas Kral Date: Mon, 23 Jan 2017 14:19:02 +0100 Subject: [PATCH] Test Headless Services --- pkg/testutils/kubernetes.go | 27 +++++++++++++++++++++ pkg/transformer/kubernetes/k8sutils.go | 6 ++++- pkg/transformer/kubernetes/k8sutils_test.go | 21 ++++++++++++++++ pkg/transformer/openshift/openshift_test.go | 20 +++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 pkg/testutils/kubernetes.go diff --git a/pkg/testutils/kubernetes.go b/pkg/testutils/kubernetes.go new file mode 100644 index 00000000..305db81f --- /dev/null +++ b/pkg/testutils/kubernetes.go @@ -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 +} diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index 76bfb743..00d3bf4d 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -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) diff --git a/pkg/transformer/kubernetes/k8sutils_test.go b/pkg/transformer/kubernetes/k8sutils_test.go index 55a413c5..9da4dde6 100644 --- a/pkg/transformer/kubernetes/k8sutils_test.go +++ b/pkg/transformer/kubernetes/k8sutils_test.go @@ -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) + } + +} diff --git a/pkg/transformer/openshift/openshift_test.go b/pkg/transformer/openshift/openshift_test.go index 330bbe63..efec3a32 100644 --- a/pkg/transformer/openshift/openshift_test.go +++ b/pkg/transformer/openshift/openshift_test.go @@ -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) + } + +}