Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions redfish_ctl/raid/cmd_dell_raid_check_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand Down
32 changes: 30 additions & 2 deletions tests/raid/test_dell_raid_check_values_dualmode.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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()
Expand Down Expand Up @@ -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,
):
Expand Down