Skip to content

Commit 8303e4e

Browse files
Merge pull request #2229 from tnozicka/verify-no-restarts
Verify that no container in a ScyllaCluster Pod has restarted during e2e run
2 parents baaca48 + c59ff28 commit 8303e4e

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

test/e2e/utils/helpers.go

+21
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,27 @@ func GetStatefulSetsForScyllaCluster(ctx context.Context, client appv1client.App
220220
return res, nil
221221
}
222222

223+
func GetPodsForStatefulSet(ctx context.Context, client corev1client.CoreV1Interface, sts *appsv1.StatefulSet) (map[string]*corev1.Pod, error) {
224+
selector, err := metav1.LabelSelectorAsSelector(sts.Spec.Selector)
225+
if err != nil {
226+
return nil, fmt.Errorf("can't convert StatefulSet %q selector: %w", naming.ObjRef(sts), err)
227+
}
228+
229+
podList, err := client.Pods(sts.Namespace).List(ctx, metav1.ListOptions{
230+
LabelSelector: selector.String(),
231+
})
232+
if err != nil {
233+
return nil, fmt.Errorf("can't list Pods for StatefulSet %q: %w", naming.ObjRef(sts), err)
234+
}
235+
236+
res := map[string]*corev1.Pod{}
237+
for _, pod := range podList.Items {
238+
res[pod.Name] = &pod
239+
}
240+
241+
return res, nil
242+
}
243+
223244
func GetDaemonSetsForNodeConfig(ctx context.Context, client appv1client.AppsV1Interface, nc *scyllav1alpha1.NodeConfig) ([]*appsv1.DaemonSet, error) {
224245
daemonSetList, err := client.DaemonSets(naming.ScyllaOperatorNodeTuningNamespace).List(ctx, metav1.ListOptions{
225246
LabelSelector: labels.Set{

test/e2e/utils/verification/scyllacluster/verify.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package scyllacluster
22

33
import (
44
"context"
5+
"fmt"
56
"sort"
67
"strings"
78

@@ -59,7 +60,7 @@ func verifyPersistentVolumeClaims(ctx context.Context, coreClient corev1client.C
5960
o.Expect(scPVCNames).To(o.BeEquivalentTo(expectedPvcNames))
6061
}
6162

62-
func verifyStatefulset(sts *appsv1.StatefulSet, sdc *scyllav1alpha1.ScyllaDBDatacenter) {
63+
func verifyStatefulset(ctx context.Context, client corev1client.CoreV1Interface, sts *appsv1.StatefulSet, sdc *scyllav1alpha1.ScyllaDBDatacenter) {
6364
o.Expect(sts.ObjectMeta.OwnerReferences).To(o.BeEquivalentTo(
6465
[]metav1.OwnerReference{
6566
{
@@ -75,8 +76,22 @@ func verifyStatefulset(sts *appsv1.StatefulSet, sdc *scyllav1alpha1.ScyllaDBData
7576
o.Expect(sts.DeletionTimestamp).To(o.BeNil())
7677
o.Expect(sts.Status.ObservedGeneration).To(o.Equal(sts.Generation))
7778
o.Expect(sts.Spec.Replicas).NotTo(o.BeNil())
79+
o.Expect(sts.Status.Replicas).To(o.Equal(*sts.Spec.Replicas))
7880
o.Expect(sts.Status.ReadyReplicas).To(o.Equal(*sts.Spec.Replicas))
7981
o.Expect(sts.Status.CurrentRevision).To(o.Equal(sts.Status.UpdateRevision))
82+
83+
// Verify pod invariants.
84+
podMap, err := utils.GetPodsForStatefulSet(ctx, client, sts)
85+
o.Expect(err).NotTo(o.HaveOccurred())
86+
o.Expect(podMap).To(o.HaveLen(int(sts.Status.Replicas)))
87+
88+
// No container in the Pod should be restarted.
89+
for _, pod := range podMap {
90+
o.Expect(pod.Status.ContainerStatuses).NotTo(o.BeEmpty())
91+
for _, cs := range pod.Status.ContainerStatuses {
92+
o.Expect(cs.RestartCount).To(o.BeZero(), fmt.Sprintf("container %q in pod %q should not be restarted", cs.Name, pod.Name))
93+
}
94+
}
8095
}
8196

8297
func verifyPodDisruptionBudget(sc *scyllav1.ScyllaCluster, pdb *policyv1.PodDisruptionBudget, sdc *scyllav1alpha1.ScyllaDBDatacenter) {
@@ -279,7 +294,7 @@ func Verify(ctx context.Context, kubeClient kubernetes.Interface, scyllaClient s
279294

280295
s := statefulsets[r.Name]
281296

282-
verifyStatefulset(s, sdc)
297+
verifyStatefulset(ctx, kubeClient.CoreV1(), s, sdc)
283298

284299
o.Expect(sc.Status.Racks[r.Name].Stale).NotTo(o.BeNil())
285300
o.Expect(*sc.Status.Racks[r.Name].Stale).To(o.BeFalse())

0 commit comments

Comments
 (0)