scylladb_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package scylladb_test
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. utils "github.com/bitnami/charts/.vib/common-tests/ginkgo-utils"
  7. . "github.com/onsi/ginkgo/v2"
  8. . "github.com/onsi/gomega"
  9. appsv1 "k8s.io/api/apps/v1"
  10. batchv1 "k8s.io/api/batch/v1"
  11. v1 "k8s.io/api/core/v1"
  12. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  13. "k8s.io/client-go/kubernetes"
  14. )
  15. const (
  16. PollingInterval = 1 * time.Second
  17. )
  18. var _ = Describe("Scylladb", Ordered, func() {
  19. var c *kubernetes.Clientset
  20. var ctx context.Context
  21. var cancel context.CancelFunc
  22. BeforeEach(func() {
  23. ctx, cancel = context.WithCancel(context.Background())
  24. conf := utils.MustBuildClusterConfig(kubeconfig)
  25. c = kubernetes.NewForConfigOrDie(conf)
  26. })
  27. When("a database is created and Scylladb is scaled down to 0 replicas and back up", func() {
  28. It("should have access to the created database", func() {
  29. By("checking all the replicas are available")
  30. getAvailableReplicas := func(ss *appsv1.StatefulSet) int32 { return ss.Status.AvailableReplicas }
  31. getRestartedAtAnnotation := func(pod *v1.Pod) string { return pod.Annotations["kubectl.kubernetes.io/restartedAt"] }
  32. getSucceededJobs := func(j *batchv1.Job) int32 { return j.Status.Succeeded }
  33. getOpts := metav1.GetOptions{}
  34. ss, err := c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
  35. Expect(err).NotTo(HaveOccurred())
  36. Expect(ss.Status.Replicas).NotTo(BeZero())
  37. origReplicas := *ss.Spec.Replicas
  38. Eventually(func() (*appsv1.StatefulSet, error) {
  39. return c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
  40. }, timeout, PollingInterval).Should(WithTransform(getAvailableReplicas, Equal(origReplicas)))
  41. svc, err := c.CoreV1().Services(namespace).Get(ctx, stsName, getOpts)
  42. Expect(err).NotTo(HaveOccurred())
  43. port, err := utils.SvcGetPortByName(svc, "cql")
  44. Expect(err).NotTo(HaveOccurred())
  45. image, err := utils.StsGetContainerImageByName(ss, "scylladb")
  46. Expect(err).NotTo(HaveOccurred())
  47. // Use current time for allowing the test suite to repeat
  48. jobSuffix := time.Now().Format("20060102150405")
  49. By("creating a job to create a new test database")
  50. createDBJobName := fmt.Sprintf("%s-createdb-%s",
  51. stsName, jobSuffix)
  52. dbName := fmt.Sprintf("test%s", jobSuffix)
  53. err = createJob(ctx, c, createDBJobName, port, image, fmt.Sprintf("CREATE KEYSPACE %s WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor' : %d };", dbName, origReplicas))
  54. Expect(err).NotTo(HaveOccurred())
  55. Eventually(func() (*batchv1.Job, error) {
  56. return c.BatchV1().Jobs(namespace).Get(ctx, createDBJobName, getOpts)
  57. }, timeout, PollingInterval).Should(WithTransform(getSucceededJobs, Equal(int32(1))))
  58. By("deleting the job once it has succeeded")
  59. err = c.BatchV1().Jobs(namespace).Delete(ctx, createDBJobName, metav1.DeleteOptions{})
  60. Expect(err).NotTo(HaveOccurred())
  61. By("rollout restart the statefulset")
  62. _, err = utils.StsRolloutRestart(ctx, c, ss)
  63. Expect(err).NotTo(HaveOccurred())
  64. for i := int(origReplicas) - 1; i >= 0; i-- {
  65. Eventually(func() (*v1.Pod, error) {
  66. return c.CoreV1().Pods(namespace).Get(ctx, fmt.Sprintf("%s-%d", stsName, i), getOpts)
  67. }, timeout, PollingInterval).Should(WithTransform(getRestartedAtAnnotation, Not(BeEmpty())))
  68. }
  69. Eventually(func() (*appsv1.StatefulSet, error) {
  70. return c.AppsV1().StatefulSets(namespace).Get(ctx, stsName, getOpts)
  71. }, timeout, PollingInterval).Should(WithTransform(getAvailableReplicas, Equal(origReplicas)))
  72. By("creating a job to drop the test database")
  73. deleteDBJobName := fmt.Sprintf("%s-deletedb-%s",
  74. stsName, jobSuffix)
  75. err = createJob(ctx, c, deleteDBJobName, port, image, fmt.Sprintf("DROP KEYSPACE %s;", dbName))
  76. Expect(err).NotTo(HaveOccurred())
  77. Eventually(func() (*batchv1.Job, error) {
  78. return c.BatchV1().Jobs(namespace).Get(ctx, deleteDBJobName, getOpts)
  79. }, timeout, PollingInterval).Should(WithTransform(getSucceededJobs, Equal(int32(1))))
  80. By("deleting the job once it has succeeded")
  81. err = c.BatchV1().Jobs(namespace).Delete(ctx, deleteDBJobName, metav1.DeleteOptions{})
  82. Expect(err).NotTo(HaveOccurred())
  83. })
  84. })
  85. AfterEach(func() {
  86. cancel()
  87. })
  88. })