1
0
Fork 0
mirror of https://github.com/prometheus-operator/prometheus-operator.git synced 2025-04-16 01:06:27 +00:00
prometheus-operator/pkg/prometheus/server/operator_test.go
xuwentao e6fbc67c2f
enhance: change thanos sidecar promethes.http-client params to prometheus.http-client-file and save config file in secret (#7029)
* enchance: change thanos sidecar promethes.http-client params to prometheus.http-client-file and save config file in secret

* Update pkg/prometheus/server/operator.go

---------

Co-authored-by: Simon Pasquier <spasquie@redhat.com>
2024-10-29 13:57:59 +01:00

266 lines
7.4 KiB
Go

// Copyright 2017 The prometheus-operator Authors
//
// Licensed 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 prometheus
import (
"context"
"testing"
"github.com/stretchr/testify/require"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/utils/ptr"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/prometheus-operator/prometheus-operator/pkg/operator"
prompkg "github.com/prometheus-operator/prometheus-operator/pkg/prometheus"
)
func TestListOptions(t *testing.T) {
for i := 0; i < 1000; i++ {
o := ListOptions("test")
require.True(t, (o.LabelSelector == "app.kubernetes.io/name=prometheus,prometheus=test" || o.LabelSelector == "prometheus=test,app.kubernetes.io/name=prometheus"), "LabelSelector not computed correctly\n\nExpected: \"app.kubernetes.io/name=prometheus,prometheus=test\"\n\nGot: %#+v", o.LabelSelector)
}
}
func TestCreateStatefulSetInputHash(t *testing.T) {
falseVal := false
for _, tc := range []struct {
name string
a, b monitoringv1.Prometheus
equal bool
}{
{
name: "different generations",
a: monitoringv1.Prometheus{
ObjectMeta: metav1.ObjectMeta{
Generation: 1,
},
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.0",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("200Mi"),
},
},
},
},
},
b: monitoringv1.Prometheus{
ObjectMeta: metav1.ObjectMeta{
Generation: 2,
},
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.0",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("100Mi"),
},
},
},
},
},
},
{
// differrent resource.Quantity produce the same hash because the
// struct contains private fields that aren't integrated into the
// hash computation.
name: "different specs but same hash",
a: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.0",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("200Mi"),
},
},
},
},
},
b: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.0",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("100Mi"),
},
},
},
},
},
equal: true,
},
{
name: "same hash with different status",
a: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Paused: true,
Version: "v1.7.2",
},
},
},
b: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Paused: true,
Version: "v1.7.2",
},
},
Status: monitoringv1.PrometheusStatus{
Paused: true,
},
},
equal: true,
},
{
name: "different labels",
a: monitoringv1.Prometheus{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{"foo": "bar"},
},
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
},
},
},
b: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
},
},
},
equal: false,
},
{
name: "different annotations",
a: monitoringv1.Prometheus{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{"foo": "bar"},
},
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
},
},
},
b: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
},
},
},
equal: false,
},
{
name: "different web http2",
a: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
Web: &monitoringv1.PrometheusWebSpec{
WebConfigFileFields: monitoringv1.WebConfigFileFields{
HTTPConfig: &monitoringv1.WebHTTPConfig{
HTTP2: &falseVal,
},
},
},
},
},
},
b: monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Version: "v1.7.2",
},
},
},
equal: false,
},
} {
t.Run(tc.name, func(t *testing.T) {
c := prompkg.Config{}
p1Hash, err := createSSetInputHash(tc.a, c, []string{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{})
require.NoError(t, err)
p2Hash, err := createSSetInputHash(tc.b, c, []string{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{})
require.NoError(t, err)
if !tc.equal {
require.NotEqual(t, p1Hash, p2Hash, "expected two different Prometheus CRDs to produce different hashes but got equal hash")
return
}
require.Equal(t, p1Hash, p2Hash, "expected two Prometheus CRDs to produce the same hash but got different hash")
p2Hash, err = createSSetInputHash(tc.a, c, []string{}, &operator.ShardedSecret{}, appsv1.StatefulSetSpec{Replicas: ptr.To(int32(2))})
require.NoError(t, err)
require.NotEqual(t, p1Hash, p2Hash, "expected same Prometheus CRDs with different statefulset specs to produce different hashes but got equal hash")
})
}
}
func TestCreateThanosConfigSecret(t *testing.T) {
version := "v0.24.0"
ctx := context.Background()
for _, tc := range []struct {
name string
spec monitoringv1.PrometheusSpec
}{
{
name: "prometheus with thanos sidecar",
spec: monitoringv1.PrometheusSpec{
Thanos: &monitoringv1.ThanosSpec{
Version: &version,
},
},
},
} {
t.Run(tc.name, func(t *testing.T) {
p := &monitoringv1.Prometheus{
ObjectMeta: metav1.ObjectMeta{
Name: "test-create-thanos-config-secret",
Namespace: "test",
},
Spec: tc.spec,
}
o := Operator{kclient: fake.NewClientset()}
err := o.createOrUpdateThanosConfigSecret(ctx, p)
require.NoError(t, err)
get, err := o.kclient.CoreV1().Secrets("test").Get(ctx, thanosPrometheusHTTPClientConfigSecretName(p), metav1.GetOptions{})
require.NoError(t, err)
require.Equal(t, "tls_config:\n insecure_skip_verify: true\n", string(get.Data[thanosPrometheusHTTPClientConfigFileName]))
})
}
}