Add support for ilo Virtual Media

This commit adds support for eject virtual media
for HPE Proliant Servers.

Story: #2004995
Task: #29467

Change-Id: I1706206ac74211c6abb71712ceb55b29b4824f16
This commit is contained in:
ankit 2019-02-14 07:27:27 +00:00
parent 185b2503cb
commit 9bd1d6b0dd
3 changed files with 30 additions and 3 deletions

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Some vendors like HPE iLO has this kind of implementation that for eject
virtual media need to pass empty dictionary otherwise throws Unsupported
media type error.

View File

@ -13,6 +13,8 @@
# This is referred from Redfish standard schema.
# https://redfish.dmtf.org/schemas/VirtualMedia.v1_2_0.json
from six.moves import http_client
from sushy import exceptions
from sushy.resources import base
from sushy.resources import common
@ -98,9 +100,14 @@ class VirtualMedia(base.ResourceBase):
After ejecting media inserted will be False and image_name will be
empty.
"""
target_uri = self._get_eject_media_element().target_uri
self._conn.post(target_uri)
try:
target_uri = self._get_eject_media_element().target_uri
self._conn.post(target_uri)
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:
self._conn.post(target_uri, data={})
self.invalidate()

View File

@ -15,6 +15,7 @@
import json
import mock
from six.moves import http_client
import sushy
from sushy import exceptions
@ -83,3 +84,16 @@ class VirtualMediaTestCase(base.TestCase):
("/redfish/v1/Managers/BMC/VirtualMedia/Floppy1/Actions"
"/VirtualMedia.EjectMedia"))
self.assertTrue(self.sys_virtual_media._is_stale)
def test_eject_media_pass_empty_dict(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.Mock(
status_code=http_client.UNSUPPORTED_MEDIA_TYPE)), '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)