From ee54cc089620ee0c659a8be19568a4b1a4a8c5f6 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 3 Jan 2023 06:10:39 +0000 Subject: [PATCH] import pcs-0.10.15-2.el8 --- .gitignore | 8 +- .pcs.metadata | 8 +- ...x-displaying-bool-and-integer-values.patch | 146 ++++ ...en-updating-a-misconfigured-resource.patch | 753 ++++++++++++++++++ ...sd-rubygem-json-error-message-change.patch | 40 + SPECS/pcs.spec | 29 +- 6 files changed, 968 insertions(+), 16 deletions(-) create mode 100644 SOURCES/bz2151166-01-fix-displaying-bool-and-integer-values.patch create mode 100644 SOURCES/bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch create mode 100644 SOURCES/pcsd-rubygem-json-error-message-change.patch diff --git a/.gitignore b/.gitignore index b302c27..b4c905b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,10 @@ SOURCES/backports-3.23.0.gem SOURCES/dacite-1.6.0.tar.gz SOURCES/daemons-1.4.1.gem SOURCES/dataclasses-0.8.tar.gz -SOURCES/ethon-0.15.0.gem +SOURCES/ethon-0.16.0.gem SOURCES/eventmachine-1.2.7.gem SOURCES/ffi-1.15.5.gem -SOURCES/json-2.6.2.gem +SOURCES/json-2.6.3.gem SOURCES/mustermann-2.0.2.gem SOURCES/open4-1.3.4-1.gem SOURCES/pcs-0.10.15.tar.gz @@ -15,11 +15,11 @@ SOURCES/pcs-web-ui-node-modules-0.1.13.tar.xz SOURCES/pyagentx-0.4.pcs.2.tar.gz SOURCES/python-dateutil-2.8.2.tar.gz SOURCES/rack-2.2.4.gem -SOURCES/rack-protection-2.2.2.gem +SOURCES/rack-protection-2.2.3.gem SOURCES/rack-test-2.0.2.gem SOURCES/rexml-3.2.5.gem SOURCES/ruby2_keywords-0.0.5.gem -SOURCES/sinatra-2.2.2.gem +SOURCES/sinatra-2.2.3.gem SOURCES/thin-1.8.1.gem SOURCES/tilt-2.0.11.gem SOURCES/tornado-6.1.0.tar.gz diff --git a/.pcs.metadata b/.pcs.metadata index de726ea..7add1c5 100644 --- a/.pcs.metadata +++ b/.pcs.metadata @@ -3,10 +3,10 @@ 31546c37fbdc6270d5097687619e9c0db6f1c05c SOURCES/dacite-1.6.0.tar.gz 4795a8962cc1608bfec0d91fa4d438c7cfe90c62 SOURCES/daemons-1.4.1.gem 8b7598273d2ae6dad2b88466aefac55071a41926 SOURCES/dataclasses-0.8.tar.gz -29697a34b8cd9df4a77c650e2a38d0a36cdeee8b SOURCES/ethon-0.15.0.gem +5b56a68268708c474bef04550639ded3add5e946 SOURCES/ethon-0.16.0.gem 7a5b2896e210fac9759c786ee4510f265f75b481 SOURCES/eventmachine-1.2.7.gem 97632b7975067266c0b39596de0a4c86d9330658 SOURCES/ffi-1.15.5.gem -86c10824191e8f351da3fe0a0b6db94a813ada3a SOURCES/json-2.6.2.gem +6d78f730b7f3b25fb3f93684fe1364acf58bce6b SOURCES/json-2.6.3.gem f5f804366823c1126791dfefd98dd0539563785c SOURCES/mustermann-2.0.2.gem 41a7fe9f8e3e02da5ae76c821b89c5b376a97746 SOURCES/open4-1.3.4-1.gem 00e234824e85afca99df9043dd6eb47490b220c4 SOURCES/pcs-0.10.15.tar.gz @@ -15,11 +15,11 @@ bd18d97d611233914828719c97b4d98d079913d2 SOURCES/pcs-web-ui-node-modules-0.1.13. 3176b2f2b332c2b6bf79fe882e83feecf3d3f011 SOURCES/pyagentx-0.4.pcs.2.tar.gz c2ba10c775b7a52a4b57cac4d4110a0c0f812a82 SOURCES/python-dateutil-2.8.2.tar.gz d884e586767313f8fcf8c863b5220831a95fccb8 SOURCES/rack-2.2.4.gem -4bebd27a0af0a30dbeba4c5a1b82e05f3418f6be SOURCES/rack-protection-2.2.2.gem +312014942846897a363990784c3be291e66d38a2 SOURCES/rack-protection-2.2.3.gem 3c669527ecbcb9f915a83983ec89320c356e1fe3 SOURCES/rack-test-2.0.2.gem e7f48fa5fb2d92e6cb21d6b1638fe41a5a7c4287 SOURCES/rexml-3.2.5.gem d017b9e4d1978e0b3ccc3e2a31493809e4693cd3 SOURCES/ruby2_keywords-0.0.5.gem -f4603e0742a3849cc9caf2d83f1112a91076bbbb SOURCES/sinatra-2.2.2.gem +5bf6cbdabd03404a654e639b4e949705473c1050 SOURCES/sinatra-2.2.3.gem 1ac6292a98e17247b7bb847a35ff868605256f7b SOURCES/thin-1.8.1.gem 360d77c80d2851a538fb13d43751093115c34712 SOURCES/tilt-2.0.11.gem c23c617c7a0205e465bebad5b8cdf289ae8402a2 SOURCES/tornado-6.1.0.tar.gz diff --git a/SOURCES/bz2151166-01-fix-displaying-bool-and-integer-values.patch b/SOURCES/bz2151166-01-fix-displaying-bool-and-integer-values.patch new file mode 100644 index 0000000..5794eec --- /dev/null +++ b/SOURCES/bz2151166-01-fix-displaying-bool-and-integer-values.patch @@ -0,0 +1,146 @@ +From 2a3747fedeae228345c4ee74ce8ad6d72e297525 Mon Sep 17 00:00:00 2001 +From: Ondrej Mular +Date: Wed, 7 Dec 2022 15:53:25 +0100 +Subject: [PATCH 2/2] fix displaying bool and integer values in `pcs resource + config` command + +--- + CHANGELOG.md | 6 ++++++ + pcs/cli/resource/output.py | 18 +++++++++--------- + pcs_test/resources/cib-resources.xml | 2 +- + pcs_test/tier1/legacy/test_resource.py | 3 ++- + pcs_test/tools/resources_dto.py | 4 ++-- + 5 files changed, 20 insertions(+), 13 deletions(-) + +diff --git a/CHANGELOG.md b/CHANGELOG.md +index 75d50acd..b4d64578 100644 +--- a/CHANGELOG.md ++++ b/CHANGELOG.md +@@ -7,6 +7,12 @@ + self-validation feature when the resource is already misconfigured + ([rhbz#2151511]) + ++### Fixed ++- Displaying bool and integer values in `pcs resource config` command ++ ([rhbz#2151166], [ghissue#604]) ++ ++[ghissue#604]: https://github.com/ClusterLabs/pcs/issues/604 ++[rhbz#2151166]: https://bugzilla.redhat.com/show_bug.cgi?id=2151166 + [rhbz#2151511]: https://bugzilla.redhat.com/show_bug.cgi?id=2151511 + + +diff --git a/pcs/cli/resource/output.py b/pcs/cli/resource/output.py +index 6d1fad16..0705d27b 100644 +--- a/pcs/cli/resource/output.py ++++ b/pcs/cli/resource/output.py +@@ -69,9 +69,9 @@ def _resource_operation_to_pairs( + pairs.append(("interval-origin", operation_dto.interval_origin)) + if operation_dto.timeout: + pairs.append(("timeout", operation_dto.timeout)) +- if operation_dto.enabled: ++ if operation_dto.enabled is not None: + pairs.append(("enabled", _bool_to_cli_value(operation_dto.enabled))) +- if operation_dto.record_pending: ++ if operation_dto.record_pending is not None: + pairs.append( + ("record-pending", _bool_to_cli_value(operation_dto.record_pending)) + ) +@@ -477,13 +477,13 @@ def _resource_bundle_container_options_to_pairs( + options: CibResourceBundleContainerRuntimeOptionsDto, + ) -> List[Tuple[str, str]]: + option_list = [("image", options.image)] +- if options.replicas: ++ if options.replicas is not None: + option_list.append(("replicas", str(options.replicas))) +- if options.replicas_per_host: ++ if options.replicas_per_host is not None: + option_list.append( + ("replicas-per-host", str(options.replicas_per_host)) + ) +- if options.promoted_max: ++ if options.promoted_max is not None: + option_list.append(("promoted-max", str(options.promoted_max))) + if options.run_command: + option_list.append(("run-command", options.run_command)) +@@ -508,7 +508,7 @@ def _resource_bundle_network_options_to_pairs( + network_options.append( + ("ip-range-start", bundle_network_dto.ip_range_start) + ) +- if bundle_network_dto.control_port: ++ if bundle_network_dto.control_port is not None: + network_options.append( + ("control-port", str(bundle_network_dto.control_port)) + ) +@@ -516,7 +516,7 @@ def _resource_bundle_network_options_to_pairs( + network_options.append( + ("host-interface", bundle_network_dto.host_interface) + ) +- if bundle_network_dto.host_netmask: ++ if bundle_network_dto.host_netmask is not None: + network_options.append( + ("host-netmask", str(bundle_network_dto.host_netmask)) + ) +@@ -531,9 +531,9 @@ def _resource_bundle_port_mapping_to_pairs( + bundle_net_port_mapping_dto: CibResourceBundlePortMappingDto, + ) -> List[Tuple[str, str]]: + mapping = [] +- if bundle_net_port_mapping_dto.port: ++ if bundle_net_port_mapping_dto.port is not None: + mapping.append(("port", str(bundle_net_port_mapping_dto.port))) +- if bundle_net_port_mapping_dto.internal_port: ++ if bundle_net_port_mapping_dto.internal_port is not None: + mapping.append( + ("internal-port", str(bundle_net_port_mapping_dto.internal_port)) + ) +diff --git a/pcs_test/resources/cib-resources.xml b/pcs_test/resources/cib-resources.xml +index 67cf5178..524b8fbb 100644 +--- a/pcs_test/resources/cib-resources.xml ++++ b/pcs_test/resources/cib-resources.xml +@@ -53,7 +53,7 @@ + + + +- ++ + + + +diff --git a/pcs_test/tier1/legacy/test_resource.py b/pcs_test/tier1/legacy/test_resource.py +index 2ea5c423..65ad1090 100644 +--- a/pcs_test/tier1/legacy/test_resource.py ++++ b/pcs_test/tier1/legacy/test_resource.py +@@ -753,7 +753,7 @@ Error: moni=tor does not appear to be a valid operation action + + o, r = pcs( + self.temp_cib.name, +- "resource create --no-default-ops OPTest ocf:heartbeat:Dummy op monitor interval=30s OCF_CHECK_LEVEL=1 op monitor interval=25s OCF_CHECK_LEVEL=1".split(), ++ "resource create --no-default-ops OPTest ocf:heartbeat:Dummy op monitor interval=30s OCF_CHECK_LEVEL=1 op monitor interval=25s OCF_CHECK_LEVEL=1 enabled=0".split(), + ) + ac(o, "") + assert r == 0 +@@ -770,6 +770,7 @@ Error: moni=tor does not appear to be a valid operation action + OCF_CHECK_LEVEL=1 + monitor: OPTest-monitor-interval-25s + interval=25s ++ enabled=0 + OCF_CHECK_LEVEL=1 + """ + ), +diff --git a/pcs_test/tools/resources_dto.py b/pcs_test/tools/resources_dto.py +index 8f46f6dd..a980ec80 100644 +--- a/pcs_test/tools/resources_dto.py ++++ b/pcs_test/tools/resources_dto.py +@@ -233,8 +233,8 @@ PRIMITIVE_R7 = CibResourcePrimitiveDto( + start_delay=None, + interval_origin=None, + timeout="20s", +- enabled=None, +- record_pending=None, ++ enabled=False, ++ record_pending=False, + role=None, + on_fail=None, + meta_attributes=[], +-- +2.38.1 + diff --git a/SOURCES/bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch b/SOURCES/bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch new file mode 100644 index 0000000..dd73144 --- /dev/null +++ b/SOURCES/bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch @@ -0,0 +1,753 @@ +From fc2cc9c30dbe3559b4989acda32f8a8613ee5c16 Mon Sep 17 00:00:00 2001 +From: Ondrej Mular +Date: Wed, 7 Dec 2022 11:33:25 +0100 +Subject: [PATCH 1/2] add warning when updating a misconfigured resource + +--- + CHANGELOG.md | 10 +++ + pcs/common/reports/codes.py | 3 + + pcs/common/reports/messages.py | 19 +++++ + pcs/lib/cib/resource/primitive.py | 84 ++++++++++++++----- + pcs/lib/pacemaker/live.py | 38 ++------- + .../tier0/common/reports/test_messages.py | 16 ++++ + .../cib/resource/test_primitive_validate.py | 56 +++++++------ + pcs_test/tier0/lib/pacemaker/test_live.py | 78 +++++------------ + pcs_test/tier1/legacy/test_stonith.py | 5 +- + 9 files changed, 171 insertions(+), 138 deletions(-) + +diff --git a/CHANGELOG.md b/CHANGELOG.md +index 2af6bee1..75d50acd 100644 +--- a/CHANGELOG.md ++++ b/CHANGELOG.md +@@ -1,5 +1,15 @@ + # Change Log + ++## [Unreleased] ++ ++### Added ++- Warning to `pcs resource|stonith update` commands about not using agent ++ self-validation feature when the resource is already misconfigured ++ ([rhbz#2151511]) ++ ++[rhbz#2151511]: https://bugzilla.redhat.com/show_bug.cgi?id=2151511 ++ ++ + ## [0.10.15] - 2022-11-23 + + ### Security +diff --git a/pcs/common/reports/codes.py b/pcs/common/reports/codes.py +index deecc626..48048af7 100644 +--- a/pcs/common/reports/codes.py ++++ b/pcs/common/reports/codes.py +@@ -40,6 +40,9 @@ AGENT_NAME_GUESS_FOUND_MORE_THAN_ONE = M("AGENT_NAME_GUESS_FOUND_MORE_THAN_ONE") + AGENT_NAME_GUESS_FOUND_NONE = M("AGENT_NAME_GUESS_FOUND_NONE") + AGENT_NAME_GUESSED = M("AGENT_NAME_GUESSED") + AGENT_SELF_VALIDATION_INVALID_DATA = M("AGENT_SELF_VALIDATION_INVALID_DATA") ++AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED = M( ++ "AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED" ++) + AGENT_SELF_VALIDATION_RESULT = M("AGENT_SELF_VALIDATION_RESULT") + BAD_CLUSTER_STATE_FORMAT = M("BAD_CLUSTER_STATE_FORMAT") + BOOTH_ADDRESS_DUPLICATION = M("BOOTH_ADDRESS_DUPLICATION") +diff --git a/pcs/common/reports/messages.py b/pcs/common/reports/messages.py +index d27c1dee..24bb222f 100644 +--- a/pcs/common/reports/messages.py ++++ b/pcs/common/reports/messages.py +@@ -7584,6 +7584,25 @@ class AgentSelfValidationInvalidData(ReportItemMessage): + return f"Invalid validation data from agent: {self.reason}" + + ++@dataclass(frozen=True) ++class AgentSelfValidationSkippedUpdatedResourceMisconfigured(ReportItemMessage): ++ """ ++ Agent self validation is skipped when updating a resource as it is ++ misconfigured in its current state. ++ """ ++ ++ result: str ++ _code = codes.AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED ++ ++ @property ++ def message(self) -> str: ++ return ( ++ "The resource was misconfigured before the update, therefore agent " ++ "self-validation will not be run for the updated configuration. " ++ "Validation output of the original configuration:\n{result}" ++ ).format(result="\n".join(indent(self.result.splitlines()))) ++ ++ + @dataclass(frozen=True) + class BoothAuthfileNotUsed(ReportItemMessage): + """ +diff --git a/pcs/lib/cib/resource/primitive.py b/pcs/lib/cib/resource/primitive.py +index 3ebd01c6..c5df8e58 100644 +--- a/pcs/lib/cib/resource/primitive.py ++++ b/pcs/lib/cib/resource/primitive.py +@@ -357,6 +357,31 @@ def _is_ocf_or_stonith_agent(resource_agent_name: ResourceAgentName) -> bool: + return resource_agent_name.standard in ("stonith", "ocf") + + ++def _get_report_from_agent_self_validation( ++ is_valid: Optional[bool], ++ reason: str, ++ report_severity: reports.ReportItemSeverity, ++) -> reports.ReportItemList: ++ report_items = [] ++ if is_valid is None: ++ report_items.append( ++ reports.ReportItem( ++ report_severity, ++ reports.messages.AgentSelfValidationInvalidData(reason), ++ ) ++ ) ++ elif not is_valid or reason: ++ if is_valid: ++ report_severity = reports.ReportItemSeverity.warning() ++ report_items.append( ++ reports.ReportItem( ++ report_severity, ++ reports.messages.AgentSelfValidationResult(reason), ++ ) ++ ) ++ return report_items ++ ++ + def validate_resource_instance_attributes_create( + cmd_runner: CommandRunner, + resource_agent: ResourceAgentFacade, +@@ -402,16 +427,16 @@ def validate_resource_instance_attributes_create( + for report_item in report_items + ) + ): +- ( +- dummy_is_valid, +- agent_validation_reports, +- ) = validate_resource_instance_attributes_via_pcmk( +- cmd_runner, +- agent_name, +- instance_attributes, +- reports.get_severity(reports.codes.FORCE, force), ++ report_items.extend( ++ _get_report_from_agent_self_validation( ++ *validate_resource_instance_attributes_via_pcmk( ++ cmd_runner, ++ agent_name, ++ instance_attributes, ++ ), ++ reports.get_severity(reports.codes.FORCE, force), ++ ) + ) +- report_items.extend(agent_validation_reports) + return report_items + + +@@ -505,25 +530,40 @@ def validate_resource_instance_attributes_update( + ) + ): + ( +- is_valid, +- dummy_reports, ++ original_is_valid, ++ original_reason, + ) = validate_resource_instance_attributes_via_pcmk( + cmd_runner, + agent_name, + current_instance_attrs, +- reports.ReportItemSeverity.error(), + ) +- if is_valid: +- ( +- dummy_is_valid, +- agent_validation_reports, +- ) = validate_resource_instance_attributes_via_pcmk( +- cmd_runner, +- resource_agent.metadata.name, +- final_attrs, +- reports.get_severity(reports.codes.FORCE, force), ++ if original_is_valid: ++ report_items.extend( ++ _get_report_from_agent_self_validation( ++ *validate_resource_instance_attributes_via_pcmk( ++ cmd_runner, ++ resource_agent.metadata.name, ++ final_attrs, ++ ), ++ reports.get_severity(reports.codes.FORCE, force), ++ ) ++ ) ++ elif original_is_valid is None: ++ report_items.append( ++ reports.ReportItem.warning( ++ reports.messages.AgentSelfValidationInvalidData( ++ original_reason ++ ) ++ ) ++ ) ++ else: ++ report_items.append( ++ reports.ReportItem.warning( ++ reports.messages.AgentSelfValidationSkippedUpdatedResourceMisconfigured( ++ original_reason ++ ) ++ ) + ) +- report_items.extend(agent_validation_reports) + return report_items + + +diff --git a/pcs/lib/pacemaker/live.py b/pcs/lib/pacemaker/live.py +index fd26dabb..726f6b67 100644 +--- a/pcs/lib/pacemaker/live.py ++++ b/pcs/lib/pacemaker/live.py +@@ -902,8 +902,7 @@ def _validate_stonith_instance_attributes_via_pcmk( + cmd_runner: CommandRunner, + agent_name: ResourceAgentName, + instance_attributes: Mapping[str, str], +- not_valid_severity: reports.ReportItemSeverity, +-) -> Tuple[Optional[bool], reports.ReportItemList]: ++) -> Tuple[Optional[bool], str]: + cmd = [ + settings.stonith_admin, + "--validate", +@@ -917,7 +916,6 @@ def _validate_stonith_instance_attributes_via_pcmk( + cmd, + "./validate/command/output", + instance_attributes, +- not_valid_severity, + ) + + +@@ -925,8 +923,7 @@ def _validate_resource_instance_attributes_via_pcmk( + cmd_runner: CommandRunner, + agent_name: ResourceAgentName, + instance_attributes: Mapping[str, str], +- not_valid_severity: reports.ReportItemSeverity, +-) -> Tuple[Optional[bool], reports.ReportItemList]: ++) -> Tuple[Optional[bool], str]: + cmd = [ + settings.crm_resource_binary, + "--validate", +@@ -944,7 +941,6 @@ def _validate_resource_instance_attributes_via_pcmk( + cmd, + "./resource-agent-action/command/output", + instance_attributes, +- not_valid_severity, + ) + + +@@ -953,8 +949,7 @@ def _handle_instance_attributes_validation_via_pcmk( + cmd: StringSequence, + data_xpath: str, + instance_attributes: Mapping[str, str], +- not_valid_severity: reports.ReportItemSeverity, +-) -> Tuple[Optional[bool], reports.ReportItemList]: ++) -> Tuple[Optional[bool], str]: + full_cmd = list(cmd) + for key, value in sorted(instance_attributes.items()): + full_cmd.extend(["--option", f"{key}={value}"]) +@@ -963,12 +958,7 @@ def _handle_instance_attributes_validation_via_pcmk( + # dom = _get_api_result_dom(stdout) + dom = xml_fromstring(stdout) + except (etree.XMLSyntaxError, etree.DocumentInvalid) as e: +- return None, [ +- reports.ReportItem( +- not_valid_severity, +- reports.messages.AgentSelfValidationInvalidData(str(e)), +- ) +- ] ++ return None, str(e) + result = "\n".join( + "\n".join( + line.strip() for line in item.text.split("\n") if line.strip() +@@ -976,38 +966,22 @@ def _handle_instance_attributes_validation_via_pcmk( + for item in dom.iterfind(data_xpath) + if item.get("source") == "stderr" and item.text + ).strip() +- if return_value == 0: +- if result: +- return True, [ +- reports.ReportItem.warning( +- reports.messages.AgentSelfValidationResult(result) +- ) +- ] +- return True, [] +- return False, [ +- reports.ReportItem( +- not_valid_severity, +- reports.messages.AgentSelfValidationResult(result), +- ) +- ] ++ return return_value == 0, result + + + def validate_resource_instance_attributes_via_pcmk( + cmd_runner: CommandRunner, + resource_agent_name: ResourceAgentName, + instance_attributes: Mapping[str, str], +- not_valid_severity: reports.ReportItemSeverity, +-) -> Tuple[Optional[bool], reports.ReportItemList]: ++) -> Tuple[Optional[bool], str]: + if resource_agent_name.is_stonith: + return _validate_stonith_instance_attributes_via_pcmk( + cmd_runner, + resource_agent_name, + instance_attributes, +- not_valid_severity, + ) + return _validate_resource_instance_attributes_via_pcmk( + cmd_runner, + resource_agent_name, + instance_attributes, +- not_valid_severity, + ) +diff --git a/pcs_test/tier0/common/reports/test_messages.py b/pcs_test/tier0/common/reports/test_messages.py +index 17627b80..5fcc62fc 100644 +--- a/pcs_test/tier0/common/reports/test_messages.py ++++ b/pcs_test/tier0/common/reports/test_messages.py +@@ -5562,6 +5562,22 @@ class AgentSelfValidationInvalidData(NameBuildTest): + ) + + ++class AgentSelfValidationSkippedUpdatedResourceMisconfigured(NameBuildTest): ++ def test_message(self): ++ lines = list(f"line #{i}" for i in range(3)) ++ self.assert_message_from_report( ++ ( ++ "The resource was misconfigured before the update, therefore " ++ "agent self-validation will not be run for the updated " ++ "configuration. Validation output of the original " ++ "configuration:\n {}" ++ ).format("\n ".join(lines)), ++ reports.AgentSelfValidationSkippedUpdatedResourceMisconfigured( ++ "\n".join(lines) ++ ), ++ ) ++ ++ + class BoothAuthfileNotUsed(NameBuildTest): + def test_message(self): + self.assert_message_from_report( +diff --git a/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py b/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py +index 2cba7086..1bc3a5a6 100644 +--- a/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py ++++ b/pcs_test/tier0/lib/cib/resource/test_primitive_validate.py +@@ -609,7 +609,6 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ) + + def test_force(self): +@@ -629,15 +628,14 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + attributes, +- reports.ReportItemSeverity.warning(), + ) + + def test_failure(self): + attributes = {"required": "value"} + facade = _fixture_ocf_agent() +- failure_reports = ["report1", "report2"] +- self.agent_self_validation_mock.return_value = False, failure_reports +- self.assertEqual( ++ failure_reason = "failure reason" ++ self.agent_self_validation_mock.return_value = False, failure_reason ++ assert_report_item_list_equal( + primitive.validate_resource_instance_attributes_create( + self.cmd_runner, + facade, +@@ -645,13 +643,18 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase): + etree.Element("resources"), + force=False, + ), +- failure_reports, ++ [ ++ fixture.error( ++ reports.codes.AGENT_SELF_VALIDATION_RESULT, ++ result=failure_reason, ++ force_code=reports.codes.FORCE, ++ ) ++ ], + ) + self.agent_self_validation_mock.assert_called_once_with( + self.cmd_runner, + facade.metadata.name, + attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ) + + def test_stonith_check(self): +@@ -671,7 +674,6 @@ class ValidateResourceInstanceAttributesCreateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ) + + def test_nonexisting_agent(self): +@@ -1295,13 +1297,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + old_attributes, +- reports.ReportItemSeverity.error(), + ), + mock.call( + self.cmd_runner, + facade.metadata.name, + new_attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ), + ], + ) +@@ -1328,13 +1328,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + old_attributes, +- reports.ReportItemSeverity.error(), + ), + mock.call( + self.cmd_runner, + facade.metadata.name, + new_attributes, +- reports.ReportItemSeverity.warning(), + ), + ], + ) +@@ -1342,13 +1340,13 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + def test_failure(self): + old_attributes = {"required": "old_value"} + new_attributes = {"required": "new_value"} +- failure_reports = ["report1", "report2"] ++ failure_reason = "failure reason" + facade = _fixture_ocf_agent() + self.agent_self_validation_mock.side_effect = ( +- (True, []), +- (False, failure_reports), ++ (True, ""), ++ (False, failure_reason), + ) +- self.assertEqual( ++ assert_report_item_list_equal( + primitive.validate_resource_instance_attributes_update( + self.cmd_runner, + facade, +@@ -1357,7 +1355,13 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self._fixture_resources(old_attributes), + force=False, + ), +- failure_reports, ++ [ ++ fixture.error( ++ reports.codes.AGENT_SELF_VALIDATION_RESULT, ++ result=failure_reason, ++ force_code=reports.codes.FORCE, ++ ) ++ ], + ) + self.assertEqual( + self.agent_self_validation_mock.mock_calls, +@@ -1366,13 +1370,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + old_attributes, +- reports.ReportItemSeverity.error(), + ), + mock.call( + self.cmd_runner, + facade.metadata.name, + new_attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ), + ], + ) +@@ -1399,13 +1401,11 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + old_attributes, +- reports.ReportItemSeverity.error(), + ), + mock.call( + self.cmd_runner, + facade.metadata.name, + new_attributes, +- reports.ReportItemSeverity.error(reports.codes.FORCE), + ), + ], + ) +@@ -1471,10 +1471,10 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + def test_current_attributes_failure(self): + old_attributes = {"required": "old_value"} + new_attributes = {"required": "new_value"} +- failure_reports = ["report1", "report2"] ++ failure_reason = "failure reason" + facade = _fixture_ocf_agent() +- self.agent_self_validation_mock.return_value = False, failure_reports +- self.assertEqual( ++ self.agent_self_validation_mock.return_value = False, failure_reason ++ assert_report_item_list_equal( + primitive.validate_resource_instance_attributes_update( + self.cmd_runner, + facade, +@@ -1483,7 +1483,12 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self._fixture_resources(old_attributes), + force=False, + ), +- [], ++ [ ++ fixture.warn( ++ reports.codes.AGENT_SELF_VALIDATION_SKIPPED_UPDATED_RESOURCE_MISCONFIGURED, ++ result=failure_reason, ++ ) ++ ], + ) + self.assertEqual( + self.agent_self_validation_mock.mock_calls, +@@ -1492,7 +1497,6 @@ class ValidateResourceInstanceAttributesUpdateSelfValidation(TestCase): + self.cmd_runner, + facade.metadata.name, + old_attributes, +- reports.ReportItemSeverity.error(), + ), + ], + ) +diff --git a/pcs_test/tier0/lib/pacemaker/test_live.py b/pcs_test/tier0/lib/pacemaker/test_live.py +index 5c8000cd..239a72b1 100644 +--- a/pcs_test/tier0/lib/pacemaker/test_live.py ++++ b/pcs_test/tier0/lib/pacemaker/test_live.py +@@ -1752,16 +1752,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertTrue(is_valid) +- self.assertEqual(report_list, []) ++ self.assertEqual(reason, "") + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] + ) +@@ -1771,23 +1770,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertIsNone(is_valid) +- assert_report_item_list_equal( +- report_list, +- [ +- fixture.info( +- report_codes.AGENT_SELF_VALIDATION_INVALID_DATA, +- reason="Start tag expected, '<' not found, line 1, column 1 (, line 1)", +- ) +- ], ++ self.assertEqual( ++ reason, ++ "Start tag expected, '<' not found, line 1, column 1 (, line 1)", + ) + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] +@@ -1806,19 +1799,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertTrue(is_valid) +- assert_report_item_list_equal( +- report_list, +- [], +- ) ++ self.assertEqual(reason, "") + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] + ) +@@ -1837,23 +1826,15 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertFalse(is_valid) +- assert_report_item_list_equal( +- report_list, +- [ +- fixture.info( +- report_codes.AGENT_SELF_VALIDATION_RESULT, result="" +- ) +- ], +- ) ++ self.assertEqual(reason, "") + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] + ) +@@ -1881,23 +1862,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertFalse(is_valid) +- assert_report_item_list_equal( +- report_list, +- [ +- fixture.info( +- report_codes.AGENT_SELF_VALIDATION_RESULT, +- result="first line\nImportant output\nand another line", +- ) +- ], ++ self.assertEqual( ++ reason, ++ "first line\nImportant output\nand another line", + ) + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] +@@ -1925,23 +1900,17 @@ class HandleInstanceAttributesValidateViaPcmkTest(TestCase): + base_cmd = ["some", "command"] + ( + is_valid, +- report_list, ++ reason, + ) = lib._handle_instance_attributes_validation_via_pcmk( + runner, + base_cmd, + "result/output", + {"attr1": "val1", "attr2": "val2"}, +- not_valid_severity=Severity.info(), + ) + self.assertTrue(is_valid) +- assert_report_item_list_equal( +- report_list, +- [ +- fixture.warn( +- report_codes.AGENT_SELF_VALIDATION_RESULT, +- result="first line\nImportant output\nand another line", +- ) +- ], ++ self.assertEqual( ++ reason, ++ "first line\nImportant output\nand another line", + ) + runner.run.assert_called_once_with( + base_cmd + ["--option", "attr1=val1", "--option", "attr2=val2"] +@@ -1953,7 +1922,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase): + def setUp(self): + self.runner = mock.Mock() + self.attrs = dict(attra="val1", attrb="val2") +- self.severity = Severity.info() + patcher = mock.patch( + "pcs.lib.pacemaker.live._handle_instance_attributes_validation_via_pcmk" + ) +@@ -1967,7 +1935,7 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase): + ) + self.assertEqual( + lib._validate_resource_instance_attributes_via_pcmk( +- self.runner, agent, self.attrs, self.severity ++ self.runner, agent, self.attrs + ), + self.ret_val, + ) +@@ -1987,7 +1955,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase): + ], + "./resource-agent-action/command/output", + self.attrs, +- self.severity, + ) + + def test_without_provider(self): +@@ -1996,7 +1963,7 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase): + ) + self.assertEqual( + lib._validate_resource_instance_attributes_via_pcmk( +- self.runner, agent, self.attrs, self.severity ++ self.runner, agent, self.attrs + ), + self.ret_val, + ) +@@ -2014,7 +1981,6 @@ class ValidateResourceInstanceAttributesViaPcmkTest(TestCase): + ], + "./resource-agent-action/command/output", + self.attrs, +- self.severity, + ) + + +@@ -2024,7 +1990,6 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase): + def setUp(self): + self.runner = mock.Mock() + self.attrs = dict(attra="val1", attrb="val2") +- self.severity = Severity.info() + patcher = mock.patch( + "pcs.lib.pacemaker.live._handle_instance_attributes_validation_via_pcmk" + ) +@@ -2038,7 +2003,7 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase): + ) + self.assertEqual( + lib._validate_stonith_instance_attributes_via_pcmk( +- self.runner, agent, self.attrs, self.severity ++ self.runner, agent, self.attrs + ), + self.ret_val, + ) +@@ -2054,5 +2019,4 @@ class ValidateStonithInstanceAttributesViaPcmkTest(TestCase): + ], + "./validate/command/output", + self.attrs, +- self.severity, + ) +diff --git a/pcs_test/tier1/legacy/test_stonith.py b/pcs_test/tier1/legacy/test_stonith.py +index 9911d604..cf430d75 100644 +--- a/pcs_test/tier1/legacy/test_stonith.py ++++ b/pcs_test/tier1/legacy/test_stonith.py +@@ -1294,7 +1294,10 @@ class StonithTest(TestCase, AssertPcsMixin): + ), + ) + +- self.assert_pcs_success("stonith update test3 username=testA".split()) ++ self.assert_pcs_success( ++ "stonith update test3 username=testA".split(), ++ stdout_start="Warning: ", ++ ) + + self.assert_pcs_success( + "stonith config test2".split(), +-- +2.38.1 + diff --git a/SOURCES/pcsd-rubygem-json-error-message-change.patch b/SOURCES/pcsd-rubygem-json-error-message-change.patch new file mode 100644 index 0000000..cd5b357 --- /dev/null +++ b/SOURCES/pcsd-rubygem-json-error-message-change.patch @@ -0,0 +1,40 @@ +From 38333342cb0e931b11bbf57ba469b47172221a32 Mon Sep 17 00:00:00 2001 +From: Mamoru TASAKA +Date: Thu, 8 Dec 2022 22:47:59 +0900 +Subject: [PATCH] pcsd ruby: adjust to json 2.6.3 error message change + +json 2.6.3 now removes line number information from parser +error message. +Adjust regex pattern on pcs test code for ruby to support +this error format. + +Fixes #606 . +--- + pcsd/test/test_config.rb | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/pcsd/test/test_config.rb b/pcsd/test/test_config.rb +index 7aaf4349..a580b24f 100644 +--- a/pcsd/test/test_config.rb ++++ b/pcsd/test/test_config.rb +@@ -126,7 +126,7 @@ class TestConfig < Test::Unit::TestCase + assert_equal('error', $logger.log[0][0]) + assert_match( + # the number is based on JSON gem version +- /Unable to parse pcs_settings file: \d+: unexpected token/, ++ /Unable to parse pcs_settings file: (\d+: )?unexpected token/, + $logger.log[0][1] + ) + assert_equal(fixture_empty_config, cfg.text) +@@ -723,7 +723,7 @@ class TestCfgKnownHosts < Test::Unit::TestCase + assert_equal('error', $logger.log[0][0]) + assert_match( + # the number is based on JSON gem version +- /Unable to parse known-hosts file: \d+: unexpected token/, ++ /Unable to parse known-hosts file: (\d+: )?unexpected token/, + $logger.log[0][1] + ) + assert_empty_data(cfg) +-- +2.38.1 + diff --git a/SPECS/pcs.spec b/SPECS/pcs.spec index 61eef10..e8710c6 100644 --- a/SPECS/pcs.spec +++ b/SPECS/pcs.spec @@ -1,6 +1,6 @@ Name: pcs Version: 0.10.15 -Release: 1%{?dist} +Release: 2%{?dist} # https://docs.fedoraproject.org/en-US/packaging-guidelines/LicensingGuidelines/ # https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses # GPL-2.0-only: pcs @@ -9,10 +9,10 @@ Release: 1%{?dist} # MIT: backports, dacite, daemons, ember, ethon, handlebars, jquery, jquery-ui, # mustermann, rack, rack-protection, rack-test, sinatra, tilt # GPL-2.0-only or Ruby: eventmachine, json -# (GPL-2.0-only or Ruby) and BSD: thin +# (GPL-2.0-only or Ruby) and BSD-2-Clause: thin # BSD-2-Clause or Ruby: open4, ruby2_keywords # BSD-3-Clause and MIT: ffi -License: GPL-2.0-only AND Apache-2.0 AND MIT AND BSD-3-Clause AND (GPL-2.0-only OR Ruby) AND (BSD-2-Clause OR Ruby) AND (Apache-2.0 OR BSD-3-Clause) +License: GPL-2.0-only AND Apache-2.0 AND MIT AND BSD-3-Clause AND (GPL-2.0-only OR Ruby) AND (BSD-2-Clause OR Ruby) AND BSD-2-Clause AND (Apache-2.0 OR BSD-3-Clause) URL: https://github.com/ClusterLabs/pcs Group: System Environment/Base Summary: Pacemaker Configuration System @@ -37,18 +37,18 @@ ExclusiveArch: i686 x86_64 s390x ppc64le aarch64 %global dateutil_version 2.8.2 %global version_rubygem_backports 3.23.0 %global version_rubygem_daemons 1.4.1 -%global version_rubygem_ethon 0.15.0 +%global version_rubygem_ethon 0.16.0 %global version_rubygem_eventmachine 1.2.7 %global version_rubygem_ffi 1.15.5 -%global version_rubygem_json 2.6.2 +%global version_rubygem_json 2.6.3 %global version_rubygem_mustermann 2.0.2 %global version_rubygem_open4 1.3.4 %global version_rubygem_rack 2.2.4 -%global version_rubygem_rack_protection 2.2.2 +%global version_rubygem_rack_protection 2.2.3 %global version_rubygem_rack_test 2.0.2 %global version_rubygem_rexml 3.2.5 %global version_rubygem_ruby2_keywords 0.0.5 -%global version_rubygem_sinatra 2.2.2 +%global version_rubygem_sinatra 2.2.3 %global version_rubygem_thin 1.8.1 %global version_rubygem_tilt 2.0.11 @@ -122,6 +122,9 @@ Source101: https://github.com/ClusterLabs/pcs-web-ui/releases/download/%{ui_modu # pcs patches: <= 200 # Patch1: bzNUMBER-01-name.patch Patch1: do-not-support-cluster-setup-with-udp-u-transport.patch +Patch2: bz2151511-01-add-warning-when-updating-a-misconfigured-resource.patch +Patch3: bz2151166-01-fix-displaying-bool-and-integer-values.patch +Patch4: pcsd-rubygem-json-error-message-change.patch # Downstream patches do not come from upstream. They adapt pcs for specific # RHEL needs. @@ -321,6 +324,10 @@ update_times_patch(){ %autopatch -p1 -M 200 update_times_patch %{PATCH1} +update_times_patch %{PATCH2} +update_times_patch %{PATCH3} +update_times_patch %{PATCH4} + # update_times_patch %{PATCH101} cp -f %SOURCE1 %{pcsd_public_dir}/images @@ -473,7 +480,7 @@ run_all_tests remove_all_tests %posttrans -# Make sure the new version of the daemon is runnning. +# Make sure the new version of the daemon is running. # Also, make sure to start pcsd-ruby if it hasn't been started or even # installed before. This is done by restarting pcsd.service. %{_bindir}/systemctl daemon-reload @@ -570,6 +577,12 @@ remove_all_tests %license pyagentx_LICENSE.txt %changelog +* Fri Dec 16 2022 Michal Pospisil - 0.10.15-2 +- Added warning when omitting validation of misconfigured resource +- Fixed displaying of bool and integer values in `pcs resource config` command +- Updated bundled rubygems: ethon, json, rack-protection, sinatra +- Resolves: rhbz#2151166 rhbz#2151511 + * Wed Nov 23 2022 Michal Pospisil - 0.10.15-1 - Rebased to latest upstream sources (see CHANGELOG.md) - Updated Python bundled dependency dateutil