Add support for BIOS configuration

Change-Id: I574696e460f08cececc47a69b5c2b090a6cd44a2
This commit is contained in:
Imre Farkas 2015-10-15 15:43:02 +02:00
parent 31711e9444
commit da78c87db2
13 changed files with 2934 additions and 14 deletions

View File

@ -49,6 +49,7 @@ class DRACClient(object):
self._job_mgmt = job.JobManagement(self.client)
self._power_mgmt = bios.PowerManagement(self.client)
self._boot_mgmt = bios.BootManagement(self.client)
self._bios_cfg = bios.BIOSConfiguration(self.client)
def get_power_state(self):
"""Returns the current power state of the node
@ -116,6 +117,41 @@ class DRACClient(object):
return self._boot_mgmt.change_boot_device_order(boot_mode,
boot_device_list)
def list_bios_settings(self):
"""List the BIOS configuration settings
:returns: a dictionary with the BIOS settings using its name as the
key. The attributes are either BIOSEnumerableAttribute,
BIOSStringAttribute or BIOSIntegerAttribute objects.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
return self._bios_cfg.list_bios_settings()
def set_bios_settings(self, settings):
"""Sets the BIOS configuration
To be more precise, 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 and the node must be rebooted.
: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 commit_needed key with a boolean
value indicating whether a config job must be created for the
values to be applied.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
:raises: DRACUnexpectedReturnValue on return value mismatch
:raises: InvalidParameterValue on invalid BIOS attribute
"""
return self._bios_cfg.set_bios_settings(settings)
def list_jobs(self, only_unfinished=False):
"""Returns a list of jobs from the job queue
@ -208,9 +244,11 @@ class DRACClient(object):
resource_uri, cim_creation_class_name, cim_name, target,
cim_system_creation_class_name, cim_system_name)
def commit_pending_bios_changes(self):
def commit_pending_bios_changes(self, reboot=False):
"""Applies all pending changes on the BIOS by creating a config job
:param: reboot: indicates whether a RebootJob should be also be
created or not
:returns: id of the created job
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
@ -221,7 +259,8 @@ class DRACClient(object):
return self._job_mgmt.create_config_job(
resource_uri=uris.DCIM_BIOSService,
cim_creation_class_name='DCIM_BIOSService',
cim_name='DCIM:BIOSService', target=self.BIOS_DEVICE_FQDD)
cim_name='DCIM:BIOSService', target=self.BIOS_DEVICE_FQDD,
reboot=reboot)
def abandon_pending_bios_changes(self):
"""Deletes all pending changes on the BIOS

View File

@ -12,12 +12,17 @@
# under the License.
import collections
import logging
import re
from dracclient import constants
from dracclient import exceptions
from dracclient.resources import lifecycle_controller
from dracclient.resources import uris
from dracclient import utils
from dracclient import wsman
LOG = logging.getLogger(__name__)
POWER_STATES = {
'2': constants.POWER_ON,
@ -43,11 +48,10 @@ LC_CONTROLLER_VERSION_12G = (2, 0, 0)
BootMode = collections.namedtuple('BootMode', ['id', 'name', 'is_current',
'is_next'])
BootDevice = collections.namedtuple('BootDevice',
['id', 'boot_mode',
'current_assigned_sequence',
'pending_assigned_sequence',
'bios_boot_string'])
BootDevice = collections.namedtuple(
'BootDevice',
['id', 'boot_mode', 'current_assigned_sequence',
'pending_assigned_sequence', 'bios_boot_string'])
class PowerManagement(object):
@ -252,3 +256,329 @@ class BootManagement(object):
return utils.get_wsman_resource_attr(drac_boot_device,
uris.DCIM_BootSourceSetting,
attr_name)
class BIOSAttribute(object):
"""Generic BIOS attribute class"""
def __init__(self, name, current_value, pending_value, read_only):
"""Creates BIOSAttribute object
:param name: name of the BIOS attribute
:param current_value: current value of the BIOS attribute
:param pending_value: pending value of the BIOS attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this BIOS attribute can be changed
"""
self.name = name
self.current_value = current_value
self.pending_value = pending_value
self.read_only = read_only
def __eq__(self, other):
return self.__dict__ == other.__dict__
@classmethod
def parse(cls, namespace, bios_attr_xml):
"""Parses XML and creates BIOSAttribute object"""
name = utils.get_wsman_resource_attr(
bios_attr_xml, namespace, 'AttributeName')
current_value = utils.get_wsman_resource_attr(
bios_attr_xml, namespace, 'CurrentValue', nullable=True)
pending_value = utils.get_wsman_resource_attr(
bios_attr_xml, namespace, 'PendingValue', nullable=True)
read_only = utils.get_wsman_resource_attr(
bios_attr_xml, namespace, 'IsReadOnly')
return cls(name, current_value, pending_value, (read_only == 'true'))
class BIOSEnumerableAttribute(BIOSAttribute):
"""Enumerable BIOS attribute class"""
namespace = uris.DCIM_BIOSEnumeration
def __init__(self, name, current_value, pending_value, read_only,
possible_values):
"""Creates BIOSEnumerableAttribute object
:param name: name of the BIOS attribute
:param current_value: current value of the BIOS attribute
:param pending_value: pending value of the BIOS attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this BIOS attribute can be changed
:param possible_values: list containing the allowed values for the BIOS
attribute
"""
super(BIOSEnumerableAttribute, self).__init__(name, current_value,
pending_value, read_only)
self.possible_values = possible_values
@classmethod
def parse(cls, bios_attr_xml):
"""Parses XML and creates BIOSEnumerableAttribute object"""
bios_attr = BIOSAttribute.parse(cls.namespace, bios_attr_xml)
possible_values = [attr.text for attr
in utils.find_xml(bios_attr_xml, 'PossibleValues',
cls.namespace, find_all=True)]
return cls(bios_attr.name, bios_attr.current_value,
bios_attr.pending_value, bios_attr.read_only,
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 BIOSStringAttribute(BIOSAttribute):
"""String BIOS attribute class"""
namespace = uris.DCIM_BIOSString
def __init__(self, name, current_value, pending_value, read_only,
min_length, max_length, pcre_regex):
"""Creates BIOSStringAttribute object
:param name: name of the BIOS attribute
:param current_value: current value of the BIOS attribute
:param pending_value: pending value of the BIOS attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this BIOS attribute can be changed
:param min_length: minimum length of the string
:param max_length: maximum length of the string
:param pcre_regex: is a PCRE compatible regular expression that the
string must match
"""
super(BIOSStringAttribute, self).__init__(name, current_value,
pending_value, read_only)
self.min_length = min_length
self.max_length = max_length
self.pcre_regex = pcre_regex
@classmethod
def parse(cls, bios_attr_xml):
"""Parses XML and creates BIOSStringAttribute object"""
bios_attr = BIOSAttribute.parse(cls.namespace, bios_attr_xml)
min_length = int(utils.get_wsman_resource_attr(
bios_attr_xml, cls.namespace, 'MinLength'))
max_length = int(utils.get_wsman_resource_attr(
bios_attr_xml, cls.namespace, 'MaxLength'))
pcre_regex = utils.get_wsman_resource_attr(
bios_attr_xml, cls.namespace, 'ValueExpression', nullable=True)
return cls(bios_attr.name, bios_attr.current_value,
bios_attr.pending_value, bios_attr.read_only,
min_length, max_length, pcre_regex)
def validate(self, new_value):
"""Validates new value"""
if self.pcre_regex is not None:
regex = re.compile(self.pcre_regex)
if regex.search(str(new_value)) is None:
msg = ("Attribute '%(attr)s' cannot be set to value '%(val)s.'"
" It must match regex '%(re)s'.") % {
'attr': self.name,
'val': new_value,
're': self.pcre_regex}
return msg
class BIOSIntegerAttribute(BIOSAttribute):
"""Integer BIOS attribute class"""
namespace = uris.DCIM_BIOSInteger
def __init__(self, name, current_value, pending_value, read_only,
lower_bound, upper_bound):
"""Creates BIOSIntegerAttribute object
:param name: name of the BIOS attribute
:param current_value: current value of the BIOS attribute
:param pending_value: pending value of the BIOS attribute, reflecting
an unprocessed change (eg. config job not completed)
:param read_only: indicates whether this BIOS attribute can be changed
:param lower_bound: minimum value for the BIOS attribute
:param upper_bound: maximum value for the BOIS attribute
"""
super(BIOSIntegerAttribute, self).__init__(name, current_value,
pending_value, read_only)
self.lower_bound = lower_bound
self.upper_bound = upper_bound
@classmethod
def parse(cls, bios_attr_xml):
"""Parses XML and creates BIOSIntegerAttribute object"""
bios_attr = BIOSAttribute.parse(cls.namespace, bios_attr_xml)
lower_bound = utils.get_wsman_resource_attr(
bios_attr_xml, cls.namespace, 'LowerBound')
upper_bound = utils.get_wsman_resource_attr(
bios_attr_xml, cls.namespace, 'UpperBound')
if bios_attr.current_value:
bios_attr.current_value = int(bios_attr.current_value)
if bios_attr.pending_value:
bios_attr.pending_value = int(bios_attr.pending_value)
return cls(bios_attr.name, bios_attr.current_value,
bios_attr.pending_value, bios_attr.read_only,
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 BIOSConfiguration(object):
def __init__(self, client):
"""Creates BIOSConfiguration object
:param client: an instance of WSManClient
"""
self.client = client
def list_bios_settings(self):
"""List the BIOS configuration settings
:returns: a dictionary with the BIOS settings using its name as the
key. The attributes are either BIOSEnumerableAttribute,
BIOSStringAttribute or BIOSIntegerAttribute objects.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
"""
result = {}
namespaces = [(uris.DCIM_BIOSEnumeration, BIOSEnumerableAttribute),
(uris.DCIM_BIOSString, BIOSStringAttribute),
(uris.DCIM_BIOSInteger, BIOSIntegerAttribute)]
for (namespace, attr_cls) in namespaces:
attribs = self._get_config(namespace, attr_cls)
if not set(result).isdisjoint(set(attribs)):
raise exceptions.DRACOperationFailed(
drac_messages=('Colliding attributes %r' % (
set(result) & set(attribs))))
result.update(attribs)
return result
def _get_config(self, resource, attr_cls):
result = {}
doc = self.client.enumerate(resource)
items = doc.find('.//{%s}Items' % wsman.NS_WSMAN)
for item in items:
attribute = attr_cls.parse(item)
result[attribute.name] = attribute
return result
def set_bios_settings(self, new_settings):
"""Sets the BIOS configuration
To be more precise, 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 and the node must be rebooted.
: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 commit_needed key with a boolean
value indicating whether a config job must be created for the
values to be applied.
:raises: WSManRequestFailure on request failures
:raises: WSManInvalidResponse when receiving invalid response
:raises: DRACOperationFailed on error reported back by the DRAC
interface
:raises: DRACUnexpectedReturnValue on return value mismatch
:raises: InvalidParameterValue on invalid BIOS attribute
"""
current_settings = self.list_bios_settings()
unknown_keys = set(new_settings) - set(current_settings)
if unknown_keys:
msg = ('Unknown BIOS attributes found: %(unknown_keys)r' %
{'unknown_keys': unknown_keys})
raise exceptions.InvalidParameterValue(reason=msg)
read_only_keys = []
unchanged_attribs = []
invalid_attribs_msgs = []
attrib_names = []
candidates = set(new_settings)
for attr in candidates:
if str(new_settings[attr]) == str(
current_settings[attr].current_value):
unchanged_attribs.append(attr)
elif current_settings[attr].read_only:
read_only_keys.append(attr)
else:
validation_msg = current_settings[attr].validate(
new_settings[attr])
if validation_msg is None:
attrib_names.append(attr)
else:
invalid_attribs_msgs.append(validation_msg)
if unchanged_attribs:
LOG.warn('Ignoring unchanged BIOS attributes: %r' %
unchanged_attribs)
if invalid_attribs_msgs or read_only_keys:
if read_only_keys:
read_only_msg = ['Cannot set read-only BIOS attributes: %r.'
% read_only_keys]
else:
read_only_msg = []
drac_messages = '\n'.join(invalid_attribs_msgs + read_only_msg)
raise exceptions.DRACOperationFailed(
drac_messages=drac_messages)
if not attrib_names:
return {'commit_required': False}
selectors = {'CreationClassName': 'DCIM_BIOSService',
'Name': 'DCIM:BIOSService',
'SystemCreationClassName': 'DCIM_ComputerSystem',
'SystemName': 'DCIM:ComputerSystem'}
properties = {'Target': 'BIOS.Setup.1-1',
'AttributeName': attrib_names,
'AttributeValue': [new_settings[attr] for attr
in attrib_names]}
doc = self.client.invoke(uris.DCIM_BIOSService, 'SetAttributes',
selectors, properties)
# Checking for RebootRequired attribute in the response, which
# indicates whether we need to create a config job and then reboot, so
# that the Lifecycle controller can commit the BIOS config changes that
# have been proposed.
reboot_required = utils.find_xml(doc, 'RebootRequired',
uris.DCIM_BIOSService)
commit_required = (reboot_required.text == 'Yes')
return {'commit_required': commit_required}

View File

@ -11,6 +11,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import re
import lxml.etree
import mock
import requests_mock
@ -189,6 +191,210 @@ class ClientBootManagementTestCase(base.BaseTest):
self.drac_client.change_boot_device_order, 'IPL', 'foo')
class ClientBIOSConfigurationTestCase(base.BaseTest):
def setUp(self):
super(ClientBIOSConfigurationTestCase, self).setUp()
self.drac_client = dracclient.client.DRACClient(
**test_utils.FAKE_ENDPOINT)
@requests_mock.Mocker()
def test_list_bios_settings(self, mock_requests):
expected_enum_attr = bios.BIOSEnumerableAttribute(
name='MemTest',
read_only=False,
current_value='Disabled',
pending_value=None,
possible_values=['Enabled', 'Disabled'])
expected_string_attr = bios.BIOSStringAttribute(
name='SystemModelName',
read_only=True,
current_value='PowerEdge R320',
pending_value=None,
min_length=0,
max_length=32,
pcre_regex=None)
expected_integer_attr = bios.BIOSIntegerAttribute(
name='Proc1NumCores',
read_only=True,
current_value=8,
pending_value=None,
lower_bound=0,
upper_bound=65535)
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
bios_settings = self.drac_client.list_bios_settings()
self.assertEqual(103, len(bios_settings))
# enumerable attribute
self.assertIn('MemTest', bios_settings)
self.assertEqual(expected_enum_attr, bios_settings['MemTest'])
# string attribute
self.assertIn('SystemModelName', bios_settings)
self.assertEqual(expected_string_attr,
bios_settings['SystemModelName'])
# integer attribute
self.assertIn('Proc1NumCores', bios_settings)
self.assertEqual(expected_integer_attr, bios_settings['Proc1NumCores'])
@requests_mock.Mocker()
def test_list_bios_settings_with_colliding_attrs(self, mock_requests):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['colliding']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
self.assertRaises(exceptions.DRACOperationFailed,
self.drac_client.list_bios_settings)
@requests_mock.Mocker()
@mock.patch.object(dracclient.client.WSManClient, 'invoke',
spec_set=True, autospec=True)
def test_set_bios_settings(self, mock_requests, mock_invoke):
expected_selectors = {'CreationClassName': 'DCIM_BIOSService',
'SystemName': 'DCIM:ComputerSystem',
'Name': 'DCIM:BIOSService',
'SystemCreationClassName': 'DCIM_ComputerSystem'}
expected_properties = {'Target': 'BIOS.Setup.1-1',
'AttributeName': ['ProcVirtualization'],
'AttributeValue': ['Disabled']}
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
mock_invoke.return_value = lxml.etree.fromstring(
test_utils.BIOSInvocations[uris.DCIM_BIOSService][
'SetAttributes']['ok'])
result = self.drac_client.set_bios_settings(
{'ProcVirtualization': 'Disabled'})
self.assertEqual({'commit_required': True}, result)
mock_invoke.assert_called_once_with(
mock.ANY, uris.DCIM_BIOSService, 'SetAttributes',
expected_selectors, expected_properties)
@requests_mock.Mocker()
def test_set_bios_settings_error(self, mock_requests):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']},
{'text': test_utils.BIOSInvocations[
uris.DCIM_BIOSService]['SetAttributes']['error']}])
self.assertRaises(exceptions.DRACOperationFailed,
self.drac_client.set_bios_settings,
{'ProcVirtualization': 'Disabled'})
@requests_mock.Mocker()
def test_set_bios_settings_with_unknown_attr(self, mock_requests):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
self.assertRaises(exceptions.InvalidParameterValue,
self.drac_client.set_bios_settings, {'foo': 'bar'})
@requests_mock.Mocker()
def test_set_bios_settings_with_unchanged_attr(self, mock_requests):
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
result = self.drac_client.set_bios_settings(
{'ProcVirtualization': 'Enabled'})
self.assertEqual({'commit_required': False}, result)
@requests_mock.Mocker()
def test_set_bios_settings_with_readonly_attr(self, mock_requests):
expected_message = ("Cannot set read-only BIOS attributes: "
"['Proc1NumCores'].")
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_bios_settings, {'Proc1NumCores': 42})
@requests_mock.Mocker()
def test_set_bios_settings_with_incorrect_enum_value(self, mock_requests):
expected_message = ("Attribute 'MemTest' cannot be set to value "
"'foo'. It must be in ['Enabled', 'Disabled'].")
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_bios_settings, {'MemTest': 'foo'})
@requests_mock.Mocker()
def test_set_bios_settings_with_incorrect_regexp(self, mock_requests):
expected_message = ("Attribute 'SystemModelName' cannot be set to "
"value 'bar.' It must match regex 'foo'.")
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['regexp']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['ok']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_bios_settings, {'SystemModelName': 'bar'})
@requests_mock.Mocker()
def test_set_bios_settings_with_out_of_bounds_value(self, mock_requests):
expected_message = ('Attribute Proc1NumCores cannot be set to value '
'-42. It must be between 0 and 65535.')
mock_requests.post('https://1.2.3.4:443/wsman', [
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSEnumeration]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSString]['ok']},
{'text': test_utils.BIOSEnumerations[
uris.DCIM_BIOSInteger]['mutable']}])
self.assertRaisesRegexp(
exceptions.DRACOperationFailed, re.escape(expected_message),
self.drac_client.set_bios_settings, {'Proc1NumCores': -42})
class ClientJobManagementTestCase(base.BaseTest):
def setUp(self):
@ -383,7 +589,18 @@ class ClientBIOSChangesTestCase(base.BaseTest):
mock_create_config_job.assert_called_once_with(
mock.ANY, resource_uri=uris.DCIM_BIOSService,
cim_creation_class_name='DCIM_BIOSService',
cim_name='DCIM:BIOSService', target='BIOS.Setup.1-1')
cim_name='DCIM:BIOSService', target='BIOS.Setup.1-1', reboot=False)
@mock.patch.object(dracclient.resources.job.JobManagement,
'create_config_job', spec_set=True, autospec=True)
def test_commit_pending_bios_changes_with_reboot(self,
mock_create_config_job):
self.drac_client.commit_pending_bios_changes(reboot=True)
mock_create_config_job.assert_called_once_with(
mock.ANY, resource_uri=uris.DCIM_BIOSService,
cim_creation_class_name='DCIM_BIOSService',
cim_name='DCIM:BIOSService', target='BIOS.Setup.1-1', reboot=True)
@mock.patch.object(dracclient.resources.job.JobManagement,
'delete_pending_config', spec_set=True, autospec=True)

View File

@ -44,8 +44,17 @@ WSManEnumerations = {
}
BIOSEnumerations = {
uris.DCIM_ComputerSystem: {
'ok': load_wsman_xml('computer_system-enum-ok')
uris.DCIM_BIOSEnumeration: {
'ok': load_wsman_xml('bios_enumeration-enum-ok')
},
uris.DCIM_BIOSInteger: {
'mutable': load_wsman_xml('bios_integer-enum-mutable'),
'ok': load_wsman_xml('bios_integer-enum-ok')
},
uris.DCIM_BIOSString: {
'colliding': load_wsman_xml('bios_string-enum-colliding'),
'ok': load_wsman_xml('bios_string-enum-ok'),
'regexp': load_wsman_xml('bios_string-enum-regexp')
},
uris.DCIM_BootConfigSetting: {
'ok': load_wsman_xml('boot_config_setting-enum-ok')
@ -53,7 +62,10 @@ BIOSEnumerations = {
uris.DCIM_BootSourceSetting: {
'ok': load_wsman_xml('boot_source_setting-enum-ok'),
'ok-11g': load_wsman_xml('boot_source_setting-enum-ok-11g')
}
},
uris.DCIM_ComputerSystem: {
'ok': load_wsman_xml('computer_system-enum-ok')
},
}
BIOSInvocations = {
@ -65,6 +77,14 @@ BIOSInvocations = {
'computer_system-invoke-request_state_change-error'),
},
},
uris.DCIM_BIOSService: {
'SetAttributes': {
'ok': load_wsman_xml(
'bios_service-invoke-set_attributes-ok'),
'error': load_wsman_xml(
'bios_service-invoke-set_attributes-error'),
}
},
uris.DCIM_BootConfigSetting: {
'ChangeBootOrderByInstanceID': {
'ok': load_wsman_xml(

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSInteger"
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: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:382b3463-6ab7-4998-85d5-0ac3f4d3044d</wsa:RelatesTo>
<wsa:MessageID>uuid:319dc294-2213-1213-8eeb-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_BIOSInteger>
<n1:AttributeDisplayName>Number of Cores</n1:AttributeDisplayName>
<n1:AttributeName>Proc1NumCores</n1:AttributeName>
<n1:CurrentValue>8</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>446</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1NumCores</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>65535</n1:UpperBound>
</n1:DCIM_BIOSInteger>
</wsman:Items>
<wsen:EnumerationContext/>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,56 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSInteger"
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: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:382b3463-6ab7-4998-85d5-0ac3f4d3044d</wsa:RelatesTo>
<wsa:MessageID>uuid:319dc294-2213-1213-8eeb-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_BIOSInteger>
<n1:AttributeDisplayName>Number of Cores</n1:AttributeDisplayName>
<n1:AttributeName>Proc1NumCores</n1:AttributeName>
<n1:CurrentValue>8</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>446</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1NumCores</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>0</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>65535</n1:UpperBound>
</n1:DCIM_BIOSInteger>
<n1:DCIM_BIOSInteger>
<n1:AttributeDisplayName>User Defined Delay (60s to 240s)</n1:AttributeDisplayName>
<n1:AttributeName>AcPwrRcvryUserDelay</n1:AttributeName>
<n1:CurrentValue>60</n1:CurrentValue>
<n1:Dependency><![CDATA[
<Dep>
<AttrLev Op="OR">
<ROIf Name="AcPwrRcvry">Off</ROIf>
<ROIf Name="AcPwrRcvryDelay" Op="NOT">User</ROIf></AttrLev>
</Dep>]]></n1:Dependency>
<n1:DisplayOrder>1431</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Security</n1:GroupDisplayName>
<n1:GroupID>SysSecurity</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:AcPwrRcvryUserDelay</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:LowerBound>60</n1:LowerBound>
<n1:PendingValue xsi:nil="true"/>
<n1:UpperBound>240</n1:UpperBound>
</n1:DCIM_BIOSInteger>
</wsman:Items>
<wsen:EnumerationContext/>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,20 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSService"
xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<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_BIOSService/SetAttributesResponse</wsa:Action>
<wsa:RelatesTo>uuid:f06dfc6d-b102-43d8-a61e-722b7ec8b7b2</wsa:RelatesTo>
<wsa:MessageID>uuid:2bfaa9a2-223c-123c-8f55-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<n1:SetAttributes_OUTPUT>
<n1:Message>Invalid AttributeValue for AttributeName ProcVirtualization</n1:Message>
<n1:MessageArguments>ProcVirtualization</n1:MessageArguments>
<n1:MessageID>BIOS014</n1:MessageID>
<n1:RebootRequired>Yes</n1:RebootRequired>
<n1:ReturnValue>2</n1:ReturnValue>
<n1:SetResult>Set PendingValue</n1:SetResult>
</n1:SetAttributes_OUTPUT>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,19 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSService"
xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<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_BIOSService/SetAttributesResponse</wsa:Action>
<wsa:RelatesTo>uuid:9ffdced1-8f2e-441c-a42a-e6c56d9859c8</wsa:RelatesTo>
<wsa:MessageID>uuid:d139ff73-223b-123b-8f47-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<n1:SetAttributes_OUTPUT>
<n1:Message>The command was successful.</n1:Message>
<n1:MessageID>BIOS001</n1:MessageID>
<n1:RebootRequired>Yes</n1:RebootRequired>
<n1:ReturnValue>0</n1:ReturnValue>
<n1:SetResult>Set PendingValue</n1:SetResult>
</n1:SetAttributes_OUTPUT>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,53 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSString"
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: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:1d8b3e77-8919-4459-8f06-2d63284c15c1</wsa:RelatesTo>
<wsa:MessageID>uuid:31707306-2213-1213-8ee9-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Memory Testing</n1:AttributeDisplayName>
<n1:AttributeName>MemTest</n1:AttributeName>
<n1:CurrentValue>PowerEdge R320</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>200</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemModelName</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>32</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Memory Operating Mode</n1:AttributeDisplayName>
<n1:AttributeName>MemOpMode</n1:AttributeName>
<n1:CurrentValue>2.3.3</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>201</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemBiosVersion</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>48</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
</wsman:Items>
<wsen:EnumerationContext/>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,581 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSString"
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: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:1d8b3e77-8919-4459-8f06-2d63284c15c1</wsa:RelatesTo>
<wsa:MessageID>uuid:31707306-2213-1213-8ee9-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Model Name</n1:AttributeDisplayName>
<n1:AttributeName>SystemModelName</n1:AttributeName>
<n1:CurrentValue>PowerEdge R320</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>200</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemModelName</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>32</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System BIOS Version</n1:AttributeDisplayName>
<n1:AttributeName>SystemBiosVersion</n1:AttributeName>
<n1:CurrentValue>2.3.3</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>201</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemBiosVersion</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>48</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Service Tag</n1:AttributeDisplayName>
<n1:AttributeName>SystemServiceTag</n1:AttributeName>
<n1:CurrentValue>JLR7Q22</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>202</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemServiceTag</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Manufacturer</n1:AttributeDisplayName>
<n1:AttributeName>SystemManufacturer</n1:AttributeName>
<n1:CurrentValue>Dell Inc.</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>204</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemManufacturer</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>32</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Manufacturer Contact Information</n1:AttributeDisplayName>
<n1:AttributeName>SysMfrContactInfo</n1:AttributeName>
<n1:CurrentValue>www.dell.com</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>205</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SysMfrContactInfo</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>32</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System CPLD Version</n1:AttributeDisplayName>
<n1:AttributeName>SystemCpldVersion</n1:AttributeName>
<n1:CurrentValue>104</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>206</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemCpldVersion</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>8</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Memory Size</n1:AttributeDisplayName>
<n1:AttributeName>SysMemSize</n1:AttributeName>
<n1:CurrentValue>32.0 GB</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>300</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Memory Settings</n1:GroupDisplayName>
<n1:GroupID>MemSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SysMemSize</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Memory Type</n1:AttributeDisplayName>
<n1:AttributeName>SysMemType</n1:AttributeName>
<n1:CurrentValue>ECC DDR3</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>301</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Memory Settings</n1:GroupDisplayName>
<n1:GroupID>MemSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SysMemType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Memory Speed</n1:AttributeDisplayName>
<n1:AttributeName>SysMemSpeed</n1:AttributeName>
<n1:CurrentValue>1600 MHz</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>302</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Memory Settings</n1:GroupDisplayName>
<n1:GroupID>MemSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SysMemSpeed</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Memory Voltage</n1:AttributeDisplayName>
<n1:AttributeName>SysMemVolt</n1:AttributeName>
<n1:CurrentValue>1.35V</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>303</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Memory Settings</n1:GroupDisplayName>
<n1:GroupID>MemSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SysMemVolt</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>8</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Video Memory</n1:AttributeDisplayName>
<n1:AttributeName>VideoMem</n1:AttributeName>
<n1:CurrentValue>16 MB</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>304</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Memory Settings</n1:GroupDisplayName>
<n1:GroupID>MemSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:VideoMem</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Processor 64-bit Support</n1:AttributeDisplayName>
<n1:AttributeName>Proc64bit</n1:AttributeName>
<n1:CurrentValue>Yes</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>435</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc64bit</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>4</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Processor Core Speed</n1:AttributeDisplayName>
<n1:AttributeName>ProcCoreSpeed</n1:AttributeName>
<n1:CurrentValue>1.90 GHz</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>436</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:ProcCoreSpeed</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Family-Model-Stepping</n1:AttributeDisplayName>
<n1:AttributeName>Proc1Id</n1:AttributeName>
<n1:CurrentValue>06-3E-4</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>442</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1Id</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>8</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Brand</n1:AttributeDisplayName>
<n1:AttributeName>Proc1Brand</n1:AttributeName>
<n1:CurrentValue>[Intel(R) Xeon(R) CPU E5-2440 v2 @ 1.90GHz ]</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>443</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1Brand</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>80</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Level 2 Cache</n1:AttributeDisplayName>
<n1:AttributeName>Proc1L2Cache</n1:AttributeName>
<n1:CurrentValue>8x256 KB</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>444</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1L2Cache</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Level 3 Cache</n1:AttributeDisplayName>
<n1:AttributeName>Proc1L3Cache</n1:AttributeName>
<n1:CurrentValue>20 MB</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>445</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Processor Settings</n1:GroupDisplayName>
<n1:GroupID>ProcSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:Proc1L3Cache</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>16</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Model</n1:AttributeDisplayName>
<n1:AttributeName>SataPortAModel</n1:AttributeName>
<n1:CurrentValue>Unknown</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>507</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortAModel</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>40</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Drive Type</n1:AttributeDisplayName>
<n1:AttributeName>SataPortADriveType</n1:AttributeName>
<n1:CurrentValue>Unknown Device</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>508</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortADriveType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Capacity</n1:AttributeDisplayName>
<n1:AttributeName>SataPortACapacity</n1:AttributeName>
<n1:CurrentValue>N/A</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>509</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortACapacity</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>18</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Model</n1:AttributeDisplayName>
<n1:AttributeName>SataPortBModel</n1:AttributeName>
<n1:CurrentValue>Unknown</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>513</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortBModel</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>40</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Drive Type</n1:AttributeDisplayName>
<n1:AttributeName>SataPortBDriveType</n1:AttributeName>
<n1:CurrentValue>Unknown Device</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>514</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortBDriveType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Capacity</n1:AttributeDisplayName>
<n1:AttributeName>SataPortBCapacity</n1:AttributeName>
<n1:CurrentValue>N/A</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>515</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortBCapacity</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>18</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Model</n1:AttributeDisplayName>
<n1:AttributeName>SataPortCModel</n1:AttributeName>
<n1:CurrentValue>Unknown</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>519</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortCModel</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>40</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Drive Type</n1:AttributeDisplayName>
<n1:AttributeName>SataPortCDriveType</n1:AttributeName>
<n1:CurrentValue>Unknown Device</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>520</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortCDriveType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Capacity</n1:AttributeDisplayName>
<n1:AttributeName>SataPortCCapacity</n1:AttributeName>
<n1:CurrentValue>N/A</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>521</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortCCapacity</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>18</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Model</n1:AttributeDisplayName>
<n1:AttributeName>SataPortDModel</n1:AttributeName>
<n1:CurrentValue>Unknown</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>525</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortDModel</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>40</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Drive Type</n1:AttributeDisplayName>
<n1:AttributeName>SataPortDDriveType</n1:AttributeName>
<n1:CurrentValue>Unknown Device</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>526</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortDDriveType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Capacity</n1:AttributeDisplayName>
<n1:AttributeName>SataPortDCapacity</n1:AttributeName>
<n1:CurrentValue>N/A</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>527</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortDCapacity</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>18</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Model</n1:AttributeDisplayName>
<n1:AttributeName>SataPortEModel</n1:AttributeName>
<n1:CurrentValue>HL-DT-ST DVD-ROM DU90N </n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>531</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortEModel</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>40</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Drive Type</n1:AttributeDisplayName>
<n1:AttributeName>SataPortEDriveType</n1:AttributeName>
<n1:CurrentValue>Optical Drive</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>532</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortEDriveType</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Capacity</n1:AttributeDisplayName>
<n1:AttributeName>SataPortECapacity</n1:AttributeName>
<n1:CurrentValue>N/A</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>533</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>SATA Settings</n1:GroupDisplayName>
<n1:GroupID>SataSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SataPortECapacity</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>18</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Intel(R) AES-NI</n1:AttributeDisplayName>
<n1:AttributeName>AesNi</n1:AttributeName>
<n1:CurrentValue>Enabled</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>1400</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Security</n1:GroupDisplayName>
<n1:GroupID>SysSecurity</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:AesNi</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>20</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>TPM Status</n1:AttributeDisplayName>
<n1:AttributeName>TpmStatus</n1:AttributeName>
<n1:CurrentValue>Unknown</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>1413</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Security</n1:GroupDisplayName>
<n1:GroupID>SysSecurity</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:TpmStatus</n1:InstanceID>
<n1:IsReadOnly>true</n1:IsReadOnly>
<n1:MaxLength>24</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression xsi:nil="true"/>
</n1:DCIM_BIOSString>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>Asset Tag</n1:AttributeDisplayName>
<n1:AttributeName>AssetTag</n1:AttributeName>
<n1:CurrentValue xsi:nil="true"/>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>1504</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>Miscellaneous Settings</n1:GroupDisplayName>
<n1:GroupID>MiscSettings</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:AssetTag</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:MaxLength>30</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression>^[ -~]{0,30}$</n1:ValueExpression>
</n1:DCIM_BIOSString>
</wsman:Items>
<wsen:EnumerationContext/>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -0,0 +1,37 @@
<s:Envelope xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_BIOSString"
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: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:1d8b3e77-8919-4459-8f06-2d63284c15c1</wsa:RelatesTo>
<wsa:MessageID>uuid:31707306-2213-1213-8ee9-a36fc6fe83b0</wsa:MessageID>
</s:Header>
<s:Body>
<wsen:EnumerateResponse>
<wsman:Items>
<n1:DCIM_BIOSString>
<n1:AttributeDisplayName>System Model Name</n1:AttributeDisplayName>
<n1:AttributeName>SystemModelName</n1:AttributeName>
<n1:CurrentValue>PowerEdge R320</n1:CurrentValue>
<n1:Dependency xsi:nil="true"/>
<n1:DisplayOrder>200</n1:DisplayOrder>
<n1:FQDD>BIOS.Setup.1-1</n1:FQDD>
<n1:GroupDisplayName>System Information</n1:GroupDisplayName>
<n1:GroupID>SysInformation</n1:GroupID>
<n1:InstanceID>BIOS.Setup.1-1:SystemModelName</n1:InstanceID>
<n1:IsReadOnly>false</n1:IsReadOnly>
<n1:MaxLength>32</n1:MaxLength>
<n1:MinLength>0</n1:MinLength>
<n1:PendingValue xsi:nil="true"/>
<n1:ValueExpression>foo</n1:ValueExpression>
</n1:DCIM_BIOSString>
</wsman:Items>
<wsen:EnumerationContext/>
<wsman:EndOfSequence/>
</wsen:EnumerateResponse>
</s:Body>
</s:Envelope>

View File

@ -15,6 +15,8 @@
Common functionalities shared between different DRAC modules.
"""
NS_XMLSchema_Instance = 'http://www.w3.org/2001/XMLSchema-instance'
# ReturnValue constants
RET_SUCCESS = '0'
RET_ERROR = '2'
@ -42,7 +44,22 @@ def find_xml(doc, item, namespace, find_all=False):
return doc.find(query)
def get_wsman_resource_attr(doc, resource_uri, attr_name):
"""Find an attribute of a resource in an ElementTree object"""
def get_wsman_resource_attr(doc, resource_uri, attr_name, nullable=False):
"""Find an attribute of a resource in an ElementTree object.
return find_xml(doc, attr_name, resource_uri).text.strip()
:param doc: the element tree object.
:param resource_uri: the resource URI of the namespace.
:param attr_name: the name of the attribute.
:param: nullable: enables checking if the element contains an
XMLSchema-instance namespaced nil attribute that has a
value of True. In this case, it will return None.
:returns: value of the attribute
"""
item = find_xml(doc, attr_name, resource_uri)
if not nullable:
return item.text.strip()
else:
nil_attr = item.attrib.get('{%s}nil' % NS_XMLSchema_Instance)
if nil_attr != 'true':
return item.text.strip()