Add the ability to manage RAID settings

This patch adds the ability to get and set the settings for RAID
settings.

Change-Id: Ifc63ca7d9a30378e75b160739b709a1264ffe550
(cherry picked from commit c3bb9606aa)
This commit is contained in:
mpardhi23 2020-03-26 07:25:30 -04:00 committed by Christopher Dearborn
parent af01b6f04e
commit b5db9d84d3
11 changed files with 3394 additions and 19 deletions

View File

@ -753,6 +753,43 @@ class DRACClient(object):
""" """
return self._raid_mgmt.list_raid_controllers() return self._raid_mgmt.list_raid_controllers()
def list_raid_settings(self):
"""List the RAID configuration settings
:returns: a dictionary with the RAID settings using InstanceID as the
key. The attributes are either RAIDEnumerableAttribute,
RAIDStringAttribute objects.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
return self._raid_mgmt.list_raid_settings()
def set_raid_settings(self, raid_fqdd, settings):
"""Sets the RAID configuration
It sets the pending_value parameter for each of the attributes
passed in. For the values to be applied, a config job must
be created.
:param raid_fqdd: the FQDD of the RAID setting.
:param settings: a dictionary containing the proposed values, with
each key being the name of attribute and the value
being the proposed value.
:returns: a dictionary containing:
- The is_commit_required key with a boolean value indicating
whether a config job must be created for the values to be
applied.
- The is_reboot_required key with a RebootRequired enumerated
value indicating whether the server must be rebooted for the
values to be applied. Possible values are true and false.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
return self._raid_mgmt.set_raid_settings(raid_fqdd, settings)
def list_virtual_disks(self): def list_virtual_disks(self):
"""Returns the list of RAID arrays """Returns the list of RAID arrays

View File

@ -95,12 +95,225 @@ VirtualDisk = collections.namedtuple(
'status', 'raid_status', 'span_depth', 'span_length', 'status', 'raid_status', 'span_depth', 'span_length',
'pending_operations', 'physical_disks']) 'pending_operations', 'physical_disks'])
NO_FOREIGN_DRIVES = ["STOR058", "STOR018"] NO_FOREIGN_DRIVES = ["STOR058", "STOR018"]
class RAIDAttribute(object):
"""Generic RAID attribute class"""
def __init__(self, name, instance_id, current_value, pending_value,
read_only, fqdd):
"""Creates RAIDAttribute object
:param name: name of the RAID attribute
:param instance_id: InstanceID of the RAID attribute
:param current_value: list containing the current values of the
RAID attribute
:param pending_value: pending value of the RAID attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this RAID attribute can be changed
:param fqdd: Fully Qualified Device Description of the RAID Attribute
"""
self.name = name
self.instance_id = instance_id
self.current_value = current_value
self.pending_value = pending_value
self.read_only = read_only
self.fqdd = fqdd
def __eq__(self, other):
return self.__dict__ == other.__dict__
@classmethod
def parse(cls, namespace, raid_attr_xml):
"""Parses XML and creates RAIDAttribute object"""
name = utils.get_wsman_resource_attr(
raid_attr_xml, namespace, 'AttributeName')
instance_id = utils.get_wsman_resource_attr(
raid_attr_xml, namespace, 'InstanceID')
current_value = [attr.text for attr in
utils.find_xml(raid_attr_xml, 'CurrentValue',
namespace, find_all=True)]
pending_value = utils.get_wsman_resource_attr(
raid_attr_xml, namespace, 'PendingValue', nullable=True)
read_only = utils.get_wsman_resource_attr(
raid_attr_xml, namespace, 'IsReadOnly')
fqdd = utils.get_wsman_resource_attr(
raid_attr_xml, namespace, 'FQDD')
return cls(name, instance_id, current_value, pending_value,
(read_only == 'true'), fqdd)
class RAIDEnumerableAttribute(RAIDAttribute):
"""Enumerable RAID attribute class"""
namespace = uris.DCIM_RAIDEnumeration
def __init__(self, name, instance_id, current_value, pending_value,
read_only, fqdd, possible_values):
"""Creates RAIDEnumerableAttribute object
:param name: name of the RAID attribute
:param instance_id: InstanceID of the RAID attribute
:param current_value: list containing the current values of the
RAID attribute
:param pending_value: pending value of the RAID attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this RAID attribute can be changed
:param fqdd: Fully Qualified Device Description of the RAID
Attribute
:param possible_values: list containing the allowed values for the RAID
attribute
"""
super(RAIDEnumerableAttribute, self).__init__(name, instance_id,
current_value,
pending_value,
read_only, fqdd)
self.possible_values = possible_values
@classmethod
def parse(cls, raid_attr_xml):
"""Parses XML and creates RAIDEnumerableAttribute object"""
raid_attr = RAIDAttribute.parse(cls.namespace, raid_attr_xml)
possible_values = [attr.text for attr
in utils.find_xml(raid_attr_xml,
'PossibleValues',
cls.namespace, find_all=True)]
return cls(raid_attr.name, raid_attr.instance_id,
raid_attr.current_value, raid_attr.pending_value,
raid_attr.read_only, raid_attr.fqdd, possible_values)
def validate(self, new_value):
"""Validates new value"""
if str(new_value) not in self.possible_values:
msg = ("Attribute '%(attr)s' cannot be set to value '%(val)s'."
" It must be in %(possible_values)r.") % {
'attr': self.name,
'val': new_value,
'possible_values': self.possible_values}
return msg
class RAIDStringAttribute(RAIDAttribute):
"""String RAID attribute class"""
namespace = uris.DCIM_RAIDString
def __init__(self, name, instance_id, current_value, pending_value,
read_only, fqdd, min_length, max_length):
"""Creates RAIDStringAttribute object
:param name: name of the RAID attribute
:param instance_id: InstanceID of the RAID attribute
:param current_value: list containing the current values of the
RAID attribute
:param pending_value: pending value of the RAID attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this RAID attribute can be changed
:param fqdd: Fully Qualified Device Description of the RAID
Attribute
:param min_length: minimum length of the string
:param max_length: maximum length of the string
"""
super(RAIDStringAttribute, self).__init__(name, instance_id,
current_value, pending_value,
read_only, fqdd)
self.min_length = min_length
self.max_length = max_length
@classmethod
def parse(cls, raid_attr_xml):
"""Parses XML and creates RAIDStringAttribute object"""
raid_attr = RAIDAttribute.parse(cls.namespace, raid_attr_xml)
min_length = int(utils.get_wsman_resource_attr(
raid_attr_xml, cls.namespace, 'MinLength'))
max_length = int(utils.get_wsman_resource_attr(
raid_attr_xml, cls.namespace, 'MaxLength'))
return cls(raid_attr.name, raid_attr.instance_id,
raid_attr.current_value, raid_attr.pending_value,
raid_attr.read_only, raid_attr.fqdd,
min_length, max_length)
class RAIDIntegerAttribute(RAIDAttribute):
"""Integer RAID attribute class"""
namespace = uris.DCIM_RAIDInteger
def __init__(self, name, instance_id, current_value, pending_value,
read_only, fqdd, lower_bound, upper_bound):
"""Creates RAIDIntegerAttribute object
:param name: name of the RAID attribute
:param instance_id: InstanceID of the RAID attribute
:param current_value: list containing the current value of the
RAID attribute
:param pending_value: pending value of the RAID attribute,
reflecting an unprocessed change
(eg. config job not completed)
:param read_only: indicates whether this RAID attribute can be
changed
:param fqdd: Fully Qualified Device Description of the RAID
Attribute
:param lower_bound: minimum value for the RAID attribute
:param upper_bound: maximum value for the RAID attribute
"""
super(RAIDIntegerAttribute, self).__init__(name, instance_id,
current_value,
pending_value,
read_only, fqdd)
self.lower_bound = lower_bound
self.upper_bound = upper_bound
@classmethod
def parse(cls, raid_attr_xml):
"""Parses XML and creates RAIDIntegerAttribute object"""
raid_attr = RAIDAttribute.parse(cls.namespace, raid_attr_xml)
lower_bound = utils.get_wsman_resource_attr(
raid_attr_xml, cls.namespace, 'LowerBound')
upper_bound = utils.get_wsman_resource_attr(
raid_attr_xml, cls.namespace, 'UpperBound')
if raid_attr.current_value:
raid_attr.current_value = int(raid_attr.current_value[0])
if raid_attr.pending_value:
raid_attr.pending_value = int(raid_attr.pending_value)
return cls(raid_attr.name, raid_attr.instance_id,
raid_attr.current_value, raid_attr.pending_value,
raid_attr.read_only, raid_attr.fqdd,
int(lower_bound), int(upper_bound))
def validate(self, new_value):
"""Validates new value"""
val = int(new_value)
if val < self.lower_bound or val > self.upper_bound:
msg = ('Attribute %(attr)s cannot be set to value %(val)d.'
' It must be between %(lower)d and %(upper)d.') % {
'attr': self.name,
'val': new_value,
'lower': self.lower_bound,
'upper': self.upper_bound}
return msg
class RAIDManagement(object): class RAIDManagement(object):
NAMESPACES = [(uris.DCIM_RAIDEnumeration, RAIDEnumerableAttribute),
(uris.DCIM_RAIDString, RAIDStringAttribute),
(uris.DCIM_RAIDInteger, RAIDIntegerAttribute)]
def __init__(self, client): def __init__(self, client):
"""Creates RAIDManagement object """Creates RAIDManagement object
@ -108,6 +321,54 @@ class RAIDManagement(object):
""" """
self.client = client self.client = client
def list_raid_settings(self):
"""List the RAID configuration settings
:returns: a dictionary with the RAID settings using InstanceID as the
key. The attributes are either RAIDEnumerableAttribute,
RAIDStringAttribute objects.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
return utils.list_settings(self.client, self.NAMESPACES,
by_name=False)
def set_raid_settings(self, raid_fqdd, new_settings):
"""Sets the RAID configuration
It sets the pending_value parameter for each of the attributes
passed in. For the values to be applied, a config job must
be created.
:param raid_fqdd: the FQDD of the RAID setting.
:param new_settings: a dictionary containing the proposed values, with
each key being the name of attribute and the value
being the proposed value.
:returns: a dictionary containing:
- The is_commit_required key with a boolean value indicating
whether a config job must be created for the values to be
applied.
- The is_reboot_required key with a RebootRequired enumerated
value indicating whether the server must be rebooted for the
values to be applied. Possible values are true and false.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
return utils.set_settings('RAID',
self.client,
self.NAMESPACES,
new_settings,
uris.DCIM_RAIDService,
"DCIM_RAIDService",
"DCIM:RAIDService",
raid_fqdd,
by_name=False)
def list_raid_controllers(self): def list_raid_controllers(self):
"""Returns the list of RAID controllers """Returns the list of RAID controllers

View File

@ -94,20 +94,30 @@ DCIM_PCIeSSDView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
DCIM_PhysicalDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_PhysicalDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_PhysicalDiskView') 'DCIM_PhysicalDiskView')
DCIM_RAIDEnumeration = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_RAIDEnumeration')
DCIM_RAIDInteger = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_RAIDInteger')
DCIM_RAIDService = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_RAIDService = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_RAIDService') 'DCIM_RAIDService')
DCIM_SystemView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemView') DCIM_RAIDString = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_RAIDString')
DCIM_SystemEnumeration = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_SystemEnumeration = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemEnumeration') 'DCIM_SystemEnumeration')
DCIM_SystemString = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemString')
DCIM_SystemInteger = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_SystemInteger = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemInteger') 'DCIM_SystemInteger')
DCIM_SystemString = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemString')
DCIM_SystemView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_SystemView')
DCIM_VirtualDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_VirtualDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
'DCIM_VirtualDiskView') 'DCIM_VirtualDiskView')

View File

@ -16,6 +16,7 @@ import collections
import lxml.etree import lxml.etree
import mock import mock
import random import random
import re
import requests_mock import requests_mock
import dracclient.client import dracclient.client
@ -117,6 +118,183 @@ class ClientRAIDManagementTestCase(base.BaseTest):
device_protocol=None, device_protocol=None,
bus=None) bus=None)
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
def test_list_raid_settings(self, mock_requests,
mock_wait_until_idrac_is_ready):
expected_enum_attr = raid.RAIDEnumerableAttribute(
name='RAIDCurrentControllerMode',
instance_id='RAID.Integrated.1-1:RAIDCurrentControllerMode', # noqa
current_value=['RAID'],
pending_value=None,
read_only=True,
fqdd='RAID.Integrated.1-1',
possible_values=['RAID', 'Enhanced HBA'])
expected_string_attr = raid.RAIDStringAttribute(
name='Name',
instance_id='Disk.Virtual.1:RAID.Integrated.1-1:Name', # noqa
current_value='Virtual Disk 1',
pending_value=None,
read_only=True,
fqdd='Disk.Virtual.1:RAID.Integrated.1-1',
min_length=0,
max_length=129)
expected_integer_attr = raid.RAIDIntegerAttribute(
name='RAIDmaxSupportedVD',
instance_id='RAID.Integrated.1-1:RAIDmaxSupportedVD', # noqa
current_value=240,
pending_value=None,
read_only=True,
fqdd='RAID.Integrated.1-1',
lower_bound=0,
upper_bound=0)
# expected_string_attr
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']}
])
raid_settings = self.drac_client.list_raid_settings()
self.assertEqual(219, len(raid_settings))
# enumerable attribute
self.assertIn(
'RAID.Integrated.1-1:RAIDCurrentControllerMode', # noqa
raid_settings)
self.assertEqual(expected_enum_attr.fqdd, raid_settings[
'RAID.Integrated.1-1:RAIDCurrentControllerMode'].fqdd) # noqa
# string attribute
self.assertIn(
'Disk.Virtual.1:RAID.Integrated.1-1:Name', # noqa
raid_settings)
self.assertEqual(expected_string_attr.fqdd,
raid_settings['Disk.Virtual.1:RAID.Integrated.1-1:Name'].fqdd) # noqa
# integer attribute
self.assertIn(
'RAID.Integrated.1-1:RAIDmaxSupportedVD', # noqa
raid_settings)
self.assertEqual(expected_integer_attr.fqdd, raid_settings[
'RAID.Integrated.1-1:RAIDmaxSupportedVD'].fqdd) # noqa
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
@mock.patch.object(dracclient.client.WSManClient,
'invoke', spec_set=True,
autospec=True)
def test_set_raid_settings(self, mock_requests,
mock_invoke,
mock_wait_until_idrac_is_ready):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']}])
mock_invoke.return_value = lxml.etree.fromstring(
test_utils.RAIDInvocations[uris.DCIM_RAIDService][
'SetAttributes']['ok'])
result = self.drac_client.set_raid_settings(
self.raid_controller_fqdd,
{'RAID.Integrated.1-1:RAIDRequestedControllerMode': 'RAID'})
self.assertEqual({'is_commit_required': True,
'is_reboot_required': constants.RebootRequired.true
},
result)
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
def test_set_raid_settings_with_unknown_attr(
self, mock_requests, mock_wait_until_idrac_is_ready):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']},
{'text': test_utils.RAIDInvocations[
uris.DCIM_RAIDService]['SetAttributes']['error']}])
self.assertRaises(exceptions.InvalidParameterValue,
self.drac_client.set_raid_settings,
self.raid_controller_fqdd, {'foo': 'bar'})
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
def test_set_raid_settings_with_unchanged_attr(
self, mock_requests, mock_wait_until_idrac_is_ready):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']}])
attrKey = 'Disk.Virtual.1:RAID.Integrated.1-1:RAIDdefaultWritePolicy'
result = self.drac_client.set_raid_settings(
self.raid_controller_fqdd,
{attrKey: 'WriteBack'})
self.assertEqual({'is_commit_required': False,
'is_reboot_required':
constants.RebootRequired.false},
result)
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
def test_set_raid_settings_with_readonly_attr(
self, mock_requests, mock_wait_until_idrac_is_ready):
expected_message = (
"Cannot set read-only RAID attributes: "
"['RAID.Integrated.1-1:RAIDCurrentControllerMode']."
)
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_raid_settings,
self.raid_controller_fqdd,
{'RAID.Integrated.1-1:RAIDCurrentControllerMode': 'Enhanced HBA'})
@mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True,
autospec=True)
def test_set_raid_settings_with_incorrect_enum_value(
self, mock_requests, mock_wait_until_idrac_is_ready):
expected_message = ("Attribute 'RAIDRequestedControllerMode' cannot "
"be set to value 'foo'. It must be in "
"['RAID', 'Enhanced HBA', 'None'].")
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDEnumeration]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDString]['ok']},
{'text': test_utils.RAIDEnumerations[
uris.DCIM_RAIDInteger]['ok']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_raid_settings,
self.raid_controller_fqdd,
{'RAID.Integrated.1-1:RAIDRequestedControllerMode': 'foo'})
@mock.patch.object(dracclient.client.WSManClient, @mock.patch.object(dracclient.client.WSManClient,
'wait_until_idrac_is_ready', spec_set=True, 'wait_until_idrac_is_ready', spec_set=True,
autospec=True) autospec=True)

View File

@ -249,6 +249,15 @@ RAIDEnumerations = {
'Raid_Status_ok': load_wsman_xml( 'Raid_Status_ok': load_wsman_xml(
'virtual_disk_view-enum-with-raid-status-ok'), 'virtual_disk_view-enum-with-raid-status-ok'),
'ok': load_wsman_xml('virtual_disk_view-enum-ok') 'ok': load_wsman_xml('virtual_disk_view-enum-ok')
},
uris.DCIM_RAIDEnumeration: {
'ok': load_wsman_xml('raid_enumeration-enum-ok')
},
uris.DCIM_RAIDString: {
'ok': load_wsman_xml('raid_string-enum-ok')
},
uris.DCIM_RAIDInteger: {
'ok': load_wsman_xml('raid_integer-enum-ok')
} }
} }
@ -287,6 +296,12 @@ RAIDInvocations = {
'raid_service-invoke-clear_foreign_config-invalid_controller'), 'raid_service-invoke-clear_foreign_config-invalid_controller'),
'foreign_drive_operation_not_supported': load_wsman_xml( 'foreign_drive_operation_not_supported': load_wsman_xml(
'raid_service-invoke-clear_foreign_config-not_supported'), 'raid_service-invoke-clear_foreign_config-not_supported'),
},
'SetAttributes': {
'ok': load_wsman_xml(
'raid_service-invoke-set_attributes-ok'),
'error': load_wsman_xml(
'raid_service-invoke-set_attributes-error'),
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,416 @@
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDInteger" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponse</wsa:Action>
<wsa:RelatesTo>uuid:40206465-1566-46e3-bf05-9952ba57ec3c</wsa:RelatesTo>
<wsa:MessageID>uuid:6af777f7-9ef1-1ef1-b067-84d3878fd94c</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSupportedVD</n1:AttributeName>
<n1:CurrentValue>240</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDmaxSupportedVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxPDsInSpan</n1:AttributeName>
<n1:CurrentValue>32</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDmaxPDsInSpan</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSpansInVD</n1:AttributeName>
<n1:CurrentValue>8</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDmaxSpansInVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDrebuildRate</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDrebuildRate</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDccRate</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDccRate</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDreconstructRate</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDreconstructRate</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDbgiRate</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDbgiRate</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprRate</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDprRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDspinDownIdleTime</n1:AttributeName>
<n1:CurrentValue>30</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDspinDownIdleTime</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>65535</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprIterations</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>RAID.Integrated.1-1:RAIDprIterations</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>1</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSupportedVD</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDmaxSupportedVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxPDsInSpan</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDmaxPDsInSpan</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSpansInVD</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDmaxSpansInVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDrebuildRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDrebuildRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDccRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDccRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDreconstructRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDreconstructRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDbgiRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDbgiRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDprRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDspinDownIdleTime</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDspinDownIdleTime</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>65535</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprIterations</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.2-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.2-1:RAIDprIterations</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>1</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSupportedVD</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDmaxSupportedVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxPDsInSpan</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDmaxPDsInSpan</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDmaxSpansInVD</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDmaxSpansInVD</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>0</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDrebuildRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDrebuildRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDccRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDccRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDreconstructRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDreconstructRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDbgiRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDbgiRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprRate</n1:AttributeName>
<n1:CurrentValue>255</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDprRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>100</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDspinDownIdleTime</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDspinDownIdleTime</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>65535</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDprIterations</n1:AttributeName>
<n1:CurrentValue>0</n1:CurrentValue>
<n1:FQDD>AHCI.Embedded.1-1</n1:FQDD>
<n1:InstanceID>AHCI.Embedded.1-1:RAIDprIterations</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>1</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.2:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.2:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.3:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.3:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.4:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.4:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.5:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.5:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.6:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.6:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.7:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.7:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.8:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.8:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
<n1:DCIM_RAIDInteger>
<n1:AttributeName>RAIDNominalMediumRotationRate</n1:AttributeName>
<n1:CurrentValue>10000</n1:CurrentValue>
<n1:FQDD>Disk.Bay.9:Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Bay.9:Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDNominalMediumRotationRate</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>2</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>4294967295</n1:UpperBound>
</n1:DCIM_RAIDInteger>
</wsman:Items>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,21 @@
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDService">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
</wsa:To>
<wsa:Action>http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDService/SetAttributesResponse
</wsa:Action>
<wsa:RelatesTo>uuid:bf8adefe-6fc0-456d-b97c-fd8d4aca2d6c
</wsa:RelatesTo>
<wsa:MessageID>uuid:84abf7b9-7176-1176-a11c-a53ffbd9bed4
</wsa:MessageID>
</s:Header>
<s:Body>
<n1:SetAttributes_OUTPUT>
<n1:Message>Invalid parameter value</n1:Message>
<n1:MessageID>STOR004</n1:MessageID>
<n1:ReturnValue>2</n1:ReturnValue>
</n1:SetAttributes_OUTPUT>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,24 @@
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDService">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
</wsa:To>
<wsa:Action>http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDService/SetAttributesResponse
</wsa:Action>
<wsa:RelatesTo>uuid:bf8adefe-6fc0-456d-b97c-fd8d4aca2d6c
</wsa:RelatesTo>
<wsa:MessageID>uuid:84abf7b9-7176-1176-a11c-a53ffbd9bed4
</wsa:MessageID>
</s:Header>
<s:Body>
<n1:SetAttributes_OUTPUT>
<n1:MessageID>STOR001</n1:MessageID>
<n1:Message>The command was successful for all attributes</n1:Message>
<n1:ReturnValue>0</n1:ReturnValue>
<n1:RebootRequired>Yes</n1:RebootRequired>
<n1:SetResult>Set PendingValue</n1:SetResult>
</n1:SetAttributes_OUTPUT>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,49 @@
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration"
xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_RAIDString"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<s:Header>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponse</wsa:Action>
<wsa:RelatesTo>uuid:6f1e7eae-511a-4268-9913-c1ce1bb414be</wsa:RelatesTo>
<wsa:MessageID>uuid:6da65cf0-9cbb-1cbb-9773-deda878fd94c</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_RAIDString>
<n1:AttributeName>Name</n1:AttributeName>
<n1:CurrentValue>Virtual Disk 0</n1:CurrentValue>
<n1:FQDD>Disk.Virtual.0:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Virtual.0:RAID.Integrated.1-1:Name</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>129</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
</n1:DCIM_RAIDString>
<n1:DCIM_RAIDString>
<n1:AttributeName>Name</n1:AttributeName>
<n1:CurrentValue>Virtual Disk 1</n1:CurrentValue>
<n1:FQDD>Disk.Virtual.1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Disk.Virtual.1:RAID.Integrated.1-1:Name</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>129</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
</n1:DCIM_RAIDString>
<n1:DCIM_RAIDString>
<n1:AttributeName>RAIDEffectiveSASAddress</n1:AttributeName>
<n1:CurrentValue>500056B3239C1AFD</n1:CurrentValue>
<n1:FQDD>Enclosure.Internal.0-1:RAID.Integrated.1-1</n1:FQDD>
<n1:InstanceID>Enclosure.Internal.0-1:RAID.Integrated.1-1:RAIDEffectiveSASAddress</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>16</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
</n1:DCIM_RAIDString>
</wsman:Items>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -301,7 +301,8 @@ def set_settings(settings_type,
cim_name, cim_name,
target, target,
name_formatter=None, name_formatter=None,
wait_for_idrac=True): wait_for_idrac=True,
by_name=True):
"""Generically handles setting various types of settings on the iDRAC """Generically handles setting various types of settings on the iDRAC
This method pulls the current list of settings from the iDRAC then compares This method pulls the current list of settings from the iDRAC then compares
@ -325,6 +326,8 @@ def set_settings(settings_type,
:param wait_for_idrac: indicates whether or not to wait for the :param wait_for_idrac: indicates whether or not to wait for the
iDRAC to be ready to accept commands before issuing iDRAC to be ready to accept commands before issuing
the command the command
:param by_name: Controls whether returned dictionary uses RAID
attribute name or instance_id as key.
:returns: a dictionary containing: :returns: a dictionary containing:
- The is_commit_required key with a boolean value indicating - The is_commit_required key with a boolean value indicating
whether a config job must be created for the values to be whether a config job must be created for the values to be
@ -340,17 +343,14 @@ def set_settings(settings_type,
:raises: DRACUnexpectedReturnValue on return value mismatch :raises: DRACUnexpectedReturnValue on return value mismatch
:raises: InvalidParameterValue on invalid new setting :raises: InvalidParameterValue on invalid new setting
""" """
current_settings = list_settings(client, namespaces, by_name=by_name,
current_settings = list_settings(client, namespaces, by_name=True,
name_formatter=name_formatter, name_formatter=name_formatter,
wait_for_idrac=wait_for_idrac) wait_for_idrac=wait_for_idrac)
unknown_keys = set(new_settings) - set(current_settings) unknown_keys = set(new_settings) - set(current_settings)
if unknown_keys: if unknown_keys:
msg = ('Unknown %(settings_type)s attributes found: ' msg = ('Unknown %(settings_type)s attributes found: %(unknown_keys)r' %
'%(unknown_keys)r' % {'settings_type': settings_type, 'unknown_keys': unknown_keys})
{'settings_type': settings_type,
'unknown_keys': unknown_keys})
raise exceptions.InvalidParameterValue(reason=msg) raise exceptions.InvalidParameterValue(reason=msg)
read_only_keys = [] read_only_keys = []
@ -360,11 +360,18 @@ def set_settings(settings_type,
candidates = set(new_settings) candidates = set(new_settings)
for attr in candidates: for attr in candidates:
if str(new_settings[attr]) == str( # There are RAID settings that can have multiple values,
current_settings[attr].current_value): # however these are all read-only attributes.
unchanged_attribs.append(attr) # Filter out all read-only attributes first so that we exclude
elif current_settings[attr].read_only: # these settings from further consideration
current_setting_value = current_settings[attr].current_value
if type(current_setting_value) is list:
current_setting_value = current_setting_value[0]
if current_settings[attr].read_only:
read_only_keys.append(attr) read_only_keys.append(attr)
elif str(new_settings[attr]) == str(current_setting_value):
unchanged_attribs.append(attr)
else: else:
validation_msg = current_settings[attr].validate( validation_msg = current_settings[attr].validate(
new_settings[attr]) new_settings[attr])
@ -405,10 +412,20 @@ def set_settings(settings_type,
'SystemName': 'DCIM:ComputerSystem'} 'SystemName': 'DCIM:ComputerSystem'}
properties = {'Target': target, properties = {'Target': target,
'AttributeName': attrib_names,
'AttributeValue': [new_settings[attr] for attr 'AttributeValue': [new_settings[attr] for attr
in attrib_names]} in attrib_names]}
# To set RAID settings, above we fetched list raid settings using
# instance_id to retrieve attribute values. When we pass instance_id in
# setattribute method for setting any new RAID settings, wsman raises
# an error. So another approach to set those settings is to list raid
# settings using instance_id and for settings new settings, pass the
# attribute names in list to SetAttributes method along with the target.
# That's the reason, we need to handle RAID specific settings like below
if settings_type == 'RAID':
properties['AttributeName'] = [current_settings[attr].name for
attr in attrib_names]
else:
properties['AttributeName'] = attrib_names
doc = client.invoke(resource_uri, 'SetAttributes', doc = client.invoke(resource_uri, 'SetAttributes',
selectors, properties, selectors, properties,
wait_for_idrac=wait_for_idrac) wait_for_idrac=wait_for_idrac)