Skip to content

Commit 6a580b8

Browse files
authored
More reliable system tests (#1086)
* Dynamically check for PVC expansion support in tests Previously, it was the responsibility of whoever was running the system tests to decide if PVC expansion was supported or not. In addition, the tests created a storageClass with the gce-pd Provider, in order to ensure there was a storageClass available that supported expansion. This Provider is deprecated, and in modern gke versions supports expansion anyway, removing the need for a bespoke class. This change now dynamically queries the k8s API for the default storage class, and checks if it supports expansion or not. If it does not, the expansion test is skipped as before (e.g. in kind). If it does, the test proceeds, using this default class. This also means the tests should now be able to be run in non-GKE environments with storage drivers that support PVC expansion. * Parse RMQ version for clustering test
1 parent 70821f8 commit 6a580b8

File tree

3 files changed

+51
-26
lines changed

3 files changed

+51
-26
lines changed

system_tests/system_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import (
1515
"crypto/x509"
1616
"encoding/json"
1717
"fmt"
18+
"golang.org/x/mod/semver"
1819
"io/ioutil"
19-
"os"
2020
"strconv"
2121
"strings"
2222
"time"
@@ -318,13 +318,15 @@ CONSOLE_LOG=new`
318318

319319
BeforeEach(func() {
320320
// volume expansion is not supported in kinD which is use in github action
321-
if os.Getenv("SUPPORT_VOLUME_EXPANSION") == "false" {
322-
Skip("SUPPORT_VOLUME_EXPANSION is set to false; skipping volume expansion test")
321+
if !volumeExpansionSupported(ctx, clientSet) {
322+
Skip("default storageClass does not support volume expansion; skipping volume expansion test")
323323
}
324324

325+
oldCapacity, _ := k8sresource.ParseQuantity("10Gi")
326+
325327
cluster = newRabbitmqCluster(namespace, "resize-rabbit")
326328
cluster.Spec.Persistence = rabbitmqv1beta1.RabbitmqClusterPersistenceSpec{
327-
StorageClassName: pointer.StringPtr(storageClassName),
329+
Storage: &oldCapacity,
328330
}
329331
Expect(createRabbitmqCluster(ctx, rmqClusterClient, cluster)).To(Succeed())
330332
waitForRabbitmqRunning(cluster)
@@ -393,8 +395,10 @@ CONSOLE_LOG=new`
393395

394396
// test https://github.com/rabbitmq/cluster-operator/issues/662 is fixed
395397
By("clustering correctly")
396-
if strings.Contains(cluster.Spec.Image, ":3.8.8") {
397-
Skip(cluster.Spec.Image + " is known to not cluster consistently (fixed in v3.8.18)")
398+
testRabbitmqVersion := "v" + runningRabbitmqVersion(cluster)
399+
if semver.Compare(testRabbitmqVersion, "v3.8") >= 0 &&
400+
semver.Compare(testRabbitmqVersion, "v3.8.18") < 0 {
401+
Skip(testRabbitmqVersion + " is known to not cluster consistently (fixed in v3.8.18)")
398402
}
399403
rmqc, err := rabbithole.NewClient(fmt.Sprintf("http://%s:%s", hostname, port), username, password)
400404
Expect(err).NotTo(HaveOccurred())

system_tests/system_tests_suite_test.go

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,14 @@ package system_tests
1111

1212
import (
1313
"context"
14-
"k8s.io/utils/pointer"
1514
controllerruntime "sigs.k8s.io/controller-runtime"
1615
"testing"
1716

18-
storagev1 "k8s.io/api/storage/v1"
1917
"k8s.io/client-go/kubernetes"
2018

2119
. "github.com/onsi/ginkgo/v2"
2220
. "github.com/onsi/gomega"
2321
rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/api/v1beta1"
24-
apierrors "k8s.io/apimachinery/pkg/api/errors"
2522
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2623
"k8s.io/apimachinery/pkg/runtime"
2724
defaultscheme "k8s.io/client-go/kubernetes/scheme"
@@ -56,21 +53,7 @@ var _ = BeforeSuite(func() {
5653

5754
namespace = MustHaveEnv("NAMESPACE")
5855

59-
// Create or update the StorageClass used in persistence expansion test spec
60-
storageClass := &storagev1.StorageClass{
61-
ObjectMeta: metav1.ObjectMeta{
62-
Name: storageClassName,
63-
},
64-
Provisioner: "kubernetes.io/gce-pd",
65-
AllowVolumeExpansion: pointer.BoolPtr(true),
66-
}
6756
ctx := context.Background()
68-
err = rmqClusterClient.Create(ctx, storageClass)
69-
if apierrors.IsAlreadyExists(err) {
70-
Expect(rmqClusterClient.Update(ctx, storageClass)).To(Succeed())
71-
} else {
72-
Expect(err).NotTo(HaveOccurred())
73-
}
7457

7558
Eventually(func() int32 {
7659
operatorDeployment, err := clientSet.AppsV1().Deployments(namespace).Get(ctx, "rabbitmq-cluster-operator", metav1.GetOptions{})

system_tests/utils.go

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"fmt"
1919
"io"
2020
"io/ioutil"
21+
storagev1 "k8s.io/api/storage/v1"
2122
"log"
2223
"net/http"
2324
"os"
@@ -434,7 +435,6 @@ func newRabbitmqCluster(namespace, instanceName string) *rabbitmqv1beta1.Rabbitm
434435
}
435436

436437
func overrideSecurityContextForOpenshift(cluster *rabbitmqv1beta1.RabbitmqCluster) {
437-
438438
cluster.Spec.Override = rabbitmqv1beta1.RabbitmqClusterOverrideSpec{
439439
StatefulSet: &rabbitmqv1beta1.StatefulSet{
440440
Spec: &rabbitmqv1beta1.StatefulSetSpec{
@@ -451,7 +451,6 @@ func overrideSecurityContextForOpenshift(cluster *rabbitmqv1beta1.RabbitmqCluste
451451
},
452452
},
453453
}
454-
455454
}
456455

457456
//the updateFn can change properties of the RabbitmqCluster CR
@@ -645,7 +644,18 @@ func hasFeatureEnabled(cluster *rabbitmqv1beta1.RabbitmqCluster, featureFlagName
645644
return false
646645
}
647646

648-
// asserts an event with reason: "TLSError", occurs for the cluster in it's namespace
647+
func runningRabbitmqVersion(cluster *rabbitmqv1beta1.RabbitmqCluster) string {
648+
output, err := kubectlExec(cluster.Namespace,
649+
statefulSetPodName(cluster, 0),
650+
"rabbitmq",
651+
"rabbitmqctl",
652+
"version",
653+
)
654+
Expect(err).NotTo(HaveOccurred())
655+
return strings.TrimSpace(string(output))
656+
}
657+
658+
// asserts an event with reason: "TLSError", occurs for the cluster in its namespace
649659
func assertTLSError(cluster *rabbitmqv1beta1.RabbitmqCluster) {
650660
var err error
651661

@@ -1069,3 +1079,31 @@ func pod(ctx context.Context, clientSet *kubernetes.Clientset, r *rabbitmqv1beta
10691079
}, 10).Should(Succeed())
10701080
return pod
10711081
}
1082+
1083+
func defaultStorageClass(ctx context.Context, clientSet *kubernetes.Clientset) *storagev1.StorageClass {
1084+
var storageClasses *storagev1.StorageClassList
1085+
defaultClassAnnotation := "storageclass.kubernetes.io/is-default-class"
1086+
var err error
1087+
storageClasses, err = clientSet.StorageV1().StorageClasses().List(ctx, metav1.ListOptions{})
1088+
Expect(err).NotTo(HaveOccurred())
1089+
Expect(storageClasses.Items).NotTo(BeEmpty(), "expected at least 1 storageClass, but found 0")
1090+
for _, storageClass := range storageClasses.Items {
1091+
defaultClassAnnotationValue, ok := storageClass.ObjectMeta.Annotations[defaultClassAnnotation]
1092+
if !ok {
1093+
// StorageClass is not the default
1094+
continue
1095+
}
1096+
isDefaultClass, err := strconv.ParseBool(defaultClassAnnotationValue)
1097+
if err == nil && isDefaultClass {
1098+
return &storageClass
1099+
}
1100+
}
1101+
return nil
1102+
}
1103+
1104+
func volumeExpansionSupported(ctx context.Context, clientSet *kubernetes.Clientset) bool {
1105+
clusterDefaultStorageClass := defaultStorageClass(ctx, clientSet)
1106+
Expect(clusterDefaultStorageClass).NotTo(BeNil(), "expected to find a default storageClass, but failed to find one")
1107+
return clusterDefaultStorageClass.AllowVolumeExpansion != nil &&
1108+
*clusterDefaultStorageClass.AllowVolumeExpansion == true
1109+
}

0 commit comments

Comments
 (0)