From 1c95c3dc59218be1afbc1ddb91dfda3e1e8fbee5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marko=20Bari=C5=A1i=C4=87?=
 <48765171+MarkoBarisic@users.noreply.github.com>
Date: Fri, 26 Jan 2024 11:50:03 +0100
Subject: [PATCH] Add step to refresh jepsen cluster before test (#1667)

refresh jepsen during diff workflow
---
 .github/workflows/diff.yaml |  5 +++
 tests/jepsen/run.sh         | 62 +++++++++++++++++++++++++------------
 2 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/.github/workflows/diff.yaml b/.github/workflows/diff.yaml
index 4d0d3d47a..f6c7c1bef 100644
--- a/.github/workflows/diff.yaml
+++ b/.github/workflows/diff.yaml
@@ -475,6 +475,11 @@ jobs:
           cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
           make -j$THREADS memgraph
 
+      - name: Refresh Jepsen Cluster
+        run: |
+          cd tests/jepsen
+          ./run.sh cluster-refresh
+
       - name: Run Jepsen tests
         run: |
           cd tests/jepsen
diff --git a/tests/jepsen/run.sh b/tests/jepsen/run.sh
index b366e7846..a1587c8a1 100755
--- a/tests/jepsen/run.sh
+++ b/tests/jepsen/run.sh
@@ -24,7 +24,7 @@ PRINT_CONTEXT() {
 
 HELP_EXIT() {
     echo ""
-    echo "HELP: $0 help|cluster-up|cluster-cleanup|cluster-dealloc|mgbuild|test|test-all-individually [args]"
+    echo "HELP: $0 help|cluster-up|cluster-refresh|cluster-cleanup|cluster-dealloc|mgbuild|test|test-all-individually [args]"
     echo ""
     echo "    test args --binary                 MEMGRAPH_BINARY_PATH"
     echo "              --ignore-run-stdout-logs Ignore lein run stdout logs."
@@ -184,6 +184,37 @@ PROCESS_RESULTS() {
     INFO "Result processing (printing and packing) DONE."
 }
 
+CLUSTER_UP() {
+  PRINT_CONTEXT
+  "$script_dir/jepsen/docker/bin/up" --daemon
+  sleep 10
+  # Ensure all SSH connections between Jepsen containers work
+  for node in $(docker ps --filter name=jepsen* --filter status=running --format "{{.Names}}"); do
+      if [ "$node" == "jepsen-control" ]; then
+          continue
+      fi
+      node_hostname="${node##jepsen-}"
+      docker exec jepsen-control bash -c "ssh -oStrictHostKeyChecking=no -t $node_hostname exit"
+  done
+}
+
+CLUSTER_DEALLOC() {
+  ps=$(docker ps --filter name=jepsen* --filter status=running -q)
+  if [[ ! -z ${ps} ]]; then
+      echo "Killing ${ps}"
+      docker rm -f ${ps}
+      imgs=$(docker images "jepsen*" -q)
+      if [[ ! -z ${imgs} ]]; then
+          echo "Removing ${imgs}"
+          docker images "jepsen*" -q | xargs docker image rmi -f
+      else
+          echo "No Jepsen images detected!"
+      fi
+  else
+      echo "No Jepsen containers detected!"
+  fi
+}
+
 # Initialize testing context by copying source/binary files. Inside CI,
 # Memgraph is tested on a single machine cluster based on Docker containers.
 # Once these tests will be part of the official Jepsen repo, the majority of
@@ -196,8 +227,16 @@ case $1 in
     # the current cluster is broken because it relies on the folder. That can
     # happen easiliy because the jepsen folder is git ignored.
     cluster-up)
-        PRINT_CONTEXT
-        "$script_dir/jepsen/docker/bin/up" --daemon
+        CLUSTER_UP
+    ;;
+
+    cluster-refresh)
+        CLUSTER_DEALLOC
+        CLUSTER_UP
+    ;;
+
+    cluster-dealloc)
+        CLUSTER_DEALLOC
     ;;
 
     cluster-cleanup)
@@ -212,23 +251,6 @@ case $1 in
         done
     ;;
 
-    cluster-dealloc)
-        ps=$(docker ps --filter name=jepsen* --filter status=running -q)
-        if [[ ! -z ${ps} ]]; then
-            echo "Killing ${ps}"
-            docker rm -f ${ps}
-            imgs=$(docker images "jepsen*" -q)
-            if [[ ! -z ${imgs} ]]; then
-                echo "Removing ${imgs}"
-                docker images "jepsen*" -q | xargs docker image rmi -f
-            else
-                echo "No Jepsen images detected!"
-            fi
-        else
-            echo "No Jepsen containers detected!"
-        fi
-    ;;
-
     mgbuild)
         PRINT_CONTEXT
         echo ""