You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by al...@apache.org on 2019/12/16 18:41:32 UTC

[camel-k] branch master updated: Added unit tests for the prometheus trait #255

This is an automated email from the ASF dual-hosted git repository.

aldettinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/master by this push:
     new f292de4  Added unit tests for the prometheus trait #255
f292de4 is described below

commit f292de4e0fc6df6c331e4e98b012bd3da93217b8
Author: aldettinger <al...@gmail.com>
AuthorDate: Fri Dec 13 19:52:24 2019 +0100

    Added unit tests for the prometheus trait #255
---
 pkg/trait/prometheus_test.go      | 215 ++++++++++++++++++++++++++++++++++++++
 pkg/util/kubernetes/collection.go |  19 ++++
 2 files changed, 234 insertions(+)

diff --git a/pkg/trait/prometheus_test.go b/pkg/trait/prometheus_test.go
new file mode 100644
index 0000000..78addd4
--- /dev/null
+++ b/pkg/trait/prometheus_test.go
@@ -0,0 +1,215 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package trait
+
+import (
+	"context"
+	"testing"
+
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+	"github.com/apache/camel-k/pkg/util/test"
+
+	"github.com/stretchr/testify/assert"
+
+	monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
+
+	appsv1 "k8s.io/api/apps/v1"
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func TestConfigurePrometheusTraitInRightPhaseDoesSucceed(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+
+	configured, err := trait.Configure(environment)
+
+	assert.Nil(t, err)
+	assert.True(t, configured)
+}
+
+func TestConfigurePrometheusTraitInWrongPhaseDoesNotSucceed(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+	environment.Integration.Status.Phase = v1alpha1.IntegrationPhaseResolvingKit
+
+	configured, err := trait.Configure(environment)
+
+	assert.Nil(t, err)
+	assert.False(t, configured)
+}
+
+func TestApplyNominalPrometheusTraitDoesSucceed(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+
+	err := trait.Apply(environment)
+
+	assert.Nil(t, err)
+
+	container := environment.Resources.GetContainerByName(defaultContainerName)
+	assert.NotNil(t, container)
+	test.EnvVarHasValue(t, container.Env, "AB_PROMETHEUS_PORT", "9779")
+	ports := container.Ports
+	assert.Len(t, ports, 1)
+	assert.Equal(t, "prometheus", ports[0].Name)
+	assert.Equal(t, int32(9779), ports[0].ContainerPort)
+	assert.Equal(t, corev1.ProtocolTCP, ports[0].Protocol)
+
+	service := environment.Resources.GetService(func(service *corev1.Service) bool {
+		return service.Name == "integration-name"
+	})
+	assert.NotNil(t, service)
+	assert.Len(t, service.Spec.Ports, 1)
+
+	serviceMonitor := environment.Resources.GetServiceMonitor(func(service *monitoringv1.ServiceMonitor) bool {
+		return service.Name == "integration-name"
+	})
+	assert.NotNil(t, serviceMonitor)
+
+	assert.Len(t, environment.Integration.Status.Conditions, 1)
+	condition := environment.Integration.Status.Conditions[0]
+	assert.Equal(t, v1alpha1.IntegrationConditionPrometheusAvailable, condition.Type)
+	assert.Equal(t, corev1.ConditionTrue, condition.Status)
+}
+
+func TestApplyPrometheusTraitWithoutContainerDoesNotSucceed(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+	environment.Resources = kubernetes.NewCollection()
+
+	err := trait.Apply(environment)
+
+	assert.Nil(t, err)
+
+	assert.Len(t, environment.Integration.Status.Conditions, 1)
+	condition := environment.Integration.Status.Conditions[0]
+	assert.Equal(t, v1alpha1.IntegrationConditionPrometheusAvailable, condition.Type)
+	assert.Equal(t, corev1.ConditionFalse, condition.Status)
+}
+
+func TestApplyPrometheusTraitWithServiceDoesNotSucceed(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+	environment.Resources = kubernetes.NewCollection(
+		&appsv1.Deployment{
+			Spec: appsv1.DeploymentSpec{
+				Template: corev1.PodTemplateSpec{
+					Spec: corev1.PodSpec{
+						Containers: []corev1.Container{
+							{
+								Name: defaultContainerName,
+							},
+						},
+					},
+				},
+			},
+		},
+		&corev1.Service{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Service",
+				APIVersion: "v1",
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Name:      "service-name",
+				Namespace: "namespace",
+				Labels: map[string]string{
+					"camel.apache.org/integration":  "integration-name",
+					"camel.apache.org/service.type": v1alpha1.ServiceTypeUser,
+				},
+			},
+			Spec: corev1.ServiceSpec{
+				Ports: []corev1.ServicePort{},
+				Selector: map[string]string{
+					"camel.apache.org/integration": "integration-name",
+				},
+			},
+		})
+
+	err := trait.Apply(environment)
+
+	assert.Nil(t, err)
+
+	assert.Len(t, environment.Integration.Status.Conditions, 1)
+	condition := environment.Integration.Status.Conditions[0]
+	assert.Equal(t, v1alpha1.IntegrationConditionServiceNotAvailableReason, condition.Reason)
+	assert.Equal(t, corev1.ConditionFalse, condition.Status)
+}
+
+func TestApplyDisabledPrometheusTraitShouldDeactivateJavaAgent(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+	trait.Enabled = new(bool)
+
+	err := trait.Apply(environment)
+
+	assert.Nil(t, err)
+
+	container := environment.Resources.GetContainerByName(defaultContainerName)
+	assert.NotNil(t, container)
+	test.EnvVarHasValue(t, container.Env, "AB_PROMETHEUS_OFF", "true")
+}
+
+func TestPrometheusTraitGetServiceMonitor(t *testing.T) {
+	trait, environment := createNominalPrometheusTest()
+
+	serviceMonitor, err := trait.getServiceMonitorFor(environment)
+
+	assert.Nil(t, err)
+
+	assert.NotNil(t, serviceMonitor)
+	assert.Equal(t, "ServiceMonitor", serviceMonitor.Kind)
+	assert.Equal(t, "monitoring.coreos.com/v1", serviceMonitor.APIVersion)
+	assert.Equal(t, "integration-name", serviceMonitor.Name)
+	assert.Equal(t, "integration-namespace", serviceMonitor.Namespace)
+	assert.Equal(t, "integration-name", serviceMonitor.Labels["camel.apache.org/integration"])
+	assert.Equal(t, "integration-name", serviceMonitor.Spec.Selector.MatchLabels["camel.apache.org/integration"])
+	assert.Len(t, serviceMonitor.Spec.Endpoints, 1)
+	assert.Equal(t, "prometheus", serviceMonitor.Spec.Endpoints[0].Port)
+}
+
+func createNominalPrometheusTest() (*prometheusTrait, *Environment) {
+	trait := newPrometheusTrait()
+	enabled := true
+	trait.Enabled = &enabled
+
+	environment := &Environment{
+		Catalog: NewCatalog(context.TODO(), nil),
+		Integration: &v1alpha1.Integration{
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "integration-namespace",
+				Name:      "integration-name",
+			},
+			Status: v1alpha1.IntegrationStatus{
+				Phase: v1alpha1.IntegrationPhaseDeploying,
+			},
+		},
+		Resources: kubernetes.NewCollection(
+			&appsv1.Deployment{
+				Spec: appsv1.DeploymentSpec{
+					Template: corev1.PodTemplateSpec{
+						Spec: corev1.PodSpec{
+							Containers: []corev1.Container{
+								{
+									Name: defaultContainerName,
+								},
+							},
+						},
+					},
+				},
+			},
+		),
+	}
+
+	return trait, environment
+}
diff --git a/pkg/util/kubernetes/collection.go b/pkg/util/kubernetes/collection.go
index d825a78..9ba325b 100644
--- a/pkg/util/kubernetes/collection.go
+++ b/pkg/util/kubernetes/collection.go
@@ -19,6 +19,7 @@ package kubernetes
 
 import (
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+	monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
 	routev1 "github.com/openshift/api/route/v1"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
@@ -348,3 +349,21 @@ func (c *Collection) Remove(selector func(runtime.Object) bool) runtime.Object {
 	}
 	return nil
 }
+
+func (c *Collection) VisitServiceMonitor(visitor func(*monitoringv1.ServiceMonitor)) {
+	c.Visit(func(res runtime.Object) {
+		if conv, ok := res.(*monitoringv1.ServiceMonitor); ok {
+			visitor(conv)
+		}
+	})
+}
+
+func (c *Collection) GetServiceMonitor(filter func(*monitoringv1.ServiceMonitor) bool) *monitoringv1.ServiceMonitor {
+	var retValue *monitoringv1.ServiceMonitor
+	c.VisitServiceMonitor(func(serviceMonitor *monitoringv1.ServiceMonitor) {
+		if filter(serviceMonitor) {
+			retValue = serviceMonitor
+		}
+	})
+	return retValue
+}