Blob Blame History Raw
From e751df5b0e5d6849fa5a8332c7a0fed53c5b5141 Mon Sep 17 00:00:00 2001
From: Tomas Jelinek <tojeline@redhat.com>
Date: Tue, 3 Mar 2015 15:21:29 +0100
Subject: [PATCH] Do not set two_node in corosync if auto_tie_breaker is on

---
 pcs/cluster.py           |  23 ++++++--
 pcs/utils.py             |  26 +++++++--
 3 files changed, 170 insertions(+), 14 deletions(-)

diff --git a/pcs/cluster.py b/pcs/cluster.py
index 8569b92..c4a9b4c 100644
--- a/pcs/cluster.py
+++ b/pcs/cluster.py
@@ -351,6 +351,20 @@ def corosync_setup(argv,returnConfig=False):
             cib_path = os.path.join(settings.cib_dir, "cib.xml")
             if os.path.exists(cib_path) and not "--force" in utils.pcs_options:
                 utils.err("%s already exists, use --force to overwrite" % cib_path)
+
+        for opt in ["--wait_for_all", "--auto_tie_breaker", "--last_man_standing"]:
+            if (
+                opt in utils.pcs_options
+                and
+                utils.pcs_options[opt] not in ["0", "1"]
+            ):
+                utils.err(
+                    "'%s' is not a valid value for %s, use 0 or 1"
+                    % (utils.pcs_options[opt], opt)
+                )
+
+        auto_tie_breaker = False
+
         if "--corosync_conf" not in utils.pcs_options:
             cluster_destroy([])
 
@@ -372,20 +386,21 @@ def corosync_setup(argv,returnConfig=False):
             new_nodes_section += "       }\n"
             i = i+1
 
-        two_node_section = ""
-        if len(nodes) == 2:
-            two_node_section = "two_node: 1"
-
         quorum_options = ""
         if "--wait_for_all" in utils.pcs_options:
             quorum_options += "wait_for_all: " + utils.pcs_options["--wait_for_all"] + "\n"
         if "--auto_tie_breaker" in utils.pcs_options:
             quorum_options += "auto_tie_breaker: " + utils.pcs_options["--auto_tie_breaker"] + "\n"
+            if utils.pcs_options["--auto_tie_breaker"] == "1":
+                auto_tie_breaker = True
         if "--last_man_standing" in utils.pcs_options:
             quorum_options += "last_man_standing: " + utils.pcs_options["--last_man_standing"] + "\n"
         if "--last_man_standing_window" in utils.pcs_options:
             quorum_options += "last_man_standing_window: " + utils.pcs_options["--last_man_standing_window"] + "\n"
 
+        two_node_section = ""
+        if len(nodes) == 2 and not auto_tie_breaker:
+            two_node_section = "two_node: 1"
 
         transport = "udpu"
         if "--transport" in utils.pcs_options:
diff --git a/pcs/utils.py b/pcs/utils.py
index d35db1d..6911f0c 100644
--- a/pcs/utils.py
+++ b/pcs/utils.py
@@ -527,7 +527,8 @@ def removeNodeFromCorosync(node):
         node0 = node
         node1 = None
 
-    for c_node in getNodesFromCorosyncConf():
+    corosync_conf = getCorosyncConf()
+    for c_node in getNodesFromCorosyncConf(corosync_conf):
         if c_node == node0:
             node_found = True
         num_nodes_in_conf = num_nodes_in_conf + 1
@@ -539,7 +540,7 @@ def removeNodeFromCorosync(node):
     in_node = False
     node_match = False
     node_buffer = []
-    for line in getCorosyncConf().split("\n"):
+    for line in corosync_conf.split("\n"):
         if in_node:
             node_buffer.append(line)
             if (
@@ -562,7 +563,8 @@ def removeNodeFromCorosync(node):
     new_corosync_conf = "\n".join(new_corosync_conf_lines) + "\n"
 
     if removed_node:
-        if num_nodes_in_conf == 3:
+        auto_tie_breaker = getQuorumOption(corosync_conf, "auto_tie_breaker")
+        if num_nodes_in_conf == 3 and auto_tie_breaker != "1":
             new_corosync_conf = addQuorumOption(new_corosync_conf,("two_node","1"))
         setCorosyncConf(new_corosync_conf)
         reloadCorosync()
@@ -640,6 +642,24 @@ def rmQuorumOption(corosync_conf,option):
 
     return output.rstrip('\n') + "\n"
 
+def getQuorumOption(corosync_conf, option):
+    lines = corosync_conf.split("\n")
+    value = None
+
+    inQuorum = False
+    for line in lines:
+        line = line.strip()
+        if line.startswith("#"):
+            continue
+        if inQuorum and "}" in line:
+            inQuorum = False
+        elif inQuorum and line.split(":", 1)[0].strip() == option:
+            value = line.split(":", 1)[1].strip()
+        elif line.startswith("quorum {"):
+            inQuorum = True
+
+    return value
+
 def getNextNodeID(corosync_conf):
     currentNodes = []
     highest = 0
-- 
1.9.1