From 4454cd4b0ee4b4a6b03139562b304ae6ff5bb26b Mon Sep 17 00:00:00 2001 From: Alan Bounds Date: Tue, 20 Jan 2026 17:02:33 -0600 Subject: [PATCH 1/2] fix: bmc password validation fails incorrectly. --- .../understack_workflows/bmc_credentials.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/python/understack-workflows/understack_workflows/bmc_credentials.py b/python/understack-workflows/understack_workflows/bmc_credentials.py index 8a04f153d..7aad009c5 100644 --- a/python/understack-workflows/understack_workflows/bmc_credentials.py +++ b/python/understack-workflows/understack_workflows/bmc_credentials.py @@ -3,6 +3,7 @@ from understack_workflows.bmc import AuthException from understack_workflows.bmc import Bmc +from understack_workflows.bmc import RedfishRequestError from understack_workflows.helpers import setup_logger FACTORY_B64 = b"Y2FsdmluLGNhbHZpbmNhbHZpbixjYWx2aW4xLGNhbHZpbmNhbHZpbjE=" @@ -33,7 +34,11 @@ def set_bmc_password( """ bmc = Bmc(ip_address=ip_address, username=username, password=new_password) - token, session = bmc.get_session(new_password) + try: + token, session = bmc.get_session(new_password) + except RedfishRequestError as e: + logger.debug("Password test for %s failed. %s", ip_address, e) + token, session = None, None if token and session: logger.info("Production BMC credentials are working on this BMC.") bmc.close_session(session=session, token=token) @@ -45,7 +50,11 @@ def set_bmc_password( ) for test_password in filter(None, [old_password, *FACTORY_PASSWORDS]): - token, session = bmc.get_session(test_password) + try: + token, session = bmc.get_session(test_password) + except RedfishRequestError as e: + logger.debug("Password test for %s failed. %s", ip_address, e) + token, session = None, None if token and session: break # Go Slow, or else the BMC will lock us out for a From 1b2fbd3b4b2707047e206afc7a6065076fbd884b Mon Sep 17 00:00:00 2001 From: Alan Bounds Date: Wed, 21 Jan 2026 08:48:58 -0600 Subject: [PATCH 2/2] bmc_credentials test fix for failure functionality. --- .../tests/test_bmc_credentials.py | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/python/understack-workflows/tests/test_bmc_credentials.py b/python/understack-workflows/tests/test_bmc_credentials.py index 70517c649..18918f5bb 100644 --- a/python/understack-workflows/tests/test_bmc_credentials.py +++ b/python/understack-workflows/tests/test_bmc_credentials.py @@ -1,8 +1,6 @@ -from unittest.mock import MagicMock - import pytest -from understack_workflows.bmc import RedfishRequestError +from understack_workflows.bmc import AuthException from understack_workflows.bmc_credentials import set_bmc_password @@ -14,17 +12,28 @@ def mock_getsession(mocker): @pytest.fixture -def mock_close(mocker): - mock = mocker.patch("understack_workflows.bmc_credentials.Bmc.close_session") +def mock_sleep(mocker): + mock = mocker.patch("understack_workflows.bmc_credentials.sleep", return_value=None) + return mock + + +@pytest.fixture +def mock_getsession_failed(mocker): + mock = mocker.patch("understack_workflows.bmc_credentials.Bmc.get_session") + mock.side_effect = [ + (None, None), + (None, None), + (None, None), + (None, None), + (None, None), + ] # patching 5 requests for session attempts. return mock @pytest.fixture -def mock_fail_auth(mocker): - mock_response = MagicMock() - mock_response.status_code = 402 - mock_response.json.return_value = {"message": "Failure"} - mock = mocker.patch("requests.request", return_value=mock_response) +def mock_close(mocker): + mock = mocker.patch("understack_workflows.bmc_credentials.Bmc.close_session") + mock.return_value = None return mock @@ -34,6 +43,6 @@ def test_set_bmc_password_noop(mock_getsession, mock_close): mock_close.assert_called_with(session="/path/to/session/1234", token="tOkEn") -def test_set_bmc_password_failed(mock_fail_auth): - with pytest.raises(RedfishRequestError): +def test_set_bmc_password_failed(mock_getsession_failed, mock_sleep): + with pytest.raises(AuthException): set_bmc_password("1.2.3.4", "qwertyuiop")