diff --git a/keywords/cloud_platform/system/host/system_host_lock_keywords.py b/keywords/cloud_platform/system/host/system_host_lock_keywords.py index d68aa451..2fd1bdb5 100644 --- a/keywords/cloud_platform/system/host/system_host_lock_keywords.py +++ b/keywords/cloud_platform/system/host/system_host_lock_keywords.py @@ -46,19 +46,29 @@ class SystemHostLockKeywords(BaseKeyword): raise KeywordException("Lock host did not lock in the required time. Host values were: " f"Operational: {host_value.get_operational()} " f"Administrative: {host_value.get_administrative()} " f"Availability: {host_value.get_availability()}") return True - def lock_host_with_error(self, host_name: str) -> str: + def lock_host_with_error(self, host_name: str, confirm_flag: bool = False) -> str: """ Locks the given host name. It's expected that the cmd returns error Args: host_name (str): the name of the host + confirm_flag (bool): whether to add --yes flag to bypass confirmation prompts Returns: str: a str of error message """ - msg = self.ssh_connection.send(source_openrc(f"system host-lock {host_name}")) - return msg[0] + cmd = f"system host-lock {host_name}" + if confirm_flag: + cmd += " --yes" + + output = self.ssh_connection.send(source_openrc(cmd)) + # Handle empty output or return complete output + if not output: + return "No output received from lock command" + + # Join all output lines to capture complete error message + return "\n".join(output) if isinstance(output, list) else str(output) def wait_for_host_locked(self, host_name: str) -> bool: """ diff --git a/testcases/cloud_platform/regression/security/test_cli_confirmation.py b/testcases/cloud_platform/regression/security/test_cli_confirmation.py index 586f2d69..f8292541 100755 --- a/testcases/cloud_platform/regression/security/test_cli_confirmation.py +++ b/testcases/cloud_platform/regression/security/test_cli_confirmation.py @@ -5,6 +5,7 @@ from framework.ssh.prompt_response import PromptResponse from framework.validation.validation import validate_str_contains from keywords.cloud_platform.command_wrappers import source_openrc from keywords.cloud_platform.ssh.lab_connection_keywords import LabConnectionKeywords +from keywords.cloud_platform.system.host.system_host_lock_keywords import SystemHostLockKeywords from keywords.cloud_platform.system.service.system_service_keywords import SystemServiceKeywords @@ -71,3 +72,64 @@ def test_cli_with_confirmations_enabled(request: FixtureRequest): get_logger().log_info("CLI confirmation prompt appeared and was handled correctly - operation cancelled") get_logger().log_info("system host-lock confirmation test completed") + + +@mark.p1 +def test_yes_flag_with_cli_disabled(): + """ + Test system host-lock controller-5 --yes command with CLI confirmations disabled. + Verifies that --yes flag works properly when CLI confirmations are disabled. + """ + ssh_connection = LabConnectionKeywords().get_active_controller_ssh() + service_keywords = SystemServiceKeywords(ssh_connection) + + get_logger().log_info("Ensuring CLI confirmations are disabled") + service_keywords.modify_service_parameter("platform", "client", "cli_confirmations", "disabled") + service_keywords.apply_service_parameters("platform") + + # Exit from lab session to force fresh login for settings to take effect + get_logger().log_info("Exiting from lab session to force fresh login") + ssh_connection.send("exit") + ssh_connection.close() + + # Create fresh SSH connection to test disabled confirmations + get_logger().log_info("Creating fresh SSH connection to test disabled confirmations") + ssh_connection = LabConnectionKeywords().get_active_controller_ssh() + + get_logger().log_info("Testing system host-lock controller-5 command without confirmations") + + # Use the keyword to lock host with --yes flag + host_lock_keywords = SystemHostLockKeywords(ssh_connection) + output_str = host_lock_keywords.lock_host_with_error("controller-5", confirm_flag=True) + + get_logger().log_info(f"Command output: {output_str}") + + # Validate that command executed (should get "host not found" message since controller-5 doesn't exist) + validate_str_contains(output_str, "host not found", "Verify command executed and returned expected error message") + + get_logger().log_info("system host-lock test without confirmation completed") + + +@mark.p2 +def test_yes_flag_with_cli_enabled(request: FixtureRequest): + """ + Test --yes flag with CLI confirmations enabled using fixture. + Verifies that --yes flag bypasses confirmation prompts when CLI confirmations are enabled. + """ + # Call the enabled setup function directly + cli_confirmations_enabled(request) + + ssh_connection = LabConnectionKeywords().get_active_controller_ssh() + + get_logger().log_info("Testing --yes flag with confirmations enabled") + + # Use the keyword to lock host with --yes flag + host_lock_keywords = SystemHostLockKeywords(ssh_connection) + output_str = host_lock_keywords.lock_host_with_error("controller-5", confirm_flag=True) + + get_logger().log_info(f"Command output: {output_str}") + + # Validate that command executed (should get "host not found" message since controller-5 doesn't exist) + validate_str_contains(output_str, "host not found", "Verify command executed and returned expected error message") + + get_logger().log_info("--yes flag test with CLI enabled completed")