1
0
mirror of https://github.com/coreos/prometheus-operator.git synced 2026-02-05 06:45:27 +01:00
Files
prometheus-operator/test/framework/config_map.go
Simon Pasquier 80553769d5 feat: avoid statefulset's rollout due to new rule configmaps
This commit avoids the situation where the operator would update the
StatefulSet because the concatenation of configured rules exceeds the
maximum ConfigMap size. To alleviate the issue, the operator now
configures the StatefulSet to always mount 3 "rule" ConfigMaps with
"optional: true". When the operator generates an additional ConfigMap,
it will get mounted automatically into the pod and the config-reloader
sidecar will detect and apply the new configuration. When the
number of "concrete" ConfigMaps decreases, the operation is also
non-disruptive.

The number has been chosen arbitrarily and it could change in the future
but 3 seems a good choice (original reports were complaining about the
number of ConfigMaps fluctuating between 1 and 2).

The change applies both to Prometheus and ThanosRuler.

Closes #5085

Signed-off-by: Simon Pasquier <spasquie@redhat.com>
2025-10-15 11:04:23 +02:00

104 lines
2.4 KiB
Go

// Copyright 2016 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 framework
import (
"context"
"errors"
"fmt"
"time"
v1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
)
func MakeConfigMapWithCert(ns, name, keyKey, certKey, caKey string,
keyBytes, certBytes, caBytes []byte) *v1.ConfigMap {
cm := &v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns},
Data: map[string]string{},
}
if keyBytes != nil {
cm.Data[keyKey] = string(keyBytes)
}
if certBytes != nil {
cm.Data[certKey] = string(certBytes)
}
if caBytes != nil {
cm.Data[caKey] = string(caBytes)
}
return cm
}
func (f *Framework) WaitForConfigMapExist(ctx context.Context, ns, name string) (*v1.ConfigMap, error) {
var (
configMap *v1.ConfigMap
getErr error
)
err := wait.PollUntilContextTimeout(ctx, 2*time.Second, f.DefaultTimeout, true, func(ctx context.Context) (bool, error) {
configMap, getErr = f.
KubeClient.
CoreV1().
ConfigMaps(ns).
Get(ctx, name, metav1.GetOptions{})
if getErr != nil {
return false, nil
}
return true, nil
})
if err != nil {
return nil, fmt.Errorf("%w: %w", err, getErr)
}
return configMap, nil
}
func (f *Framework) WaitForConfigMapNotExist(ctx context.Context, ns, name string) error {
var getErr error
err := wait.PollUntilContextTimeout(ctx, 2*time.Second, f.DefaultTimeout, true, func(ctx context.Context) (bool, error) {
_, getErr = f.
KubeClient.
CoreV1().
ConfigMaps(ns).
Get(ctx, name, metav1.GetOptions{})
if getErr != nil {
if apierrors.IsNotFound(getErr) {
return true, nil
}
return false, nil
}
getErr = errors.New("configmap found")
return false, nil
})
if err != nil {
return fmt.Errorf("%w: %w", err, getErr)
}
return nil
}