Files
charts/.vib/cassandra/ginkgo/cassandra_test.go
T
28cf5f7b8e [bitnami/cassandra] test: Improve ginkgo testing reliability (#29177)
* [bitnami/cassandra] test:  Improve ginkgo testing reliability

Signed-off-by: Javier J. Salmerón García <javier.salmeron@broadcom.com>

* Update CHANGELOG.md

Signed-off-by: Bitnami Containers <bitnami-bot@vmware.com>

---------

Signed-off-by: Javier J. Salmerón García <javier.salmeron@broadcom.com>
Signed-off-by: Bitnami Containers <bitnami-bot@vmware.com>
Co-authored-by: Bitnami Containers <bitnami-bot@vmware.com>
2024-09-03 17:11:49 +02:00

114 lines
4.1 KiB
Go

package cassandra_test
import (
"context"
"fmt"
"time"
utils "github.com/bitnami/charts/.vib/common-tests/ginkgo-utils"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
appsv1 "k8s.io/api/apps/v1"
batchv1 "k8s.io/api/batch/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
const (
PollingInterval = 1 * time.Second
)
var _ = Describe("Cassandra", Ordered, func() {
var c *kubernetes.Clientset
var ctx context.Context
var cancel context.CancelFunc
BeforeEach(func() {
ctx, cancel = context.WithCancel(context.Background())
conf := utils.MustBuildClusterConfig(kubeconfig)
c = kubernetes.NewForConfigOrDie(conf)
})
When("a database is created and Cassandra is scaled down to 0 replicas and back up", func() {
It("should have access to the created database", func() {
By("checking all the replicas are available")
getAvailableReplicas := func(ss *appsv1.StatefulSet) int32 { return ss.Status.AvailableReplicas }
getSucceededJobs := func(j *batchv1.Job) int32 { return j.Status.Succeeded }
getRestartedAtAnnotation := func(pod *v1.Pod) string { return pod.Annotations["kubectl.kubernetes.io/restartedAt"] }
getOpts := metav1.GetOptions{}
ss, err := c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
Expect(err).NotTo(HaveOccurred())
Expect(ss.Status.Replicas).NotTo(BeZero())
origReplicas := *ss.Spec.Replicas
Eventually(func() (*appsv1.StatefulSet, error) {
return c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
}, timeout, PollingInterval).Should(WithTransform(getAvailableReplicas, Equal(origReplicas)))
svc, err := c.CoreV1().Services(namespace).Get(ctx, stsName, getOpts)
Expect(err).NotTo(HaveOccurred())
port, err := utils.SvcGetPortByName(svc, "cql")
Expect(err).NotTo(HaveOccurred())
image, err := utils.StsGetContainerImageByName(ss, "cassandra")
Expect(err).NotTo(HaveOccurred())
// Use current time for allowing the test suite to repeat
jobSuffix := time.Now().Format("20060102150405")
By("creating a job to create a new test database")
createDBJobName := fmt.Sprintf("%s-createdb-%s",
stsName, jobSuffix)
dbName := fmt.Sprintf("test%s", jobSuffix)
err = createJob(ctx, c, createDBJobName, port, image, fmt.Sprintf("CREATE KEYSPACE %s WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor' : %d };", dbName, origReplicas))
Expect(err).NotTo(HaveOccurred())
Eventually(func() (*batchv1.Job, error) {
return c.BatchV1().Jobs(namespace).Get(ctx, createDBJobName, getOpts)
}, timeout, PollingInterval).Should(WithTransform(getSucceededJobs, Equal(int32(1))))
By("deleting the job once it has succeeded")
err = c.BatchV1().Jobs(namespace).Delete(ctx, createDBJobName, metav1.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
By("rollout restart the statefulset")
_, err = utils.StsRolloutRestart(ctx, c, ss)
Expect(err).NotTo(HaveOccurred())
for i := int(origReplicas) - 1; i >= 0; i-- {
Eventually(func() (*v1.Pod, error) {
return c.CoreV1().Pods(namespace).Get(ctx, fmt.Sprintf("%s-%d", stsName, i), getOpts)
}, timeout, PollingInterval).Should(WithTransform(getRestartedAtAnnotation, Not(BeEmpty())))
}
Eventually(func() (*appsv1.StatefulSet, error) {
return c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
}, timeout, PollingInterval).Should(WithTransform(getAvailableReplicas, Equal(origReplicas)))
By("creating a job to drop the test database")
deleteDBJobName := fmt.Sprintf("%s-deletedb-%s",
stsName, jobSuffix)
err = createJob(ctx, c, deleteDBJobName, port, image, fmt.Sprintf("DROP KEYSPACE %s;", dbName))
Expect(err).NotTo(HaveOccurred())
Eventually(func() (*batchv1.Job, error) {
return c.BatchV1().Jobs(namespace).Get(ctx, deleteDBJobName, getOpts)
}, timeout, PollingInterval).Should(WithTransform(getSucceededJobs, Equal(int32(1))))
By("deleting the job once it has succeeded")
err = c.BatchV1().Jobs(namespace).Delete(ctx, deleteDBJobName, metav1.DeleteOptions{})
Expect(err).NotTo(HaveOccurred())
})
})
AfterEach(func() {
cancel()
})
})