From 8a1b3d608e54229f0e03dd695cb5e75fb0982022 Mon Sep 17 00:00:00 2001
From: "Gao,Yan" <ygao@suse.com>
Date: Wed, 12 Apr 2023 15:23:36 +0200
Subject: [PATCH 01/11] Test: cts-fencing: regression test for fencing timeouts
 taking fencing delays into account

---
 cts/cts-fencing.in | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

Index: pacemaker-2.0.1+20190417.13d370ca9/cts/cts-fencing.in
===================================================================
--- pacemaker-2.0.1+20190417.13d370ca9.orig/cts/cts-fencing.in
+++ pacemaker-2.0.1+20190417.13d370ca9/cts/cts-fencing.in
@@ -1040,21 +1040,21 @@ class Tests(object):
             test.add_stonith_neg_log_pattern("does not advertise support for 'reboot', performing 'off'")
             test.add_stonith_log_pattern("with device 'true1' returned: 0 (OK)")
 
-        # make sure requested fencing delay is applied only for the first device in the first level
-        # make sure static delay from pcmk_delay_base is added
+        # make sure all fencing delays are applied correctly and taken into account by fencing timeouts with topology
         for test_type in test_types:
-            if test_type["use_cpg"] == 0:
+            if not test_type["use_cpg"]:
                 continue
 
-            test = self.new_test("%s_topology_delay" % test_type["prefix"],
-                                 "Verify requested fencing delay is applied only for the first device in the first level and pcmk_delay_base is added.",
+            test = self.new_test("%s_topology_delays" % test_type["prefix"],
+                                 "Verify all fencing delays are applied correctly and taken into account by fencing timeouts with topology.",
                                  test_type["use_cpg"])
             test.add_cmd("stonith_admin",
                          "-R true1 -a fence_dummy -o \"mode=pass\" -o \"pcmk_host_list=node1 node2 node3\" -o \"pcmk_delay_base=1\"")
             test.add_cmd("stonith_admin",
                          "-R false1 -a fence_dummy -o \"mode=fail\" -o \"pcmk_host_list=node1 node2 node3\" -o \"pcmk_delay_base=1\"")
+            # Resulting "random" delay will always be 1 since (rand() % (delay_max - delay_base)) is always 0 here.
             test.add_cmd("stonith_admin",
-                         "-R true2 -a fence_dummy -o \"mode=pass\" -o \"pcmk_host_list=node1 node2 node3\"")
+                         "-R true2 -a fence_dummy -o \"mode=pass\" -o \"pcmk_host_list=node1 node2 node3\" -o \"pcmk_delay_base=1\" -o \"pcmk_delay_max=2\"")
             test.add_cmd("stonith_admin",
                          "-R true3 -a fence_dummy -o \"mode=pass\" -o \"pcmk_host_list=node1 node2 node3\"")
 
@@ -1065,9 +1065,25 @@ class Tests(object):
 
             test.add_cmd("stonith_admin", "-F node3 --delay 1")
 
+            # Total fencing timeout takes all fencing delays into account.
+            test.add_stonith_log_pattern("Total timeout set to 576")
+
+            # Fencing timeout for the first device takes the requested fencing delay into account.
+            # Fencing timeout also takes pcmk_delay_base into account.
+            test.add_stonith_log_pattern(r"perform op 'node3 off' with 'true1'")
+            # Requested fencing delay is applied only for the first device in the first level.
+            # Static delay from pcmk_delay_base is added.
             test.add_stonith_log_pattern("Delaying 'off' action targeting node3 on true1 for 2s (timeout=120s, requested_delay=1s, base=1s, max=1s)")
+
+            # Fencing timeout no longer takes the requested fencing delay into account for further devices.
+            test.add_stonith_log_pattern(r"perform op 'node3 off' with 'false1'")
+            # Requested fencing delay is no longer applied for further devices.
             test.add_stonith_log_pattern("Delaying 'off' action targeting node3 on false1 for 1s (timeout=120s, requested_delay=0s, base=1s, max=1s)")
-            test.add_stonith_neg_log_pattern("Delaying 'off' action targeting node3 on true2")
+
+            # Fencing timeout takes pcmk_delay_max into account.
+            test.add_stonith_log_pattern(r"perform op 'node3 off' with 'true2'")
+            test.add_stonith_log_pattern("Delaying 'off' action targeting node3 on true2 for 1s (timeout=120s, requested_delay=0s, base=1s, max=2s)")
+
             test.add_stonith_neg_log_pattern("Delaying 'off' action targeting node3 on true3")
 
     def build_nodeid_tests(self):
