From 171fe547d2ee595e1eaf7838ed915cc9e579a664 Mon Sep 17 00:00:00 2001 From: "spyroot@gmail.com" Date: Sat, 25 Jul 2026 07:08:04 +0400 Subject: [PATCH 1/2] Test rejected RAID validation posts --- .../test_dell_raid_check_values_dualmode.py | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/raid/test_dell_raid_check_values_dualmode.py b/tests/raid/test_dell_raid_check_values_dualmode.py index 4271a030..5b21c020 100644 --- a/tests/raid/test_dell_raid_check_values_dualmode.py +++ b/tests/raid/test_dell_raid_check_values_dualmode.py @@ -41,7 +41,7 @@ def dell_raid_manager_factory(): requests_mock = pytest.importorskip("requests_mock") started = [] - def factory(service_body=None, post_body=None): + def factory(service_body=None, post_body=None, post_status=200): requests = [] def get_cb(request, context): @@ -58,7 +58,7 @@ def get_cb(request, context): def post_cb(request, context): requests.append(request) - context.status_code = 200 + context.status_code = post_status return json.dumps(post_body or {"Status": "Valid"}) mocker = requests_mock.Mocker() @@ -181,6 +181,34 @@ def test_dell_raid_check_values_posts_read_only_action_by_default( } +def test_dell_raid_check_values_non_2xx_is_not_reported_as_executed( + dell_raid_manager_factory, +): + """A rejected validation POST fails closed instead of reporting execution.""" + manager, requests = dell_raid_manager_factory( + post_status=405, + post_body={ + "error": { + "code": "Base.1.12.ActionNotSupported", + "message": "The action is not supported.", + } + }, + ) + + result = manager.sync_invoke( + ApiRequestType.DellRaidCheckValues, + "dell-raid-check-values", + property_names=["RAIDLevel"], + property_values=["RAID1"], + ) + + posts = _post_requests(requests) + assert result.error is not None + assert result.data["executed"] is False + assert result.data["action"] == "#DellRaidService.CheckVDValues" + assert len(posts) == 1 + + def test_dell_raid_check_values_rejects_invalid_property_without_posting( dell_raid_manager_factory, ): From c0cf459d7cd30d2ab8977eef34d9762a181ccc7f Mon Sep 17 00:00:00 2001 From: "spyroot@gmail.com" Date: Sat, 25 Jul 2026 07:12:53 +0400 Subject: [PATCH 2/2] Fail closed on rejected RAID validation --- .../raid/cmd_dell_raid_check_values.py | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/redfish_ctl/raid/cmd_dell_raid_check_values.py b/redfish_ctl/raid/cmd_dell_raid_check_values.py index 7cb2ad7c..e4df1f2e 100644 --- a/redfish_ctl/raid/cmd_dell_raid_check_values.py +++ b/redfish_ctl/raid/cmd_dell_raid_check_values.py @@ -15,6 +15,7 @@ from ..cmd_exceptions import InvalidArgument from ..idrac_manager import IDracManager from ..idrac_shared import ApiRequestType, RedfishApiRespond, Singleton +from ..redfish_exceptions import RedfishException from ..redfish_manager import CommandResult from ..redfish_shared import RedfishApi @@ -208,15 +209,42 @@ def _invoke_sync(self, preview, payload): json.dumps(payload), self.json_content_type, ) - api_resp = self.default_post_success(response, expected=200) data = { - "executed": True, + "executed": False, "action": _CHECK_ACTION, "target": target, "payload": payload, "level": "read_only", } + try: + api_resp = self.default_post_success(response, expected=200) + except RedfishException as exc: + try: + data["response"] = response.json() + except ValueError: + pass + return CommandResult( + data, + preview.discovered, + None, + str(exc), + ) + data.update(self.api_success_msg(api_resp)) + if api_resp == RedfishApiRespond.Error: + try: + data["response"] = response.json() + except ValueError: + pass + error = self._redfish_error or self.parse_error(response) + return CommandResult( + data, + preview.discovered, + None, + str(error or f"{_CHECK_ACTION} failed"), + ) + + data["executed"] = True if api_resp == RedfishApiRespond.AcceptedTaskGenerated: data["task_id"] = self.job_id_from_header(response) else: