Blob Blame History Raw
From 85f8cbca6af296a5b8e4d43e9f56daed0d7c195b Mon Sep 17 00:00:00 2001
From: Tomas Jelinek <tojeline@redhat.com>
Date: Mon, 10 Aug 2020 12:17:01 +0200
Subject: [PATCH 1/2] rule: fix mixing 'and' and 'or' expressions

---
 pcs/lib/cib/rule/parsed_to_cib.py                 |  5 +++++
 pcs_test/tier0/lib/cib/rule/test_parsed_to_cib.py |  4 ++--
 pcs_test/tier1/test_cib_options.py                | 11 +++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/pcs/lib/cib/rule/parsed_to_cib.py b/pcs/lib/cib/rule/parsed_to_cib.py
index 0fcae4f1..130663db 100644
--- a/pcs/lib/cib/rule/parsed_to_cib.py
+++ b/pcs/lib/cib/rule/parsed_to_cib.py
@@ -62,6 +62,11 @@ def __export_bool(
         {
             "id": create_subelement_id(parent_el, "rule", id_provider),
             "boolean-op": boolean.operator.lower(),
+            # Score or score-attribute is required for nested rules, otherwise
+            # the CIB is not valid. Pacemaker doesn't use the score of nested
+            # rules. Score for the top rule, which is used by pacemaker, is
+            # supposed to be set in the export function above.
+            "score": "0",
         },
     )
     for child in boolean.children:
diff --git a/pcs_test/tier0/lib/cib/rule/test_parsed_to_cib.py b/pcs_test/tier0/lib/cib/rule/test_parsed_to_cib.py
index f61fce99..fa639f7c 100644
--- a/pcs_test/tier0/lib/cib/rule/test_parsed_to_cib.py
+++ b/pcs_test/tier0/lib/cib/rule/test_parsed_to_cib.py
@@ -185,7 +185,7 @@ class Complex(Base):
             ),
             """
                 <rule id="X-rule" boolean-op="and" score="INFINITY">
-                  <rule id="X-rule-rule" boolean-op="or">
+                  <rule id="X-rule-rule" boolean-op="or" score="0">
                     <rsc_expression id="X-rule-rule-rsc-ocf-pacemaker-Dummy"
                         class="ocf" provider="pacemaker" type="Dummy"
                     />
@@ -197,7 +197,7 @@ class Complex(Base):
                         class="ocf" provider="heartbeat" type="Dummy"
                     />
                   </rule>
-                  <rule id="X-rule-rule-1" boolean-op="or">
+                  <rule id="X-rule-rule-1" boolean-op="or" score="0">
                     <op_expression id="X-rule-rule-1-op-monitor"
                         name="monitor" interval="30s"
                     />
diff --git a/pcs_test/tier1/test_cib_options.py b/pcs_test/tier1/test_cib_options.py
index ba8f3515..92dbaed1 100644
--- a/pcs_test/tier1/test_cib_options.py
+++ b/pcs_test/tier1/test_cib_options.py
@@ -254,14 +254,21 @@ class OpDefaultsSetCreate(
         self.assert_effect(
             (
                 f"{self.cli_command} set create id=X meta nam1=val1 "
-                "rule resource ::Dummy and op monitor"
+                "rule resource ::Dummy and (op start or op stop)"
             ),
             f"""\
             <{self.cib_tag}>
                 <meta_attributes id="X">
                     <rule id="X-rule" boolean-op="and" score="INFINITY">
                         <rsc_expression id="X-rule-rsc-Dummy" type="Dummy"/>
-                        <op_expression id="X-rule-op-monitor" name="monitor"/>
+                        <rule id="X-rule-rule" boolean-op="or" score="0">
+                            <op_expression id="X-rule-rule-op-start"
+                                name="start"
+                            />
+                            <op_expression id="X-rule-rule-op-stop"
+                                name="stop"
+                            />
+                        </rule>
                     </rule>
                     <nvpair id="X-nam1" name="nam1" value="val1"/>
                 </meta_attributes>
-- 
2.25.4