From aedbf1113c21c668c1f5dd76c2085ce5100c3865 Mon Sep 17 00:00:00 2001 From: devanshjain Date: Wed, 1 Oct 2025 20:49:36 +0000 Subject: [PATCH 1/8] Add provider value resolution and enhance parameter status determination logic --- src/modules/get_pcmk_properties_scs.py | 135 ++++++++++++------ .../ha_db_hana/tasks/files/constants.yaml | 1 - tests/modules/get_pcmk_properties_scs_test.py | 1 - 3 files changed, 91 insertions(+), 46 deletions(-) diff --git a/src/modules/get_pcmk_properties_scs.py b/src/modules/get_pcmk_properties_scs.py index 59680f1c..c4d61349 100644 --- a/src/modules/get_pcmk_properties_scs.py +++ b/src/modules/get_pcmk_properties_scs.py @@ -246,6 +246,82 @@ def _validate_resource_constants(self): return parameters + def _resolve_provider_values(self, expected_value: dict) -> list: + """ + Resolve provider-specific values from a configuration dictionary. + + This method handles the complex logic of extracting appropriate values + based on the NFS provider configuration. It supports both provider-specific + configurations and fallback to all available providers. + + :param expected_value: Dictionary containing provider configurations + :type expected_value: dict + :return: List of resolved values for validation + :rtype: list + :raises TypeError: If expected_value is not a dictionary + """ + if not isinstance(expected_value, dict): + raise TypeError("Expected value must be a dictionary for provider resolution") + + provider_values = [] + if self.nfs_provider and self.nfs_provider in expected_value: + provider_config = expected_value[self.nfs_provider] + provider_values = self._extract_values_from_config(provider_config) + else: + for _, provider_config in expected_value.items(): + extracted_values = self._extract_values_from_config(provider_config) + if isinstance(extracted_values, list): + provider_values.extend(extracted_values) + else: + provider_values.append(extracted_values) + + return provider_values if isinstance(provider_values, list) else [provider_values] + + def _extract_values_from_config(self, provider_config): + """ + Extract values from a provider configuration structure. + + Handles various configuration formats: + - {"value": [list]} or {"value": "single"} + - [list] directly + - "single" value directly + + :param provider_config: Configuration object to extract values from + :type provider_config: dict or list or str + :return: Extracted value(s) + :rtype: list or str + """ + if isinstance(provider_config, dict) and "value" in provider_config: + return provider_config["value"] + elif isinstance(provider_config, (list, str)): + return provider_config + else: + return provider_config + + def _compare_value_with_expectations(self, value: str, expected_values) -> str: + """ + Compare a value against expected values and return test status. + + :param value: The actual value to compare + :type value: str + :param expected_values: Expected value(s) for comparison + :type expected_values: str or list + :return: Test status (SUCCESS or ERROR) + :rtype: str + """ + if isinstance(expected_values, list): + return ( + TestStatus.SUCCESS.value + if str(value) in [str(v) for v in expected_values] + else TestStatus.ERROR.value + ) + else: + return ( + TestStatus.SUCCESS.value + if str(value) == str(expected_values) + else TestStatus.ERROR.value + ) + def _determine_parameter_status(self, value, expected_value): """ Determine the status of a parameter with SCS-specific logic for NFS provider. @@ -257,60 +333,31 @@ def _determine_parameter_status(self, value, expected_value): :return: The status of the parameter. :rtype: str """ + # Handle tuple format (value, required) if isinstance(expected_value, tuple): expected_val, required = expected_value if not required and (expected_val is None or value == ""): return TestStatus.INFO.value expected_value = expected_val + # Handle empty/null cases if expected_value is None or value == "": return TestStatus.INFO.value + + # Handle simple string/list cases elif isinstance(expected_value, (str, list)): - if isinstance(expected_value, list): - return ( - TestStatus.SUCCESS.value - if str(value) in expected_value - else TestStatus.ERROR.value - ) - else: - return ( - TestStatus.SUCCESS.value - if str(value) == str(expected_value) - else TestStatus.ERROR.value - ) + return self._compare_value_with_expectations(value, expected_value) + + # Handle complex provider-based dictionary cases elif isinstance(expected_value, dict): - provider_values = [] - if self.nfs_provider and self.nfs_provider in expected_value: - provider_config = expected_value[self.nfs_provider] - if isinstance(provider_config, dict) and "value" in provider_config: - provider_values = provider_config["value"] - else: - provider_values = provider_config - else: - # If provider is unknown/not set, collect all provider values - for provider_key, provider_config in expected_value.items(): - if isinstance(provider_config, dict) and "value" in provider_config: - if isinstance(provider_config["value"], list): - provider_values.extend(provider_config["value"]) - else: - provider_values.append(provider_config["value"]) - elif isinstance(provider_config, list): - provider_values.extend(provider_config) - else: - provider_values.append(provider_config) - - if isinstance(provider_values, list): - return ( - TestStatus.SUCCESS.value - if str(value) in provider_values - else TestStatus.ERROR.value - ) - else: - return ( - TestStatus.SUCCESS.value - if str(value) == str(provider_values) - else TestStatus.ERROR.value - ) + try: + provider_values = self._resolve_provider_values(expected_value) + return self._compare_value_with_expectations(value, provider_values) + except (TypeError, KeyError) as ex: + self.result["message"] += f"Error resolving provider values: {str(ex)} " + return TestStatus.ERROR.value + + # Handle unexpected types else: return TestStatus.ERROR.value diff --git a/src/roles/ha_db_hana/tasks/files/constants.yaml b/src/roles/ha_db_hana/tasks/files/constants.yaml index f2865b5d..c3cd5660 100644 --- a/src/roles/ha_db_hana/tasks/files/constants.yaml +++ b/src/roles/ha_db_hana/tasks/files/constants.yaml @@ -731,7 +731,6 @@ OS_PARAMETERS: # === Global INI === # Reading the global.ini file to get the provider and path for the SAPHanaSR resource agent GLOBAL_INI: - GLOBAL_INI: SUSE: SAPHanaSR: provider: diff --git a/tests/modules/get_pcmk_properties_scs_test.py b/tests/modules/get_pcmk_properties_scs_test.py index 51bac43e..663605d4 100644 --- a/tests/modules/get_pcmk_properties_scs_test.py +++ b/tests/modules/get_pcmk_properties_scs_test.py @@ -369,7 +369,6 @@ def test_determine_parameter_status_with_list_expected_value(self, validator): status = validator._determine_parameter_status( "10.0.1.101", (["10.0.1.100", "10.0.1.101"], False) ) - print(f"Actual status: {status}, Expected: {TestStatus.SUCCESS.value}") assert status == TestStatus.SUCCESS.value def test_determine_parameter_status_info_cases(self, validator): From a64f0b20021fdb8bff492594a5b63112daccb75e Mon Sep 17 00:00:00 2001 From: devanshjain Date: Wed, 1 Oct 2025 22:20:30 +0000 Subject: [PATCH 2/8] Refactor cluster parameter retrieval logic and update related tests --- src/module_utils/commands.py | 5 ++--- src/modules/get_cluster_status_db.py | 20 +++++++++++--------- src/roles/ha_db_hana/tasks/block-network.yml | 3 +++ tests/modules/get_cluster_status_db_test.py | 14 +++++++------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/module_utils/commands.py b/src/module_utils/commands.py index c3aa5fb9..94a12ad3 100644 --- a/src/module_utils/commands.py +++ b/src/module_utils/commands.py @@ -30,14 +30,13 @@ OperatingSystemFamily.SUSE: ["crm", "configure", "get_property", "stonith-action"], } -AUTOMATED_REGISTER = [ +CIBADMIN_COMMAND = lambda parameter: [ "cibadmin", "--query", "--xpath", - "//nvpair[@name='AUTOMATED_REGISTER']", + "//nvpair[@name='" + parameter + "']", ] - FREEZE_FILESYSTEM = lambda file_system, mount_point: [ "mount", "-o", diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index bc2da107..fbd50495 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -14,10 +14,10 @@ try: from ansible.module_utils.get_cluster_status import BaseClusterStatusChecker from ansible.module_utils.enums import OperatingSystemFamily, HanaSRProvider - from ansible.module_utils.commands import AUTOMATED_REGISTER + from ansible.module_utils.commands import CIBADMIN_COMMAND except ImportError: from src.module_utils.get_cluster_status import BaseClusterStatusChecker - from src.module_utils.commands import AUTOMATED_REGISTER + from src.module_utils.commands import CIBADMIN_COMMAND from src.module_utils.enums import OperatingSystemFamily, HanaSRProvider @@ -161,18 +161,20 @@ def __init__( "replication_mode": "", "primary_site_name": "", "AUTOMATED_REGISTER": "false", + "PRIORITY_FENCING_DELAY": "", } ) - def _get_automation_register(self) -> None: + def _get_cluster_pramaeters(self) -> None: """ Retrieves the value of the AUTOMATED_REGISTER attribute. """ - try: - cmd_output = self.execute_command_subprocess(AUTOMATED_REGISTER).strip() - self.result["AUTOMATED_REGISTER"] = ET.fromstring(cmd_output).get("value") - except Exception: - self.result["AUTOMATED_REGISTER"] = "unknown" + for parameter in ["AUTOMATED_REGISTER", "priority-fencing-delay"]: + try: + cmd_output = self.execute_command_subprocess(CIBADMIN_COMMAND(parameter)).strip() + self.result[parameter] = ET.fromstring(cmd_output).get("value") + except Exception: + self.result[parameter] = "unknown" def _process_node_attributes(self, cluster_status_xml: ET.Element) -> Dict[str, Any]: """ @@ -281,7 +283,7 @@ def run(self) -> Dict[str, str]: :rtype: Dict[str, str] """ result = super().run() - self._get_automation_register() + self._get_cluster_pramaeters() return result diff --git a/src/roles/ha_db_hana/tasks/block-network.yml b/src/roles/ha_db_hana/tasks/block-network.yml index 4ed49b67..9f02240f 100644 --- a/src/roles/ha_db_hana/tasks/block-network.yml +++ b/src/roles/ha_db_hana/tasks/block-network.yml @@ -23,6 +23,8 @@ - node_tier == "hana" - pre_validations_status == "PASSED" - cluster_status_pre.stonith_action == "reboot" + - cluster_status_pre.PRIORITY_FENCING_DELAY is not "" + - cluster_status_pre.PRIORITY_FENCING_DELAY is not "unknown" block: - name: "Test Execution: Block Network Communication" when: ansible_hostname == cluster_status_pre.primary_node @@ -227,6 +229,7 @@ test_case_details_from_test_case: { "Pre Validations: Remove any location_constraints": "{{ location_constraints_results }}", "Pre Validations: Validate HANA DB cluster status": "{{ cluster_status_pre }}", + "Pre Validations: priority-fencing-delay": "{{ cluster_status_pre.PRIORITY_FENCING_DELAY | default('Not Configured') }}", "Pre Validations: CleanUp any failed resource": "{{ cleanup_failed_resource_pre }}", "Cluster Status": "{{ cluster_status_pre }}", } diff --git a/tests/modules/get_cluster_status_db_test.py b/tests/modules/get_cluster_status_db_test.py index b7c413fc..0aec3db3 100644 --- a/tests/modules/get_cluster_status_db_test.py +++ b/tests/modules/get_cluster_status_db_test.py @@ -51,9 +51,9 @@ def hana_checker_angi(self): hana_resource_name="rsc_SAPHanaCon_TEST_HDB00", ) - def test_get_automation_register(self, mocker, hana_checker_classic): + def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): """ - Test the _get_automation_register method. + Test the _get_cluster_pramaeters method. :param mocker: Mocking library for Python. :type mocker: _mocker.MagicMock @@ -67,13 +67,13 @@ def test_get_automation_register(self, mocker, hana_checker_classic): + 'name="AUTOMATED_REGISTER" value="true"/>', ) - hana_checker_classic._get_automation_register() + hana_checker_classic._get_cluster_pramaeters() assert hana_checker_classic.result["AUTOMATED_REGISTER"] == "true" - def test_get_automation_register_exception(self, mocker, hana_checker_classic): + def test_get_cluster_pramaeters_exception(self, mocker, hana_checker_classic): """ - Test the _get_automation_register method when an exception occurs. + Test the _get_cluster_pramaeters method when an exception occurs. :param mocker: Mocking library for Python. :type mocker: _mocker.MagicMock @@ -84,7 +84,7 @@ def test_get_automation_register_exception(self, mocker, hana_checker_classic): hana_checker_classic, "execute_command_subprocess", side_effect=Exception("Test error") ) - hana_checker_classic._get_automation_register() + hana_checker_classic._get_cluster_pramaeters() assert hana_checker_classic.result["AUTOMATED_REGISTER"] == "unknown" @@ -257,7 +257,7 @@ def test_run(self, mocker, hana_checker_classic): return_value={"status": "PASSED"}, ) - mock_get_automation = mocker.patch.object(hana_checker_classic, "_get_automation_register") + mock_get_automation = mocker.patch.object(hana_checker_classic, "_get_cluster_pramaeters") result = hana_checker_classic.run() From f791742316363524ee81c90252f5f2e3b42cffce Mon Sep 17 00:00:00 2001 From: devanshjain Date: Wed, 1 Oct 2025 22:47:30 +0000 Subject: [PATCH 3/8] Refactor command imports and update cluster status retrieval logic to use new parameters --- src/module_utils/commands.py | 19 ++++++++++++++----- src/modules/get_cluster_status_db.py | 17 +++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/module_utils/commands.py b/src/module_utils/commands.py index 94a12ad3..93ee3cc2 100644 --- a/src/module_utils/commands.py +++ b/src/module_utils/commands.py @@ -30,11 +30,20 @@ OperatingSystemFamily.SUSE: ["crm", "configure", "get_property", "stonith-action"], } -CIBADMIN_COMMAND = lambda parameter: [ - "cibadmin", - "--query", - "--xpath", - "//nvpair[@name='" + parameter + "']", +AUTOMATED_REGISTER = lambda rsc: [ + "crm_resource", + "--resource", + rsc, + "--get-parameter=AUTOMATED_REGISTER", +] + +PRIORITY_FENCING_DELAY = [ + "crm_attribute", + "--type", + "crm_config", + "--name", + "priority-fencing-delay", + "--quiet", ] FREEZE_FILESYSTEM = lambda file_system, mount_point: [ diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index fbd50495..c76f40d8 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -14,10 +14,10 @@ try: from ansible.module_utils.get_cluster_status import BaseClusterStatusChecker from ansible.module_utils.enums import OperatingSystemFamily, HanaSRProvider - from ansible.module_utils.commands import CIBADMIN_COMMAND + from ansible.module_utils.commands import AUTOMATED_REGISTER, PRIORITY_FENCING_DELAY except ImportError: from src.module_utils.get_cluster_status import BaseClusterStatusChecker - from src.module_utils.commands import CIBADMIN_COMMAND + from src.module_utils.commands import AUTOMATED_REGISTER, PRIORITY_FENCING_DELAY from src.module_utils.enums import OperatingSystemFamily, HanaSRProvider @@ -169,12 +169,17 @@ def _get_cluster_pramaeters(self) -> None: """ Retrieves the value of the AUTOMATED_REGISTER attribute. """ - for parameter in ["AUTOMATED_REGISTER", "priority-fencing-delay"]: + param_commands = { + "AUTOMATED_REGISTER": AUTOMATED_REGISTER(self.hana_resource_name), + "PRIORITY_FENCING_DELAY": PRIORITY_FENCING_DELAY, + } + + for param_name, command in param_commands.items(): try: - cmd_output = self.execute_command_subprocess(CIBADMIN_COMMAND(parameter)).strip() - self.result[parameter] = ET.fromstring(cmd_output).get("value") + cmd_output = self.execute_command_subprocess(command).strip() + self.result[param_name] = ET.fromstring(cmd_output).get("value") except Exception: - self.result[parameter] = "unknown" + self.result[param_name] = "unknown" def _process_node_attributes(self, cluster_status_xml: ET.Element) -> Dict[str, Any]: """ From 804be354af06b65db5b8a7ec46343c9740ecb87b Mon Sep 17 00:00:00 2001 From: devanshjain Date: Wed, 1 Oct 2025 23:43:37 +0000 Subject: [PATCH 4/8] Refactor HANA resource handling by renaming parameters and updating related logic across multiple files --- src/modules/get_cluster_status_db.py | 18 +++--- src/roles/ha_db_hana/tasks/block-network.yml | 17 ++++-- src/roles/ha_db_hana/tasks/fs-freeze.yml | 6 +- .../ha_db_hana/tasks/primary-crash-index.yml | 9 ++- src/roles/ha_db_hana/tasks/primary-echo-b.yml | 9 ++- .../ha_db_hana/tasks/primary-node-crash.yml | 6 +- .../ha_db_hana/tasks/primary-node-kill.yml | 9 ++- .../ha_db_hana/tasks/resource-migration.yml | 36 ++++++------ src/roles/ha_db_hana/tasks/sbd-fencing.yml | 6 +- .../tasks/secondary-crash-index.yml | 6 +- .../ha_db_hana/tasks/secondary-echo-b.yml | 6 +- .../ha_db_hana/tasks/secondary-node-kill.yml | 6 +- src/roles/misc/tasks/cluster-report.yml | 3 +- src/roles/misc/tasks/pre-validations-db.yml | 55 +++++++++++++------ src/vars/input-api.yaml | 6 +- tests/modules/get_cluster_status_db_test.py | 6 +- tests/roles/ha_db_hana/block_network_test.py | 6 +- .../roles/ha_db_hana/primary_node_ops_test.py | 6 +- .../ha_db_hana/resource_migration_test.py | 8 ++- .../ha_db_hana/secondary_node_ops_test.py | 6 +- .../roles/mock_data/get_cluster_status_db.txt | 12 ++-- .../secondary_get_cluster_status_db.txt | 12 ++-- 22 files changed, 169 insertions(+), 85 deletions(-) diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index c76f40d8..cffdcdcc 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -146,13 +146,15 @@ def __init__( db_instance_number: str, saphanasr_provider: HanaSRProvider, ansible_os_family: OperatingSystemFamily, - hana_resource_name: str = "", + hana_clone_resource_name: str = "", + hana_primitive_resource_name: str = "", ): super().__init__(ansible_os_family) self.database_sid = database_sid self.saphanasr_provider = saphanasr_provider self.db_instance_number = db_instance_number - self.hana_resource_name = hana_resource_name + self.hana_clone_resource_name = hana_clone_resource_name + self.hana_primitive_resource_name = hana_primitive_resource_name self.result.update( { "primary_node": "", @@ -170,7 +172,7 @@ def _get_cluster_pramaeters(self) -> None: Retrieves the value of the AUTOMATED_REGISTER attribute. """ param_commands = { - "AUTOMATED_REGISTER": AUTOMATED_REGISTER(self.hana_resource_name), + "AUTOMATED_REGISTER": AUTOMATED_REGISTER(self.hana_primitive_resource_name), "PRIORITY_FENCING_DELAY": PRIORITY_FENCING_DELAY, } @@ -216,8 +218,8 @@ def _process_node_attributes(self, cluster_status_xml: ET.Element) -> Dict[str, HanaSRProvider.ANGI: { "clone_attr": f"hana_{self.database_sid}_clone_state", "sync_attr": ( - f"master-{self.hana_resource_name}" - if self.hana_resource_name + f"master-{self.hana_clone_resource_name}" + if self.hana_clone_resource_name else f"master-rsc_SAPHanaCon_{self.database_sid.upper()}" + f"_HDB{self.db_instance_number}" ), @@ -301,7 +303,8 @@ def run_module() -> None: database_sid=dict(type="str", required=True), saphanasr_provider=dict(type="str", required=True), db_instance_number=dict(type="str", required=True), - hana_resource_name=dict(type="str", required=False), + hana_clone_resource_name=dict(type="str", required=False), + hana_primitive_resource_name=dict(type="str", required=False), filter=dict(type="str", required=False, default="os_family"), ) @@ -314,7 +317,8 @@ def run_module() -> None: str(ansible_facts(module).get("os_family", "UNKNOWN")).upper() ), db_instance_number=module.params["db_instance_number"], - hana_resource_name=module.params.get("hana_resource_name", ""), + hana_clone_resource_name=module.params.get("hana_clone_resource_name", ""), + hana_primitive_resource_name=module.params.get("hana_primitive_resource_name", ""), ) checker.run() diff --git a/src/roles/ha_db_hana/tasks/block-network.yml b/src/roles/ha_db_hana/tasks/block-network.yml index 9f02240f..6f8b88d3 100644 --- a/src/roles/ha_db_hana/tasks/block-network.yml +++ b/src/roles/ha_db_hana/tasks/block-network.yml @@ -23,8 +23,9 @@ - node_tier == "hana" - pre_validations_status == "PASSED" - cluster_status_pre.stonith_action == "reboot" - - cluster_status_pre.PRIORITY_FENCING_DELAY is not "" - - cluster_status_pre.PRIORITY_FENCING_DELAY is not "unknown" + - cluster_status_pre.PRIORITY_FENCING_DELAY is defined + - cluster_status_pre.PRIORITY_FENCING_DELAY != "" + - cluster_status_pre.PRIORITY_FENCING_DELAY != "unknown" block: - name: "Test Execution: Block Network Communication" when: ansible_hostname == cluster_status_pre.primary_node @@ -95,7 +96,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution_primary retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -122,7 +124,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post_primary retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -142,7 +145,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution_secondary retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -160,7 +164,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post_secondary retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/fs-freeze.yml b/src/roles/ha_db_hana/tasks/fs-freeze.yml index 80eae09e..5779675d 100644 --- a/src/roles/ha_db_hana/tasks/fs-freeze.yml +++ b/src/roles/ha_db_hana/tasks/fs-freeze.yml @@ -59,7 +59,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -76,7 +77,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/primary-crash-index.yml b/src/roles/ha_db_hana/tasks/primary-crash-index.yml index ac98e9d5..c9c3859f 100644 --- a/src/roles/ha_db_hana/tasks/primary-crash-index.yml +++ b/src/roles/ha_db_hana/tasks/primary-crash-index.yml @@ -57,7 +57,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -72,7 +73,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -122,7 +124,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/primary-echo-b.yml b/src/roles/ha_db_hana/tasks/primary-echo-b.yml index 3a0634b0..cf85474f 100644 --- a/src/roles/ha_db_hana/tasks/primary-echo-b.yml +++ b/src/roles/ha_db_hana/tasks/primary-echo-b.yml @@ -49,7 +49,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" retries: "{{ default_retries }}" delay: "{{ default_delay }}" register: cluster_status_test_execution @@ -64,7 +65,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" retries: "{{ default_retries }}" delay: "{{ default_delay }}" register: cluster_status_test_execution @@ -110,7 +112,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/primary-node-crash.yml b/src/roles/ha_db_hana/tasks/primary-node-crash.yml index 1a236183..3223369d 100644 --- a/src/roles/ha_db_hana/tasks/primary-node-crash.yml +++ b/src/roles/ha_db_hana/tasks/primary-node-crash.yml @@ -45,7 +45,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -89,7 +90,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/primary-node-kill.yml b/src/roles/ha_db_hana/tasks/primary-node-kill.yml index 368dc1d1..fb462754 100644 --- a/src/roles/ha_db_hana/tasks/primary-node-kill.yml +++ b/src/roles/ha_db_hana/tasks/primary-node-kill.yml @@ -46,7 +46,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -63,7 +64,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -108,7 +110,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/resource-migration.yml b/src/roles/ha_db_hana/tasks/resource-migration.yml index 0a1c380f..9f44334d 100644 --- a/src/roles/ha_db_hana/tasks/resource-migration.yml +++ b/src/roles/ha_db_hana/tasks/resource-migration.yml @@ -44,12 +44,12 @@ args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 - - name: "Test Execution: Set fact the hana_resource_name" + - name: "Test Execution: Set fact the hana_clone_resource_name" ansible.builtin.set_fact: - hana_resource_name: "{{ hana_resource_id.stdout }}" + hana_clone_resource_name: "{{ hana_clone_resource_id.stdout }}" - name: "Test Execution: Get HANA resource id" when: saphanasr_provider | default('SAPHanaSR') == "SAPHanaSR" @@ -57,38 +57,38 @@ - name: "Try master resource ID" ansible.builtin.shell: >- set -o pipefail && {{ commands - | selectattr('name','equalto','get_hana_resource_id') + | selectattr('name','equalto','get_hana_clone_resource_id') | map(attribute=(ansible_os_family|upper)) | first }} args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 rescue: - name: "Try clone resource ID" ansible.builtin.shell: >- set -o pipefail && {{ commands - | selectattr('name','equalto','get_hana_resource_id') + | selectattr('name','equalto','get_hana_clone_resource_id') | map(attribute='REDHAT') | first }} args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 ignore_errors: true always: - name: "Test Execution: Set the resource name" when: - - hana_resource_id.rc == 0 - - hana_resource_id.stdout is defined - - hana_resource_id.stdout | type_debug != 'NoneType' - - hana_resource_id.stdout | trim | length > 1 + - hana_clone_resource_id.rc == 0 + - hana_clone_resource_id.stdout is defined + - hana_clone_resource_id.stdout | type_debug != 'NoneType' + - hana_clone_resource_id.stdout | trim | length > 1 ansible.builtin.set_fact: - hana_resource_name: "{{ hana_resource_id.stdout }}" + hana_clone_resource_name: "{{ hana_clone_resource_id.stdout }}" - name: "Test Execution: Move the resource to the targeted node" ansible.builtin.command: "{{ commands | selectattr( @@ -104,7 +104,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -160,7 +161,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution_1 retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/sbd-fencing.yml b/src/roles/ha_db_hana/tasks/sbd-fencing.yml index a08e58c9..670def4d 100644 --- a/src/roles/ha_db_hana/tasks/sbd-fencing.yml +++ b/src/roles/ha_db_hana/tasks/sbd-fencing.yml @@ -60,7 +60,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" retries: "{{ default_retries }}" delay: "{{ default_delay }}" register: cluster_status_test_execution @@ -77,7 +78,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/secondary-crash-index.yml b/src/roles/ha_db_hana/tasks/secondary-crash-index.yml index 59515bea..bb97bfc4 100644 --- a/src/roles/ha_db_hana/tasks/secondary-crash-index.yml +++ b/src/roles/ha_db_hana/tasks/secondary-crash-index.yml @@ -57,7 +57,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -71,7 +72,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/secondary-echo-b.yml b/src/roles/ha_db_hana/tasks/secondary-echo-b.yml index c5ef6da1..cf731e52 100644 --- a/src/roles/ha_db_hana/tasks/secondary-echo-b.yml +++ b/src/roles/ha_db_hana/tasks/secondary-echo-b.yml @@ -53,7 +53,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" retries: "{{ default_retries }}" delay: "{{ default_delay }}" register: cluster_status_test_execution @@ -67,7 +68,8 @@ operation_step: "post_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/ha_db_hana/tasks/secondary-node-kill.yml b/src/roles/ha_db_hana/tasks/secondary-node-kill.yml index 3c3e510c..94ec9c68 100644 --- a/src/roles/ha_db_hana/tasks/secondary-node-kill.yml +++ b/src/roles/ha_db_hana/tasks/secondary-node-kill.yml @@ -51,7 +51,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_test_execution retries: "{{ default_retries }}" delay: "{{ default_delay }}" @@ -65,7 +66,8 @@ operation_step: "test_execution" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_post retries: "{{ default_retries }}" delay: "{{ default_delay }}" diff --git a/src/roles/misc/tasks/cluster-report.yml b/src/roles/misc/tasks/cluster-report.yml index 4467980c..ad9cd805 100644 --- a/src/roles/misc/tasks/cluster-report.yml +++ b/src/roles/misc/tasks/cluster-report.yml @@ -12,7 +12,8 @@ operation_step: "cluster_report_collection" database_sid: "{{ db_sid | lower | default('') }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status failed_when: cluster_status.primary_node == "" diff --git a/src/roles/misc/tasks/pre-validations-db.yml b/src/roles/misc/tasks/pre-validations-db.yml index da6f1435..45bfc615 100644 --- a/src/roles/misc/tasks/pre-validations-db.yml +++ b/src/roles/misc/tasks/pre-validations-db.yml @@ -32,54 +32,74 @@ args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 - - name: "Pre validation: Set fact the hana_resource_name" + - name: "Pre validation: Set fact the hana_clone_resource_name" ansible.builtin.set_fact: - hana_resource_name: "{{ hana_resource_id.stdout }}" + hana_clone_resource_name: "{{ hana_clone_resource_id.stdout }}" - - name: "Pre validation: Get HANA resource id" + - name: "Pre validation: Get HANA Clone resource id" when: saphanasr_provider | default('SAPHanaSR') == "SAPHanaSR" block: - name: "Try master resource ID" become: true ansible.builtin.shell: >- set -o pipefail && {{ commands - | selectattr('name','equalto','get_hana_resource_id') + | selectattr('name','equalto','get_hana_clone_resource_id') | map(attribute=(ansible_os_family|upper)) | first }} args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 rescue: - name: "Try clone resource ID" become: true ansible.builtin.shell: >- set -o pipefail && {{ commands - | selectattr('name','equalto','get_hana_resource_id') + | selectattr('name','equalto','get_hana_clone_resource_id') | map(attribute='REDHAT') | first }} args: executable: /bin/bash changed_when: false - register: hana_resource_id - failed_when: hana_resource_id.rc != 0 + register: hana_clone_resource_id + failed_when: hana_clone_resource_id.rc != 0 ignore_errors: true always: - name: "Test Execution: Set the resource name" when: - - hana_resource_id.rc == 0 - - hana_resource_id.stdout is defined - - hana_resource_id.stdout | type_debug != 'NoneType' - - hana_resource_id.stdout | trim | length > 1 + - hana_clone_resource_id.rc == 0 + - hana_clone_resource_id.stdout is defined + - hana_clone_resource_id.stdout | type_debug != 'NoneType' + - hana_clone_resource_id.stdout | trim | length > 1 ansible.builtin.set_fact: - hana_resource_name: "{{ hana_resource_id.stdout }}" + hana_clone_resource_name: "{{ hana_clone_resource_id.stdout }}" + - name: "Pre validation: Get HANA Primitive resource id" + when: saphanasr_provider | default('SAPHanaSR') == "SAPHanaSR" + block: + - name: "Pre validation: Get HANA Primitive resource id" + become: true + ansible.builtin.shell: >- + set -o pipefail && {{ commands + | selectattr('name','equalto','get_hana_primitive_resource_id') + | map(attribute=(ansible_os_family|upper)) + | first + }} + args: + executable: /bin/bash + changed_when: false + register: hana_primitive_resource_id + failed_when: hana_primitive_resource_id.rc != 0 + + - name: "Pre validation: Set fact the hana_clone_resource_name" + ansible.builtin.set_fact: + hana_primitive_resource_name: "{{ hana_primitive_resource_id.stdout }}" - name: "Pre Validation: Validate HANA DB cluster status on primary node" become: true @@ -88,7 +108,8 @@ operation_step: "pre_failover" database_sid: "{{ db_sid | lower }}" saphanasr_provider: "{{ saphanasr_provider | default('SAPHanaSR') }}" - hana_resource_name: "{{ hana_resource_name | default('') }}" + hana_clone_resource_name: "{{ hana_clone_resource_name | default('') }}" + hana_primitive_resource_name: "{{ hana_primitive_resource_name | default('') }}" register: cluster_status_pre until: cluster_status_pre.primary_node != "" or cluster_status_pre.secondary_node != "" diff --git a/src/vars/input-api.yaml b/src/vars/input-api.yaml index 58e7a73c..0b535dfb 100644 --- a/src/vars/input-api.yaml +++ b/src/vars/input-api.yaml @@ -267,7 +267,11 @@ ascs_stonith_timeout: 120 # Commands for HANA DB HA Test Cases based on OS family commands: - - name: get_hana_resource_id + - name: get_hana_primitive_resource_id + SUSE: "cibadmin --query --xpath \"//primitive[@type='SAPHana']\" --node-path | grep -oP \"master\\[@id='\\K[^']+\"" + REDHAT: "cibadmin --query --xpath \"//primitive[@type='SAPHana']\" --node-path | grep -oP \"primitive\\[@id='\\K[^']+\"" + + - name: get_hana_clone_resource_id SUSE: "cibadmin --query --xpath \"//primitive[@type='SAPHana']\" --node-path | grep -oP \"master\\[@id='\\K[^']+\"" REDHAT: "cibadmin --query --xpath \"//primitive[@type='SAPHana']\" --node-path | grep -oP \"clone\\[@id='\\K[^']+\"" diff --git a/tests/modules/get_cluster_status_db_test.py b/tests/modules/get_cluster_status_db_test.py index 0aec3db3..5831c91f 100644 --- a/tests/modules/get_cluster_status_db_test.py +++ b/tests/modules/get_cluster_status_db_test.py @@ -32,7 +32,8 @@ def hana_checker_classic(self): ansible_os_family=OperatingSystemFamily.REDHAT, saphanasr_provider=HanaSRProvider.SAPHANASR, db_instance_number="00", - hana_resource_name="rsc_SAPHanaCon_TEST_HDB00", + hana_clone_resource_name="rsc_SAPHanaCon_TEST_HDB00", + hana_primitive_resource_name="rsc_SAPHanaPrm_TEST_HDB00", ) @pytest.fixture @@ -48,7 +49,8 @@ def hana_checker_angi(self): ansible_os_family=OperatingSystemFamily.SUSE, saphanasr_provider=HanaSRProvider.ANGI, db_instance_number="00", - hana_resource_name="rsc_SAPHanaCon_TEST_HDB00", + hana_clone_resource_name="rsc_SAPHanaCon_TEST_HDB00", + hana_primitive_resource_name="rsc_SAPHanaCon_TEST_HDB00", ) def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): diff --git a/tests/roles/ha_db_hana/block_network_test.py b/tests/roles/ha_db_hana/block_network_test.py index 8de1d413..012b218b 100644 --- a/tests/roles/ha_db_hana/block_network_test.py +++ b/tests/roles/ha_db_hana/block_network_test.py @@ -34,7 +34,11 @@ def test_environment(self, ansible_inventory): commands = [ { - "name": "get_hana_resource_id", + "name": "get_hana_clone_resource_id", + "SUSE": "cibadmin --query --scope resources", + }, + { + "name": "get_hana_primitive_resource_id", "SUSE": "cibadmin --query --scope resources", }, { diff --git a/tests/roles/ha_db_hana/primary_node_ops_test.py b/tests/roles/ha_db_hana/primary_node_ops_test.py index a265c1d0..98ca64b6 100644 --- a/tests/roles/ha_db_hana/primary_node_ops_test.py +++ b/tests/roles/ha_db_hana/primary_node_ops_test.py @@ -100,7 +100,11 @@ def test_environment(self, ansible_inventory, task_type): commands = [ { - "name": "get_hana_resource_id", + "name": "get_hana_clone_resource_id", + "SUSE": "cibadmin --query --scope resources", + }, + { + "name": "get_hana_primitive_resource_id", "SUSE": "cibadmin --query --scope resources", }, { diff --git a/tests/roles/ha_db_hana/resource_migration_test.py b/tests/roles/ha_db_hana/resource_migration_test.py index a9a34493..4ee4fe6b 100644 --- a/tests/roles/ha_db_hana/resource_migration_test.py +++ b/tests/roles/ha_db_hana/resource_migration_test.py @@ -53,11 +53,15 @@ def test_environment(self, ansible_inventory): commands = [ { "name": "resource_migration_cmd", - "SUSE": "crm resource move {{ hana_resource_name | default('msl_SAPHana_' ~ " + "SUSE": "crm resource move {{ hana_clone_resource_name | default('msl_SAPHana_' ~ " "(db_sid | upper) ~ '_HDB' ~ db_instance_number) }} db02 force", }, { - "name": "get_hana_resource_id", + "name": "get_hana_clone_resource_id", + "SUSE": "cibadmin --query --scope resources", + }, + { + "name": "get_hana_primitive_resource_id", "SUSE": "cibadmin --query --scope resources", }, { diff --git a/tests/roles/ha_db_hana/secondary_node_ops_test.py b/tests/roles/ha_db_hana/secondary_node_ops_test.py index c24d1558..e0964dc2 100644 --- a/tests/roles/ha_db_hana/secondary_node_ops_test.py +++ b/tests/roles/ha_db_hana/secondary_node_ops_test.py @@ -71,7 +71,11 @@ def test_environment(self, ansible_inventory, task_type): commands = [ { - "name": "get_hana_resource_id", + "name": "get_hana_clone_resource_id", + "SUSE": "cibadmin --query --scope resources", + }, + { + "name": "get_hana_primitive_resource_id", "SUSE": "cibadmin --query --scope resources", }, { diff --git a/tests/roles/mock_data/get_cluster_status_db.txt b/tests/roles/mock_data/get_cluster_status_db.txt index 24179b7f..43497538 100644 --- a/tests/roles/mock_data/get_cluster_status_db.txt +++ b/tests/roles/mock_data/get_cluster_status_db.txt @@ -11,7 +11,8 @@ def main(): database_sid=dict(type="str", required=True), saphanasr_provider=dict(type="str", required=True), db_instance_number=dict(type="str", required=True), - hana_resource_name=dict(type="str", default="") + hana_clone_resource_name=dict(type="str", default=""), + hana_primitive_resource_name=dict(type="str", default="") ) ) @@ -40,7 +41,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } elif counter == 1 or counter == 2: result = { @@ -53,7 +55,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } else: result = { @@ -66,7 +69,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } module.exit_json(**result) diff --git a/tests/roles/mock_data/secondary_get_cluster_status_db.txt b/tests/roles/mock_data/secondary_get_cluster_status_db.txt index 131c717f..a64302cb 100644 --- a/tests/roles/mock_data/secondary_get_cluster_status_db.txt +++ b/tests/roles/mock_data/secondary_get_cluster_status_db.txt @@ -11,7 +11,8 @@ def main(): database_sid=dict(type="str", required=True), saphanasr_provider=dict(type="str", required=True), db_instance_number=dict(type="str", required=True), - hana_resource_name=dict(type="str", default="") + hana_clone_resource_name=dict(type="str", default=""), + hana_primitive_resource_name=dict(type="str", default="") ) ) @@ -40,7 +41,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } elif counter == 1 or counter == 2: result = { @@ -53,7 +55,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } else: result = { @@ -66,7 +69,8 @@ def main(): "replication_mode": "sync", "primary_site_name": "db01", "operation_mode": "active", - "stonith_action": "reboot" + "stonith_action": "reboot", + "PRIORITY_FENCING_DELAY": "15s" } module.exit_json(**result) From 5c5ee1f5f6b2939dd619bf5a08ea603629635feb Mon Sep 17 00:00:00 2001 From: devanshjain Date: Wed, 1 Oct 2025 23:53:49 +0000 Subject: [PATCH 5/8] Refactor command execution logic to simplify parameter value retrieval --- src/modules/get_cluster_status_db.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index cffdcdcc..38156677 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -178,8 +178,7 @@ def _get_cluster_pramaeters(self) -> None: for param_name, command in param_commands.items(): try: - cmd_output = self.execute_command_subprocess(command).strip() - self.result[param_name] = ET.fromstring(cmd_output).get("value") + self.result[param_name] = self.execute_command_subprocess(command).strip() except Exception: self.result[param_name] = "unknown" From 22959dc9b8c662fd79c576011c755c00260d3928 Mon Sep 17 00:00:00 2001 From: devanshjain Date: Thu, 2 Oct 2025 16:32:08 +0000 Subject: [PATCH 6/8] Fix typo in method name and update related test cases for cluster parameter retrieval --- src/modules/get_cluster_status_db.py | 10 +++++++--- tests/modules/get_cluster_status_db_test.py | 13 ++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index 38156677..fbe35678 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -167,12 +167,16 @@ def __init__( } ) - def _get_cluster_pramaeters(self) -> None: + def _get_cluster_parameters(self) -> None: """ Retrieves the value of the AUTOMATED_REGISTER attribute. """ param_commands = { - "AUTOMATED_REGISTER": AUTOMATED_REGISTER(self.hana_primitive_resource_name), + "AUTOMATED_REGISTER": ( + AUTOMATED_REGISTER(self.hana_primitive_resource_name) + if self.hana_primitive_resource_name + else AUTOMATED_REGISTER(self.hana_clone_resource_name) + ), "PRIORITY_FENCING_DELAY": PRIORITY_FENCING_DELAY, } @@ -289,7 +293,7 @@ def run(self) -> Dict[str, str]: :rtype: Dict[str, str] """ result = super().run() - self._get_cluster_pramaeters() + self._get_cluster_parameters() return result diff --git a/tests/modules/get_cluster_status_db_test.py b/tests/modules/get_cluster_status_db_test.py index 5831c91f..957f05c0 100644 --- a/tests/modules/get_cluster_status_db_test.py +++ b/tests/modules/get_cluster_status_db_test.py @@ -55,7 +55,7 @@ def hana_checker_angi(self): def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): """ - Test the _get_cluster_pramaeters method. + Test the _get_cluster_parameters method. :param mocker: Mocking library for Python. :type mocker: _mocker.MagicMock @@ -65,17 +65,16 @@ def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): mocker.patch.object( hana_checker_classic, "execute_command_subprocess", - return_value='', + return_value='true', ) - hana_checker_classic._get_cluster_pramaeters() + hana_checker_classic._get_cluster_parameters() assert hana_checker_classic.result["AUTOMATED_REGISTER"] == "true" def test_get_cluster_pramaeters_exception(self, mocker, hana_checker_classic): """ - Test the _get_cluster_pramaeters method when an exception occurs. + Test the _get_cluster_parameters method when an exception occurs. :param mocker: Mocking library for Python. :type mocker: _mocker.MagicMock @@ -86,7 +85,7 @@ def test_get_cluster_pramaeters_exception(self, mocker, hana_checker_classic): hana_checker_classic, "execute_command_subprocess", side_effect=Exception("Test error") ) - hana_checker_classic._get_cluster_pramaeters() + hana_checker_classic._get_cluster_parameters() assert hana_checker_classic.result["AUTOMATED_REGISTER"] == "unknown" @@ -259,7 +258,7 @@ def test_run(self, mocker, hana_checker_classic): return_value={"status": "PASSED"}, ) - mock_get_automation = mocker.patch.object(hana_checker_classic, "_get_cluster_pramaeters") + mock_get_automation = mocker.patch.object(hana_checker_classic, "_get_cluster_parameters") result = hana_checker_classic.run() From dcd9f13b82080cd83855fb6ab3f2f54d53e822c1 Mon Sep 17 00:00:00 2001 From: devanshjain Date: Thu, 2 Oct 2025 17:45:54 +0000 Subject: [PATCH 7/8] Fix inconsistent quote style in test case for cluster parameter retrieval --- tests/modules/get_cluster_status_db_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/modules/get_cluster_status_db_test.py b/tests/modules/get_cluster_status_db_test.py index 957f05c0..b5cab237 100644 --- a/tests/modules/get_cluster_status_db_test.py +++ b/tests/modules/get_cluster_status_db_test.py @@ -65,7 +65,7 @@ def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): mocker.patch.object( hana_checker_classic, "execute_command_subprocess", - return_value='true', + return_value="true", ) hana_checker_classic._get_cluster_parameters() From c6fa0ae8d436f1b9fd34ebf8e30926c44c5fdaab Mon Sep 17 00:00:00 2001 From: devanshjain Date: Thu, 2 Oct 2025 17:56:24 +0000 Subject: [PATCH 8/8] Update cluster parameter retrieval to include PRIORITY_FENCING_DELAY and fix typo in test case name --- src/modules/get_cluster_status_db.py | 2 +- src/roles/misc/tasks/pre-validations-db.yml | 2 +- tests/modules/get_cluster_status_db_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/get_cluster_status_db.py b/src/modules/get_cluster_status_db.py index fbe35678..f44adc40 100644 --- a/src/modules/get_cluster_status_db.py +++ b/src/modules/get_cluster_status_db.py @@ -169,7 +169,7 @@ def __init__( def _get_cluster_parameters(self) -> None: """ - Retrieves the value of the AUTOMATED_REGISTER attribute. + Retrieves the values of the AUTOMATED_REGISTER and PRIORITY_FENCING_DELAY attributes. """ param_commands = { "AUTOMATED_REGISTER": ( diff --git a/src/roles/misc/tasks/pre-validations-db.yml b/src/roles/misc/tasks/pre-validations-db.yml index 45bfc615..5c572943 100644 --- a/src/roles/misc/tasks/pre-validations-db.yml +++ b/src/roles/misc/tasks/pre-validations-db.yml @@ -97,7 +97,7 @@ register: hana_primitive_resource_id failed_when: hana_primitive_resource_id.rc != 0 - - name: "Pre validation: Set fact the hana_clone_resource_name" + - name: "Pre validation: Set fact the hana_primitive_resource_name" ansible.builtin.set_fact: hana_primitive_resource_name: "{{ hana_primitive_resource_id.stdout }}" diff --git a/tests/modules/get_cluster_status_db_test.py b/tests/modules/get_cluster_status_db_test.py index b5cab237..b5448506 100644 --- a/tests/modules/get_cluster_status_db_test.py +++ b/tests/modules/get_cluster_status_db_test.py @@ -72,7 +72,7 @@ def test_get_cluster_pramaeters(self, mocker, hana_checker_classic): assert hana_checker_classic.result["AUTOMATED_REGISTER"] == "true" - def test_get_cluster_pramaeters_exception(self, mocker, hana_checker_classic): + def test_get_cluster_parameters_exception(self, mocker, hana_checker_classic): """ Test the _get_cluster_parameters method when an exception occurs.