1
0
mirror of https://github.com/coreos/prometheus-operator.git synced 2026-02-05 06:45:27 +01:00

chore: simplify pvc tests

Signed-off-by: Simon Pasquier <spasquie@redhat.com>
This commit is contained in:
Simon Pasquier
2025-08-01 15:01:06 +02:00
parent 99f0cfdba6
commit 4d7dde5f90
3 changed files with 87 additions and 56 deletions

View File

@@ -41,7 +41,6 @@ import (
certutil "k8s.io/client-go/util/cert"
"k8s.io/utils/ptr"
"github.com/prometheus-operator/prometheus-operator/pkg/alertmanager"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
monitoringv1alpha1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1alpha1"
monitoringv1beta1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1beta1"
@@ -212,6 +211,11 @@ func testAMStorageUpdate(t *testing.T) {
monitoringv1.AlertmanagerSpec{
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
Labels: map[string]string{
"test": "testAMStorageUpdate",
},
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.VolumeResourceRequirements{
@@ -226,29 +230,10 @@ func testAMStorageUpdate(t *testing.T) {
)
require.NoError(t, err)
err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) {
pods, err := framework.KubeClient.CoreV1().Pods(ns).List(ctx, alertmanager.ListOptions(name))
if err != nil {
return false, err
}
if len(pods.Items) != 1 {
return false, nil
}
for _, volume := range pods.Items[0].Spec.Volumes {
if volume.Name == "alertmanager-"+name+"-db" && volume.PersistentVolumeClaim != nil && volume.PersistentVolumeClaim.ClaimName != "" {
return true, nil
}
}
return false, nil
})
err = framework.WaitForBoundPVC(context.Background(), ns, "test=testAMStorageUpdate", 1)
require.NoError(t, err)
// Invalid storageclass e2e test
_, err = framework.PatchAlertmanager(
context.Background(),
am.Name,
@@ -256,6 +241,11 @@ func testAMStorageUpdate(t *testing.T) {
monitoringv1.AlertmanagerSpec{
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
Labels: map[string]string{
"test": "testAMStorageUpdate",
},
},
Spec: v1.PersistentVolumeClaimSpec{
StorageClassName: ptr.To("unknown-storage-class"),
Resources: v1.VolumeResourceRequirements{
@@ -270,22 +260,23 @@ func testAMStorageUpdate(t *testing.T) {
)
require.NoError(t, err)
var loopError error
var pollErr error
err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) {
current, err := framework.MonClientV1.Alertmanagers(ns).Get(ctx, name, metav1.GetOptions{})
if err != nil {
loopError = fmt.Errorf("failed to get object: %w", err)
pollErr = fmt.Errorf("failed to get object: %w", err)
return false, nil
}
if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err == nil {
return true, nil
if err := framework.AssertCondition(current.Status.Conditions, monitoringv1.Reconciled, monitoringv1.ConditionFalse); err != nil {
pollErr = err
return false, nil
}
return false, nil
return true, nil
})
require.NoError(t, err, "%v: %v", err, loopError)
require.NoError(t, err, "%v: %v", err, pollErr)
}
func testAMExposingWithKubernetesAPI(t *testing.T) {

View File

@@ -1042,6 +1042,11 @@ func testPromStorageUpdate(t *testing.T) {
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
Labels: map[string]string{
"test": "testPromStorageUpdate",
},
},
Spec: v1.PersistentVolumeClaimSpec{
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
Resources: v1.VolumeResourceRequirements{
@@ -1055,35 +1060,12 @@ func testPromStorageUpdate(t *testing.T) {
},
},
)
if err != nil {
t.Fatal(err)
}
require.NoError(t, err)
err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, 2*time.Minute, false, func(ctx context.Context) (bool, error) {
pods, err := framework.KubeClient.CoreV1().Pods(ns).List(ctx, prometheus.ListOptions(p.Name))
if err != nil {
return false, err
}
if len(pods.Items) != 1 {
return false, nil
}
for _, volume := range pods.Items[0].Spec.Volumes {
if volume.Name == "prometheus-"+p.Name+"-db" && volume.PersistentVolumeClaim != nil && volume.PersistentVolumeClaim.ClaimName != "" {
return true, nil
}
}
return false, nil
})
if err != nil {
t.Fatal(err)
}
err = framework.WaitForBoundPVC(context.Background(), ns, "test=testPromStorageUpdate", 1)
require.NoError(t, err)
// Invalid storageclass e2e test
_, err = framework.PatchPrometheus(
context.Background(),
p.Name,
@@ -1092,6 +1074,11 @@ func testPromStorageUpdate(t *testing.T) {
CommonPrometheusFields: monitoringv1.CommonPrometheusFields{
Storage: &monitoringv1.StorageSpec{
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
Labels: map[string]string{
"test": "testPromStorageUpdate",
},
},
Spec: v1.PersistentVolumeClaimSpec{
StorageClassName: ptr.To("unknown-storage-class"),
Resources: v1.VolumeResourceRequirements{
@@ -1105,9 +1092,7 @@ func testPromStorageUpdate(t *testing.T) {
},
},
)
if err != nil {
t.Fatal(err)
}
require.NoError(t, err)
var loopError error
err = wait.PollUntilContextTimeout(context.Background(), 5*time.Second, framework.DefaultTimeout, true, func(ctx context.Context) (bool, error) {

55
test/framework/storage.go Normal file
View File

@@ -0,0 +1,55 @@
// Copyright 2025 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"
"fmt"
"time"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
)
func (f *Framework) WaitForBoundPVC(ctx context.Context, ns string, labelSelector string, expected int) error {
var pollErr error
err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 2*time.Minute, true, func(ctx context.Context) (bool, error) {
pvcs, err := f.KubeClient.CoreV1().PersistentVolumeClaims(ns).List(ctx, metav1.ListOptions{LabelSelector: labelSelector})
if err != nil {
pollErr = err
return false, nil
}
if len(pvcs.Items) != expected {
pollErr = fmt.Errorf("expecting %d pvcs, got %d", expected, len(pvcs.Items))
return false, nil
}
for _, pvc := range pvcs.Items {
if pvc.Status.Phase != v1.ClaimBound {
pollErr = fmt.Errorf("expecting PVC %s to have Bound phase, got %q", pvc.Name, pvc.Status.Phase)
return false, nil
}
}
return true, nil
})
if err != nil {
return fmt.Errorf("%w: %w", err, pollErr)
}
return nil
}