Blame SOURCES/bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch

6584e9
From 58589e47f2913276ea1c2164a3ce8ee694fb2b78 Mon Sep 17 00:00:00 2001
ef831b
From: Ondrej Mular <omular@redhat.com>
ef831b
Date: Wed, 7 Dec 2022 11:33:25 +0100
6584e9
Subject: [PATCH 1/5] add warning when updating a misconfigured resource
ef831b
ef831b
---
ef831b
 pcs/common/reports/codes.py                   |  3 +
ef831b
 pcs/common/reports/messages.py                | 19 +++++
ef831b
 pcs/lib/cib/resource/primitive.py             | 84 ++++++++++++++-----
ef831b
 pcs/lib/pacemaker/live.py                     | 38 ++-------
ef831b
 .../tier0/common/reports/test_messages.py     | 16 ++++
ef831b
 .../cib/resource/test_primitive_validate.py   | 56 +++++++------
ef831b
 pcs_test/tier0/lib/pacemaker/test_live.py     | 78 +++++------------
ef831b
 pcs_test/tier1/legacy/test_stonith.py         |  5 +-
6584e9
 8 files changed, 161 insertions(+), 138 deletions(-)
ef831b
ef831b
diff --git a/pcs/common/reports/codes.py b/pcs/common/reports/codes.py
ef831b
index deecc626..48048af7 100644
ef831b
--- a/pcs/common/reports/codes.py
ef831b
+++ b/pcs/common/reports/codes.py
ef831b
@@ -40,6 +40,9 @@ AGENT_NAME_GUESS_FOUND_MORE_THAN_ONE = M("AGENT_NAME_GUESS_FOUND_MORE_THAN_ONE")
ef831b
 AGENT_NAME_GUESS_FOUND_NONE = M("AGENT_NAME_GUESS_FOUND_NONE")
ef831b
 AGENT_NAME_GUESSED = M("AGENT_NAME_GUESSED")
ef831b
 AGENT_SELF_VALIDATION_INVALID_DATA = M("AGENT_SELF_VALIDATION_INVALID_DATA")
ef831b
+AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED = M(
ef831b
+    "AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED"
ef831b
+)
ef831b
 AGENT_SELF_VALIDATION_RESULT = M("AGENT_SELF_VALIDATION_RESULT")
ef831b
 BAD_CLUSTER_STATE_FORMAT = M("BAD_CLUSTER_STATE_FORMAT")
ef831b
 BOOTH_ADDRESS_DUPLICATION = M("BOOTH_ADDRESS_DUPLICATION")
ef831b
diff --git a/pcs/common/reports/messages.py b/pcs/common/reports/messages.py
ef831b
index d27c1dee..24bb222f 100644
ef831b
--- a/pcs/common/reports/messages.py
ef831b
+++ b/pcs/common/reports/messages.py
ef831b
@@ -7584,6 +7584,25 @@ class AgentSelfValidationInvalidData(ReportItemMessage):
ef831b
         return f"Invalid validation data from agent: {self.reason}"
ef831b
 
ef831b
 
ef831b
+@dataclass(frozen=True)
ef831b
+class AgentSelfValidationSkippedUpdatedResourceMisconfigured(ReportItemMessage):
ef831b
+    """
ef831b
+    Agent self validation is skipped when updating a resource as it is
ef831b
+    misconfigured in its current state.
ef831b
+    """
ef831b
+
ef831b
+    result: str
ef831b
+    _code = codes.AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED
ef831b
+
ef831b
+    @property
ef831b
+    def message(self) -> str:
ef831b
+        return (
ef831b
+            "The resource was misconfigured before the update, therefore agent "
ef831b
+            "self-validation will not be run for the updated configuration. "
ef831b
+            "Validation output of the original configuration:\n{result}"
ef831b
+        ).format(result="\n".join(indent(self.result.splitlines())))
ef831b
+
ef831b
+
ef831b
 @dataclass(frozen=True)
ef831b
 class BoothAuthfileNotUsed(ReportItemMessage):
ef831b
     """
ef831b
diff --git a/pcs/lib/cib/resource/primitive.py b/pcs/lib/cib/resource/primitive.py
ef831b
index 3ebd01c6..c5df8e58 100644
ef831b
--- a/pcs/lib/cib/resource/primitive.py
ef831b
+++ b/pcs/lib/cib/resource/primitive.py
ef831b
@@ -357,6 +357,31 @@ def _is_ocf_or_stonith_agent(resource_agent_name: ResourceAgentName) -> bool:
ef831b
     return resource_agent_name.standard in ("stonith", "ocf")
ef831b
 
ef831b
 
ef831b
+def _get_report_from_agent_self_validation(
ef831b
+    is_valid: Optional[bool],
ef831b
+    reason: str,
ef831b
+    report_severity: reports.ReportItemSeverity,
ef831b
+) -> reports.ReportItemList:
ef831b
+    report_items = []
ef831b
+    if is_valid is None:
ef831b
+        report_items.append(
ef831b
+            reports.ReportItem(
ef831b
+                report_severity,
ef831b
+                reports.messages.AgentSelfValidationInvalidData(reason),
ef831b
+            )
ef831b
+        )
ef831b
+    elif not is_valid or reason:
ef831b
+        if is_valid:
ef831b
+            report_severity = reports.ReportItemSeverity.warning()
ef831b
+        report_items.append(
ef831b
+            reports.ReportItem(
ef831b
+                report_severity,
ef831b
+                reports.messages.AgentSelfValidationResult(reason),
ef831b
+            )
ef831b
+        )
ef831b
+    return report_items
ef831b
+
ef831b
+
ef831b
 def validate_resource_instance_attributes_create(
ef831b
     cmd_runner: CommandRunner,
ef831b
     resource_agent: ResourceAgentFacade,
ef831b
@@ -402,16 +427,16 @@ def validate_resource_instance_attributes_create(
ef831b
             for report_item in report_items
ef831b
         )
ef831b
     ):
ef831b
-        (
ef831b
-            dummy_is_valid,
ef831b
-            agent_validation_reports,
ef831b
-        ) = validate_resource_instance_attributes_via_pcmk(
ef831b
-            cmd_runner,
ef831b
-            agent_name,
ef831b
-            instance_attributes,
ef831b
-            reports.get_severity(reports.codes.FORCE, force),
ef831b
+        report_items.extend(
ef831b
+            _get_report_from_agent_self_validation(
ef831b
+                *validate_resource_instance_attributes_via_pcmk(
ef831b
+                    cmd_runner,
ef831b
+                    agent_name,
ef831b
+                    instance_attributes,
ef831b
+                ),
ef831b
+                reports.get_severity(reports.codes.FORCE, force),
ef831b
+            )
ef831b
         )
ef831b
-        report_items.extend(agent_validation_reports)
ef831b
     return report_items
ef831b
 
ef831b
 
ef831b
@@ -505,25 +530,40 @@ def validate_resource_instance_attributes_update(
ef831b
         )
ef831b
     ):
ef831b
         (
ef831b
-            is_valid,
ef831b
-            dummy_reports,
ef831b
+            original_is_valid,
ef831b
+            original_reason,
ef831b
         ) = validate_resource_instance_attributes_via_pcmk(
ef831b
             cmd_runner,
ef831b
             agent_name,
ef831b
             current_instance_attrs,
ef831b
-            reports.ReportItemSeverity.error(),
ef831b
         )
ef831b
-        if is_valid:
ef831b
-            (
ef831b
-                dummy_is_valid,
ef831b
-                agent_validation_reports,
ef831b
-            ) = validate_resource_instance_attributes_via_pcmk(
ef831b
-                cmd_runner,
ef831b
-                resource_agent.metadata.name,
ef831b
-                final_attrs,
ef831b
-                reports.get_severity(reports.codes.FORCE, force),
ef831b
+        if original_is_valid:
ef831b
+            report_items.extend(
ef831b
+                _get_report_from_agent_self_validation(
ef831b
+                    *validate_resource_instance_attributes_via_pcmk(
ef831b
+                        cmd_runner,
ef831b
+                        resource_agent.metadata.name,
ef831b
+                        final_attrs,
ef831b
+                    ),
ef831b
+                    reports.get_severity(reports.codes.FORCE, force),
ef831b
+                )
ef831b
+            )
ef831b
+        elif original_is_valid is None:
ef831b
+            report_items.append(
ef831b
+                reports.ReportItem.warning(
ef831b
+                    reports.messages.AgentSelfValidationInvalidData(
ef831b
+                        original_reason
ef831b
+                    )
ef831b
+                )
ef831b
+            )
ef831b
+        else:
ef831b
+            report_items.append(
ef831b
+                reports.ReportItem.warning(
ef831b
+                    reports.messages.AgentSelfValidationSkippedUpdatedResourceMisconfigured(
ef831b
+                        original_reason
ef831b
+                    )
ef831b
+                )
ef831b
             )
ef831b
-            report_items.extend(agent_validation_reports)
ef831b
     return report_items
ef831b
 
ef831b
 
ef831b
diff --git a/pcs/lib/pacemaker/live.py b/pcs/lib/pacemaker/live.py
ef831b
index fd26dabb..726f6b67 100644
ef831b
--- a/pcs/lib/pacemaker/live.py
ef831b
+++ b/pcs/lib/pacemaker/live.py
ef831b
@@ -902,8 +902,7 @@ def _validate_stonith_instance_attributes_via_pcmk(
ef831b
     cmd_runner: CommandRunner,
ef831b
     agent_name: ResourceAgentName,
ef831b
     instance_attributes: Mapping[str, str],
ef831b
-    not_valid_severity: reports.ReportItemSeverity,
ef831b
-) -> Tuple[Optional[bool], reports.ReportItemList]:
ef831b
+) -> Tuple[Optional[bool], str]:
ef831b
     cmd = [
ef831b
         settings.stonith_admin,
ef831b
         "--validate",
ef831b
@@ -917,7 +916,6 @@ def _validate_stonith_instance_attributes_via_pcmk(
ef831b
         cmd,
ef831b
         "./validate/command/output",
ef831b
         instance_attributes,
ef831b
-        not_valid_severity,
ef831b
     )
ef831b
 
ef831b
 
ef831b
@@ -925,8 +923,7 @@ def _validate_resource_instance_attributes_via_pcmk(
ef831b
     cmd_runner: CommandRunner,
ef831b
     agent_name: ResourceAgentName,
ef831b
     instance_attributes: Mapping[str, str],
ef831b
-    not_valid_severity: reports.ReportItemSeverity,
ef831b
-) -> Tuple[Optional[bool], reports.ReportItemList]:
ef831b
+) -> Tuple[Optional[bool], str]:
ef831b
     cmd = [
ef831b
         settings.crm_resource_binary,
ef831b
         "--validate",
ef831b
@@ -944,7 +941,6 @@ def _validate_resource_instance_attributes_via_pcmk(
ef831b
         cmd,
ef831b
         "./resource-agent-action/command/output",
ef831b
         instance_attributes,
ef831b
-        not_valid_severity,
ef831b
     )
ef831b
 
ef831b
 
ef831b
@@ -953,8 +949,7 @@ def _handle_instance_attributes_validation_via_pcmk(
ef831b
     cmd: StringSequence,
ef831b
     data_xpath: str,
ef831b
     instance_attributes: Mapping[str, str],
ef831b
-    not_valid_severity: reports.ReportItemSeverity,
ef831b
-) -> Tuple[Optional[bool], reports.ReportItemList]:
ef831b
+) -> Tuple[Optional[bool], str]:
ef831b
     full_cmd = list(cmd)
ef831b
     for key, value in sorted(instance_attributes.items()):
ef831b
         full_cmd.extend(["--option", f"{key}={value}"])
ef831b
@@ -963,12 +958,7 @@ def _handle_instance_attributes_validation_via_pcmk(
ef831b
         # dom = _get_api_result_dom(stdout)
ef831b
         dom = xml_fromstring(stdout)
ef831b
     except (etree.XMLSyntaxError, etree.DocumentInvalid) as e:
ef831b
-        return None, [
ef831b
-            reports.ReportItem(
ef831b
-                not_valid_severity,
ef831b
-                reports.messages.AgentSelfValidationInvalidData(str(e)),
ef831b
-            )
ef831b
-        ]
ef831b
+        return None, str(e)
ef831b
     result = "\n".join(
ef831b
         "\n".join(
ef831b
             line.strip() for line in item.text.split("\n") if line.strip()
ef831b
@@ -976,38 +966,22 @@ def _handle_instance_attributes_validation_via_pcmk(
ef831b
         for item in dom.iterfind(data_xpath)
ef831b
         if item.get("source") == "stderr" and item.text
ef831b
     ).strip()
ef831b
-    if return_value == 0:
ef831b
-        if result:
ef831b
-            return True, [
ef831b
-                reports.ReportItem.warning(
ef831b
-                    reports.messages.AgentSelfValidationResult(result)
ef831b
-                )
ef831b
-            ]
ef831b
-        return True, []
ef831b
-    return False, [
ef831b
-        reports.ReportItem(
ef831b
-            not_valid_severity,
ef831b
-            reports.messages.AgentSelfValidationResult(result),
ef831b
-        )
ef831b
-    ]
ef831b
+    return return_value == 0, result
ef831b
 
ef831b
 
ef831b
 def validate_resource_instance_attributes_via_pcmk(
ef831b
     cmd_runner: CommandRunner,
ef831b
     resource_agent_name: ResourceAgentName,
ef831b
     instance_attributes: Mapping[str, str],
ef831b
-    not_valid_severity: reports.ReportItemSeverity,
ef831b
-) -> Tuple[Optional[bool], reports.ReportItemList]:
ef831b
+) -> Tuple[Optional[bool], str]:
ef831b
     if resource_agent_name.is_stonith:
ef831b
         return _validate_stonith_instance_attributes_via_pcmk(
ef831b
             cmd_runner,
ef831b
             resource_agent_name,
ef831b
             instance_attributes,
ef831b
-            not_valid_severity,
ef831b
         )
ef831b
     return _validate_resource_instance_attributes_via_pcmk(
ef831b
         cmd_runner,
ef831b
         resource_agent_name,
ef831b
         instance_attributes,
ef831b
-        not_valid_severity,
ef831b
     )
ef831b
diff --git a/pcs_test/tier0/common/reports/test_messages.py b/pcs_test/tier0/common/reports/test_messages.py
ef831b
index 17627b80..5fcc62fc 100644
ef831b
--- a/pcs_test/tier0/common/reports/test_messages.py
ef831b
+++ b/pcs_test/tier0/common/reports/test_messages.py
ef831b
@@ -5562,6 +5562,22 @@ class AgentSelfValidationInvalidData(NameBuildTest):
ef831b
         )
ef831b
 
ef831b
 
ef831b
+class AgentSelfValidationSkippedUpdatedResourceMisconfigured(NameBuildTest):
ef831b
+    def test_message(self):
ef831b
+        lines = list(f"line #{i}" for i in range(3))
ef831b
+        self.assert_message_from_report(
ef831b
+            (
ef831b
+                "The resource was misconfigured before the update, therefore "
ef831b
+                "agent self-validation will not be run for the updated "
ef831b
+                "configuration. Validation output of the original "
ef831b
+                "configuration:\n  {}"
ef831b
+            ).format("\n  ".join(lines)),
ef831b
+            reports.AgentSelfValidationSkippedUpdatedResourceMisconfigured(
ef831b
+                "\n".join(lines)
ef831b
+            ),
ef831b
+        )
ef831b
+
ef831b
+
ef831b
 class BoothAuthfileNotUsed(NameBuildTest):
ef831b
     def test_message(self):
ef831b
         self.assert_message_from_report(
ef831b
diff --git a/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py b/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py
ef831b
index 2cba7086..1bc3a5a6 100644
ef831b
--- a/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py
ef831b
+++ b/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py
ef831b
@@ -609,7 +609,6 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase):
ef831b
             self.cmd_runner,
ef831b
             facade.metadata.name,
ef831b
             attributes,
ef831b
-            reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
         )
ef831b
 
ef831b
     def test_force(self):
ef831b
@@ -629,15 +628,14 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase):
ef831b
             self.cmd_runner,
ef831b
             facade.metadata.name,
ef831b
             attributes,
ef831b
-            reports.ReportItemSeverity.warning(),
ef831b
         )
ef831b
 
ef831b
     def test_failure(self):
ef831b
         attributes = {"required": "value"}
ef831b
         facade = _fixture_ocf_agent()
ef831b
-        failure_reports = ["report1", "report2"]
ef831b
-        self.agent_self_validation_mock.return_value = False, failure_reports
ef831b
-        self.assertEqual(
ef831b
+        failure_reason = "failure reason"
ef831b
+        self.agent_self_validation_mock.return_value = False, failure_reason
ef831b
+        assert_report_item_list_equal(
ef831b
             primitive.validate_resource_instance_attributes_create(
ef831b
                 self.cmd_runner,
ef831b
                 facade,
ef831b
@@ -645,13 +643,18 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase):
ef831b
                 etree.Element("resources"),
ef831b
                 force=False,
ef831b
             ),
ef831b
-            failure_reports,
ef831b
+            [
ef831b
+                fixture.error(
ef831b
+                    reports.codes.AGENT_SELF_VALIDATION_RESULT,
ef831b
+                    result=failure_reason,
ef831b
+                    force_code=reports.codes.FORCE,
ef831b
+                )
ef831b
+            ],
ef831b
         )
ef831b
         self.agent_self_validation_mock.assert_called_once_with(
ef831b
             self.cmd_runner,
ef831b
             facade.metadata.name,
ef831b
             attributes,
ef831b
-            reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
         )
ef831b
 
ef831b
     def test_stonith_check(self):
ef831b
@@ -671,7 +674,6 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase):
ef831b
             self.cmd_runner,
ef831b
             facade.metadata.name,
ef831b
             attributes,
ef831b
-            reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
         )
ef831b
 
ef831b
     def test_nonexisting_agent(self):
ef831b
@@ -1295,13 +1297,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     old_attributes,
ef831b
-                    reports.ReportItemSeverity.error(),
ef831b
                 ),
ef831b
                 mock.call(
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     new_attributes,
ef831b
-                    reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
                 ),
ef831b
             ],
ef831b
         )
ef831b
@@ -1328,13 +1328,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     old_attributes,
ef831b
-                    reports.ReportItemSeverity.error(),
ef831b
                 ),
ef831b
                 mock.call(
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     new_attributes,
ef831b
-                    reports.ReportItemSeverity.warning(),
ef831b
                 ),
ef831b
             ],
ef831b
         )
ef831b
@@ -1342,13 +1340,13 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
     def test_failure(self):
ef831b
         old_attributes = {"required": "old_value"}
ef831b
         new_attributes = {"required": "new_value"}
ef831b
-        failure_reports = ["report1", "report2"]
ef831b
+        failure_reason = "failure reason"
ef831b
         facade = _fixture_ocf_agent()
ef831b
         self.agent_self_validation_mock.side_effect = (
ef831b
-            (True, []),
ef831b
-            (False, failure_reports),
ef831b
+            (True, ""),
ef831b
+            (False, failure_reason),
ef831b
         )
ef831b
-        self.assertEqual(
ef831b
+        assert_report_item_list_equal(
ef831b
             primitive.validate_resource_instance_attributes_update(
ef831b
                 self.cmd_runner,
ef831b
                 facade,
ef831b
@@ -1357,7 +1355,13 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                 self._fixture_resources(old_attributes),
ef831b
                 force=False,
ef831b
             ),
ef831b
-            failure_reports,
ef831b
+            [
ef831b
+                fixture.error(
ef831b
+                    reports.codes.AGENT_SELF_VALIDATION_RESULT,
ef831b
+                    result=failure_reason,
ef831b
+                    force_code=reports.codes.FORCE,
ef831b
+                )
ef831b
+            ],
ef831b
         )
ef831b
         self.assertEqual(
ef831b
             self.agent_self_validation_mock.mock_calls,
ef831b
@@ -1366,13 +1370,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     old_attributes,
ef831b
-                    reports.ReportItemSeverity.error(),
ef831b
                 ),
ef831b
                 mock.call(
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     new_attributes,
ef831b
-                    reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
                 ),
ef831b
             ],
ef831b
         )
ef831b
@@ -1399,13 +1401,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     old_attributes,
ef831b
-                    reports.ReportItemSeverity.error(),
ef831b
                 ),
ef831b
                 mock.call(
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     new_attributes,
ef831b
-                    reports.ReportItemSeverity.error(reports.codes.FORCE),
ef831b
                 ),
ef831b
             ],
ef831b
         )
ef831b
@@ -1471,10 +1471,10 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
     def test_current_attributes_failure(self):
ef831b
         old_attributes = {"required": "old_value"}
ef831b
         new_attributes = {"required": "new_value"}
ef831b
-        failure_reports = ["report1", "report2"]
ef831b
+        failure_reason = "failure reason"
ef831b
         facade = _fixture_ocf_agent()
ef831b
-        self.agent_self_validation_mock.return_value = False, failure_reports
ef831b
-        self.assertEqual(
ef831b
+        self.agent_self_validation_mock.return_value = False, failure_reason
ef831b
+        assert_report_item_list_equal(
ef831b
             primitive.validate_resource_instance_attributes_update(
ef831b
                 self.cmd_runner,
ef831b
                 facade,
ef831b
@@ -1483,7 +1483,12 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                 self._fixture_resources(old_attributes),
ef831b
                 force=False,
ef831b
             ),
ef831b
-            [],
ef831b
+            [
ef831b
+                fixture.warn(
ef831b
+                    reports.codes.AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED,
ef831b
+                    result=failure_reason,
ef831b
+                )
ef831b
+            ],
ef831b
         )
ef831b
         self.assertEqual(
ef831b
             self.agent_self_validation_mock.mock_calls,
ef831b
@@ -1492,7 +1497,6 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase):
ef831b
                     self.cmd_runner,
ef831b
                     facade.metadata.name,
ef831b
                     old_attributes,
ef831b
-                    reports.ReportItemSeverity.error(),
ef831b
                 ),
ef831b
             ],
ef831b
         )
ef831b
diff --git a/pcs_test/tier0/lib/pacemaker/test_live.py b/pcs_test/tier0/lib/pacemaker/test_live.py
ef831b
index 5c8000cd..239a72b1 100644
ef831b
--- a/pcs_test/tier0/lib/pacemaker/test_live.py
ef831b
+++ b/pcs_test/tier0/lib/pacemaker/test_live.py
ef831b
@@ -1752,16 +1752,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertTrue(is_valid)
ef831b
-        self.assertEqual(report_list, [])
ef831b
+        self.assertEqual(reason, "")
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
         )
ef831b
@@ -1771,23 +1770,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertIsNone(is_valid)
ef831b
-        assert_report_item_list_equal(
ef831b
-            report_list,
ef831b
-            [
ef831b
-                fixture.info(
ef831b
-                    report_codes.AGENT_SELF_VALIDATION_INVALID_DATA,
ef831b
-                    reason="Start tag expected, '<' not found, line 1, column 1 (<string>, line 1)",
ef831b
-                )
ef831b
-            ],
ef831b
+        self.assertEqual(
ef831b
+            reason,
ef831b
+            "Start tag expected, '<' not found, line 1, column 1 (<string>, line 1)",
ef831b
         )
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
@@ -1806,19 +1799,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertTrue(is_valid)
ef831b
-        assert_report_item_list_equal(
ef831b
-            report_list,
ef831b
-            [],
ef831b
-        )
ef831b
+        self.assertEqual(reason, "")
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
         )
ef831b
@@ -1837,23 +1826,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertFalse(is_valid)
ef831b
-        assert_report_item_list_equal(
ef831b
-            report_list,
ef831b
-            [
ef831b
-                fixture.info(
ef831b
-                    report_codes.AGENT_SELF_VALIDATION_RESULT, result=""
ef831b
-                )
ef831b
-            ],
ef831b
-        )
ef831b
+        self.assertEqual(reason, "")
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
         )
ef831b
@@ -1881,23 +1862,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertFalse(is_valid)
ef831b
-        assert_report_item_list_equal(
ef831b
-            report_list,
ef831b
-            [
ef831b
-                fixture.info(
ef831b
-                    report_codes.AGENT_SELF_VALIDATION_RESULT,
ef831b
-                    result="first line\nImportant output\nand another line",
ef831b
-                )
ef831b
-            ],
ef831b
+        self.assertEqual(
ef831b
+            reason,
ef831b
+            "first line\nImportant output\nand another line",
ef831b
         )
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
@@ -1925,23 +1900,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase):
ef831b
         base_cmd = ["some", "command"]
ef831b
         (
ef831b
             is_valid,
ef831b
-            report_list,
ef831b
+            reason,
ef831b
         ) = lib._handle_instance_attributes_validation_via_pcmk(
ef831b
             runner,
ef831b
             base_cmd,
ef831b
             "result/output",
ef831b
             {"attr1": "val1", "attr2": "val2"},
ef831b
-            not_valid_severity=Severity.info(),
ef831b
         )
ef831b
         self.assertTrue(is_valid)
ef831b
-        assert_report_item_list_equal(
ef831b
-            report_list,
ef831b
-            [
ef831b
-                fixture.warn(
ef831b
-                    report_codes.AGENT_SELF_VALIDATION_RESULT,
ef831b
-                    result="first line\nImportant output\nand another line",
ef831b
-                )
ef831b
-            ],
ef831b
+        self.assertEqual(
ef831b
+            reason,
ef831b
+            "first line\nImportant output\nand another line",
ef831b
         )
ef831b
         runner.run.assert_called_once_with(
ef831b
             base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"]
ef831b
@@ -1953,7 +1922,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase):
ef831b
     def setUp(self):
ef831b
         self.runner = mock.Mock()
ef831b
         self.attrs = dict(attra="val1", attrb="val2")
ef831b
-        self.severity = Severity.info()
ef831b
         patcher = mock.patch(
ef831b
             "pcs.lib.pacemaker.live._handle_instance_attributes_validation_via_pcmk"
ef831b
         )
ef831b
@@ -1967,7 +1935,7 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase):
ef831b
         )
ef831b
         self.assertEqual(
ef831b
             lib._validate_resource_instance_attributes_via_pcmk(
ef831b
-                self.runner, agent, self.attrs, self.severity
ef831b
+                self.runner, agent, self.attrs
ef831b
             ),
ef831b
             self.ret_val,
ef831b
         )
ef831b
@@ -1987,7 +1955,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase):
ef831b
             ],
ef831b
             "./resource-agent-action/command/output",
ef831b
             self.attrs,
ef831b
-            self.severity,
ef831b
         )
ef831b
 
ef831b
     def test_without_provider(self):
ef831b
@@ -1996,7 +1963,7 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase):
ef831b
         )
ef831b
         self.assertEqual(
ef831b
             lib._validate_resource_instance_attributes_via_pcmk(
ef831b
-                self.runner, agent, self.attrs, self.severity
ef831b
+                self.runner, agent, self.attrs
ef831b
             ),
ef831b
             self.ret_val,
ef831b
         )
ef831b
@@ -2014,7 +1981,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase):
ef831b
             ],
ef831b
             "./resource-agent-action/command/output",
ef831b
             self.attrs,
ef831b
-            self.severity,
ef831b
         )
ef831b
 
ef831b
 
ef831b
@@ -2024,7 +1990,6 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase):
ef831b
     def setUp(self):
ef831b
         self.runner = mock.Mock()
ef831b
         self.attrs = dict(attra="val1", attrb="val2")
ef831b
-        self.severity = Severity.info()
ef831b
         patcher = mock.patch(
ef831b
             "pcs.lib.pacemaker.live._handle_instance_attributes_validation_via_pcmk"
ef831b
         )
ef831b
@@ -2038,7 +2003,7 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase):
ef831b
         )
ef831b
         self.assertEqual(
ef831b
             lib._validate_stonith_instance_attributes_via_pcmk(
ef831b
-                self.runner, agent, self.attrs, self.severity
ef831b
+                self.runner, agent, self.attrs
ef831b
             ),
ef831b
             self.ret_val,
ef831b
         )
ef831b
@@ -2054,5 +2019,4 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase):
ef831b
             ],
ef831b
             "./validate/command/output",
ef831b
             self.attrs,
ef831b
-            self.severity,
ef831b
         )
ef831b
diff --git a/pcs_test/tier1/legacy/test_stonith.py b/pcs_test/tier1/legacy/test_stonith.py
ef831b
index 9911d604..cf430d75 100644
ef831b
--- a/pcs_test/tier1/legacy/test_stonith.py
ef831b
+++ b/pcs_test/tier1/legacy/test_stonith.py
ef831b
@@ -1294,7 +1294,10 @@ class StonithTest(TestCase, AssertPcsMixin):
ef831b
             ),
ef831b
         )
ef831b
 
ef831b
-        self.assert_pcs_success("stonith update test3 username=testA".split())
ef831b
+        self.assert_pcs_success(
ef831b
+            "stonith update test3 username=testA".split(),
ef831b
+            stdout_start="Warning: ",
ef831b
+        )
ef831b
 
ef831b
         self.assert_pcs_success(
ef831b
             "stonith config test2".split(),
ef831b
-- 
6584e9
2.39.0
ef831b