Retry Virtual Media eject action on HTTP 400 response

When attempting to eject virtual media and HTTP server responds
with HTTP error 400, retry the same HTTP query with empty
JSON document.

This change simply extends HTTP error code list when this
retry should happen to account for Dell server(s) - unlike
HPE ones (which return error 415), Dell returns 400.

See also: https://review.opendev.org/#/c/636845/

Change-Id: Ie9c2f37062b8a8c9a1a082217dc22c79c5327fba
Story: 2004995
Task: 35845
This commit is contained in:
Ilya Etingof 2019-07-17 16:17:07 +02:00
parent ba1b8220e7
commit 219d93aecd
2 changed files with 17 additions and 2 deletions

View File

@ -106,7 +106,9 @@ class VirtualMedia(base.ResourceBase):
except exceptions.HTTPError as response:
# Some vendors like HPE iLO has this kind of implementation.
# It needs to pass an empty dict.
if response.status_code == http_client.UNSUPPORTED_MEDIA_TYPE:
if response.status_code in (
http_client.UNSUPPORTED_MEDIA_TYPE,
http_client.BAD_REQUEST):
self._conn.post(target_uri, data={})
self.invalidate()

View File

@ -85,7 +85,7 @@ class VirtualMediaTestCase(base.TestCase):
"/VirtualMedia.EjectMedia"))
self.assertTrue(self.sys_virtual_media._is_stale)
def test_eject_media_pass_empty_dict(self):
def test_eject_media_pass_empty_dict_415(self):
target_uri = ("/redfish/v1/Managers/BMC/VirtualMedia/Floppy1/Actions"
"/VirtualMedia.EjectMedia")
self.conn.post.side_effect = [exceptions.HTTPError(
@ -97,3 +97,16 @@ class VirtualMediaTestCase(base.TestCase):
mock.call(target_uri, data={})]
self.sys_virtual_media._conn.post.assert_has_calls(post_calls)
self.assertTrue(self.sys_virtual_media._is_stale)
def test_eject_media_pass_empty_dict_400(self):
target_uri = ("/redfish/v1/Managers/BMC/VirtualMedia/Floppy1/Actions"
"/VirtualMedia.EjectMedia")
self.conn.post.side_effect = [exceptions.HTTPError(
method='POST', url=target_uri, response=mock.MagicMock(
status_code=http_client.BAD_REQUEST)), '200']
self.sys_virtual_media.eject_media()
post_calls = [
mock.call(target_uri),
mock.call(target_uri, data={})]
self.sys_virtual_media._conn.post.assert_has_calls(post_calls)
self.assertTrue(self.sys_virtual_media._is_stale)