From 37135a4ecfc3fced378543159da3a554ab94b771 Mon Sep 17 00:00:00 2001 From: Simon Schneider Date: Wed, 11 Nov 2020 09:31:42 +0100 Subject: [PATCH] add serviceType for the collector service (#1286) Signed-off-by: Simon Schneider --- deploy/crds/jaegertracing.io_jaegers_crd.yaml | 2 ++ examples/service-types.yaml | 9 ++++++++ go.sum | 3 ++- pkg/apis/jaegertracing/v1/jaeger_types.go | 7 ++++++ .../jaegertracing/v1/zz_generated.openapi.go | 7 ++++++ pkg/service/collector.go | 11 +++++++++- pkg/service/collector_test.go | 13 +++++++++++ test/e2e/examples2_test.go | 22 +++++++++++++++++++ 8 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 examples/service-types.yaml diff --git a/deploy/crds/jaegertracing.io_jaegers_crd.yaml b/deploy/crds/jaegertracing.io_jaegers_crd.yaml index c1ed0fa6a..5822e235a 100644 --- a/deploy/crds/jaegertracing.io_jaegers_crd.yaml +++ b/deploy/crds/jaegertracing.io_jaegers_crd.yaml @@ -2662,6 +2662,8 @@ spec: type: object serviceAccount: type: string + serviceType: + type: string tolerations: items: properties: diff --git a/examples/service-types.yaml b/examples/service-types.yaml new file mode 100644 index 000000000..b4d8c4113 --- /dev/null +++ b/examples/service-types.yaml @@ -0,0 +1,9 @@ +apiVersion: jaegertracing.io/v1 +kind: Jaeger +metadata: + name: service-types +spec: + query: + serviceType: LoadBalancer + collector: + serviceType: LoadBalancer diff --git a/go.sum b/go.sum index c0b7a5436..e1e5fa440 100644 --- a/go.sum +++ b/go.sum @@ -782,6 +782,7 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1582,4 +1583,4 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= \ No newline at end of file +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/pkg/apis/jaegertracing/v1/jaeger_types.go b/pkg/apis/jaegertracing/v1/jaeger_types.go index 339c7e682..5ed876c8b 100644 --- a/pkg/apis/jaegertracing/v1/jaeger_types.go +++ b/pkg/apis/jaegertracing/v1/jaeger_types.go @@ -392,6 +392,13 @@ type JaegerCollectorSpec struct { // +optional Config FreeForm `json:"config,omitempty"` + + // +optional + // ServiceType represents the type of Service to create. + // Valid values include: ClusterIP, NodePort, LoadBalancer, and ExternalName. + // The default, if omitted, is ClusterIP. + // See https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types + ServiceType v1.ServiceType `json:"serviceType,omitempty"` } // JaegerIngesterSpec defines the options to be used when deploying the ingester diff --git a/pkg/apis/jaegertracing/v1/zz_generated.openapi.go b/pkg/apis/jaegertracing/v1/zz_generated.openapi.go index d26aba21f..f94f6325b 100644 --- a/pkg/apis/jaegertracing/v1/zz_generated.openapi.go +++ b/pkg/apis/jaegertracing/v1/zz_generated.openapi.go @@ -686,6 +686,13 @@ func schema_pkg_apis_jaegertracing_v1_JaegerCollectorSpec(ref common.ReferenceCa Ref: ref("./pkg/apis/jaegertracing/v1.FreeForm"), }, }, + "serviceType": { + SchemaProps: spec.SchemaProps{ + Description: "ServiceType represents the type of Service to create. Valid values include: ClusterIP, NodePort, LoadBalancer, and ExternalName. The default, if omitted, is ClusterIP. See https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, diff --git a/pkg/service/collector.go b/pkg/service/collector.go index 2a66521fe..a7adc6833 100644 --- a/pkg/service/collector.go +++ b/pkg/service/collector.go @@ -32,7 +32,9 @@ func headlessCollectorService(jaeger *v1.Jaeger, selector map[string]string) *co } func clusteripCollectorService(jaeger *v1.Jaeger, selector map[string]string) *corev1.Service { - return collectorService(jaeger, selector) + svc := collectorService(jaeger, selector) + svc.Spec.Type = getTypeForCollectorService(jaeger) + return svc } func collectorService(jaeger *v1.Jaeger, selector map[string]string) *corev1.Service { @@ -121,3 +123,10 @@ func GetPortNameForGRPC(jaeger *v1.Jaeger) string { // doesn't look like we have TLS enabled return "http-grpc" } + +func getTypeForCollectorService(jaeger *v1.Jaeger) corev1.ServiceType { + if jaeger.Spec.Collector.ServiceType != "" { + return jaeger.Spec.Collector.ServiceType + } + return corev1.ServiceTypeClusterIP +} diff --git a/pkg/service/collector_test.go b/pkg/service/collector_test.go index b3e8dcb72..f5f2cd041 100644 --- a/pkg/service/collector_test.go +++ b/pkg/service/collector_test.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/viper" "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" v1 "github.com/jaegertracing/jaeger-operator/pkg/apis/jaegertracing/v1" @@ -130,3 +131,15 @@ func TestCollectorGRPCPortName(t *testing.T) { }) } } + +func TestCollectorServiceLoadBalancer(t *testing.T) { + name := "TestCollectorServiceLoadBalancer" + selector := map[string]string{"app": "myapp", "jaeger": name, "jaeger-component": "collector"} + + jaeger := v1.NewJaeger(types.NamespacedName{Name: name}) + jaeger.Spec.Collector.ServiceType = corev1.ServiceTypeLoadBalancer + svc := NewCollectorServices(jaeger, selector) + + // Only the non-headless service will receive the type + assert.Equal(t, svc[1].Spec.Type, corev1.ServiceTypeLoadBalancer) +} diff --git a/test/e2e/examples2_test.go b/test/e2e/examples2_test.go index a5b73ae75..70f2c63da 100644 --- a/test/e2e/examples2_test.go +++ b/test/e2e/examples2_test.go @@ -3,9 +3,12 @@ package e2e import ( + "context" + "fmt" "testing" "github.com/sirupsen/logrus" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" framework "github.com/operator-framework/operator-sdk/pkg/test" "github.com/stretchr/testify/require" @@ -63,6 +66,25 @@ func (suite *ExamplesTestSuite2) TestWithBadgerAndVolumeExample() { smokeTestAllInOneExample("with-badger-and-volume", "../../examples/with-badger-and-volume.yaml") } +func (suite *ExamplesTestSuite2) TestServiceTypesExample() { + yamlFileName := "../../examples/service-types.yaml" + name := "service-types" + jaegerInstance := createJaegerInstanceFromFile(name, yamlFileName) + defer undeployJaegerInstance(jaegerInstance) + + err := WaitForDeployment(t, fw.KubeClient, namespace, name, 1, retryInterval, timeout) + require.NoErrorf(t, err, "Error waiting for %s to deploy", name) + + AllInOneSmokeTest(name) + + collectorService, err := fw.KubeClient.CoreV1().Services(namespace).Get(context.Background(), fmt.Sprintf("%s-collector", name), v1.GetOptions{}) + require.NoError(t, err) + require.Equal(t, "LoadBalancer", string(collectorService.Spec.Type)) + queryService, err := fw.KubeClient.CoreV1().Services(namespace).Get(context.Background(), fmt.Sprintf("%s-query", name), v1.GetOptions{}) + require.NoError(t, err) + require.Equal(t, "LoadBalancer", string(queryService.Spec.Type)) +} + func (suite *ExamplesTestSuite2) TestSimpleProdWithVolumes() { yamlFileName := "../../examples/simple-prod-with-volumes.yaml" smokeTestProductionExample("simple-prod", yamlFileName)