Merge "Added support for PCIe drives"
This commit is contained in:
commit
a8ef5bfb6a
|
@ -66,14 +66,17 @@ PHYSICAL_DISK_BUS_PROTOCOL = {
|
|||
'3': 'fibre',
|
||||
'4': 'usb',
|
||||
'5': 'sata',
|
||||
'6': 'sas'
|
||||
'6': 'sas',
|
||||
'7': 'pcie',
|
||||
'8': 'nvme'
|
||||
}
|
||||
|
||||
PhysicalDiskTuple = collections.namedtuple(
|
||||
'PhysicalDisk',
|
||||
['id', 'description', 'controller', 'manufacturer', 'model', 'media_type',
|
||||
'interface_type', 'size_mb', 'free_size_mb', 'serial_number',
|
||||
'firmware_version', 'status', 'raid_status', 'sas_address'])
|
||||
'firmware_version', 'status', 'raid_status', 'sas_address',
|
||||
'device_protocol'])
|
||||
|
||||
|
||||
class PhysicalDisk(PhysicalDiskTuple):
|
||||
|
@ -232,7 +235,7 @@ class RAIDManagement(object):
|
|||
nullable=True),
|
||||
controller=fqdd.split(':')[-1],
|
||||
raid_level=REVERSE_RAID_LEVELS[drac_raid_level],
|
||||
size_mb=int(size_b) / 2 ** 20,
|
||||
size_mb=int(size_b) // 2 ** 20,
|
||||
status=constants.PRIMARY_STATUS[drac_status],
|
||||
raid_status=DISK_RAID_STATUS[drac_raid_status],
|
||||
span_depth=int(self._get_virtual_disk_attr(drac_disk,
|
||||
|
@ -268,45 +271,74 @@ class RAIDManagement(object):
|
|||
drac_physical_disks = utils.find_xml(doc, 'DCIM_PhysicalDiskView',
|
||||
uris.DCIM_PhysicalDiskView,
|
||||
find_all=True)
|
||||
physical_disks = [self._parse_drac_physical_disk(disk)
|
||||
for disk in drac_physical_disks]
|
||||
|
||||
return [self._parse_drac_physical_disk(disk)
|
||||
for disk in drac_physical_disks]
|
||||
drac_pcie_disks = utils.find_xml(doc, 'DCIM_PCIeSSDView',
|
||||
uris.DCIM_PCIeSSDView,
|
||||
find_all=True)
|
||||
pcie_disks = [self._parse_drac_physical_disk(disk,
|
||||
uris.DCIM_PCIeSSDView) for disk in drac_pcie_disks]
|
||||
|
||||
return physical_disks + pcie_disks
|
||||
|
||||
def _parse_drac_physical_disk(self,
|
||||
drac_disk,
|
||||
uri=uris.DCIM_PhysicalDiskView):
|
||||
fqdd = self._get_physical_disk_attr(drac_disk, 'FQDD', uri)
|
||||
size_b = self._get_physical_disk_attr(drac_disk, 'SizeInBytes', uri)
|
||||
|
||||
def _parse_drac_physical_disk(self, drac_disk):
|
||||
fqdd = self._get_physical_disk_attr(drac_disk, 'FQDD')
|
||||
size_b = self._get_physical_disk_attr(drac_disk, 'SizeInBytes')
|
||||
free_size_b = self._get_physical_disk_attr(drac_disk,
|
||||
'FreeSizeInBytes')
|
||||
drac_status = self._get_physical_disk_attr(drac_disk, 'PrimaryStatus')
|
||||
'FreeSizeInBytes', uri)
|
||||
if free_size_b is not None:
|
||||
free_size_mb = int(free_size_b) // 2 ** 20
|
||||
else:
|
||||
free_size_mb = None
|
||||
|
||||
drac_status = self._get_physical_disk_attr(drac_disk, 'PrimaryStatus',
|
||||
uri)
|
||||
drac_raid_status = self._get_physical_disk_attr(drac_disk,
|
||||
'RaidStatus')
|
||||
drac_media_type = self._get_physical_disk_attr(drac_disk, 'MediaType')
|
||||
'RaidStatus', uri)
|
||||
if drac_raid_status is not None:
|
||||
raid_status = DISK_RAID_STATUS[drac_raid_status]
|
||||
else:
|
||||
raid_status = None
|
||||
drac_media_type = self._get_physical_disk_attr(drac_disk, 'MediaType',
|
||||
uri)
|
||||
drac_bus_protocol = self._get_physical_disk_attr(drac_disk,
|
||||
'BusProtocol')
|
||||
'BusProtocol', uri)
|
||||
|
||||
return PhysicalDisk(
|
||||
id=fqdd,
|
||||
description=self._get_physical_disk_attr(drac_disk,
|
||||
'DeviceDescription'),
|
||||
'DeviceDescription',
|
||||
uri),
|
||||
controller=fqdd.split(':')[-1],
|
||||
manufacturer=self._get_physical_disk_attr(drac_disk,
|
||||
'Manufacturer'),
|
||||
model=self._get_physical_disk_attr(drac_disk, 'Model'),
|
||||
'Manufacturer', uri),
|
||||
model=self._get_physical_disk_attr(drac_disk, 'Model', uri),
|
||||
media_type=PHYSICAL_DISK_MEDIA_TYPE[drac_media_type],
|
||||
interface_type=PHYSICAL_DISK_BUS_PROTOCOL[drac_bus_protocol],
|
||||
size_mb=int(size_b) / 2 ** 20,
|
||||
free_size_mb=int(free_size_b) / 2 ** 20,
|
||||
size_mb=int(size_b) // 2 ** 20,
|
||||
free_size_mb=free_size_mb,
|
||||
serial_number=self._get_physical_disk_attr(drac_disk,
|
||||
'SerialNumber'),
|
||||
'SerialNumber', uri),
|
||||
firmware_version=self._get_physical_disk_attr(drac_disk,
|
||||
'Revision'),
|
||||
'Revision', uri),
|
||||
status=constants.PRIMARY_STATUS[drac_status],
|
||||
raid_status=DISK_RAID_STATUS[drac_raid_status],
|
||||
sas_address=self._get_physical_disk_attr(drac_disk, 'SASAddress'))
|
||||
raid_status=raid_status,
|
||||
sas_address=self._get_physical_disk_attr(drac_disk, 'SASAddress',
|
||||
uri, allow_missing=True),
|
||||
device_protocol=self._get_physical_disk_attr(drac_disk,
|
||||
'DeviceProtocol',
|
||||
uri,
|
||||
allow_missing=True))
|
||||
|
||||
def _get_physical_disk_attr(self, drac_disk, attr_name):
|
||||
def _get_physical_disk_attr(self, drac_disk, attr_name, uri,
|
||||
allow_missing=False):
|
||||
return utils.get_wsman_resource_attr(
|
||||
drac_disk, uris.DCIM_PhysicalDiskView, attr_name, nullable=True)
|
||||
drac_disk, uri, attr_name, nullable=True,
|
||||
allow_missing=allow_missing)
|
||||
|
||||
def convert_physical_disks(self, physical_disks, raid_enable):
|
||||
"""Converts a list of physical disks into or out of RAID mode.
|
||||
|
|
|
@ -73,6 +73,9 @@ DCIM_MemoryView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
|
|||
DCIM_NICView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
|
||||
'DCIM_NICView')
|
||||
|
||||
DCIM_PCIeSSDView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
|
||||
'DCIM_PCIeSSDView')
|
||||
|
||||
DCIM_PhysicalDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/'
|
||||
'DCIM_PhysicalDiskView')
|
||||
|
||||
|
|
|
@ -105,7 +105,8 @@ class ClientRAIDManagementTestCase(base.BaseTest):
|
|||
firmware_version='LS0A',
|
||||
status='ok',
|
||||
raid_status='ready',
|
||||
sas_address='5000C5007764F409')
|
||||
sas_address='5000C5007764F409',
|
||||
device_protocol=None)
|
||||
|
||||
mock_requests.post(
|
||||
'https://1.2.3.4:443/wsman',
|
||||
|
@ -134,7 +135,37 @@ class ClientRAIDManagementTestCase(base.BaseTest):
|
|||
firmware_version='LS0B',
|
||||
status='ok',
|
||||
raid_status='ready',
|
||||
sas_address='5000C5007764F409')
|
||||
sas_address='5000C5007764F409',
|
||||
device_protocol=None)
|
||||
|
||||
mock_requests.post(
|
||||
'https://1.2.3.4:443/wsman',
|
||||
text=test_utils.RAIDEnumerations[uris.DCIM_PhysicalDiskView]['ok'])
|
||||
|
||||
self.assertIn(expected_physical_disk,
|
||||
self.drac_client.list_physical_disks())
|
||||
|
||||
@mock.patch.object(dracclient.client.WSManClient,
|
||||
'wait_until_idrac_is_ready', spec_set=True,
|
||||
autospec=True)
|
||||
def test_list_physical_disks_nvme(self, mock_requests,
|
||||
mock_wait_until_idrac_is_ready):
|
||||
expected_physical_disk = raid.PhysicalDisk(
|
||||
id='Disk.Bay.20:Enclosure.Internal.0-1:PCIeExtender.Slot.1',
|
||||
description='PCIe SSD in Slot 20 in Bay 1',
|
||||
controller='PCIeExtender.Slot.1',
|
||||
manufacturer='SAMSUNG',
|
||||
model='Dell Express Flash PM1725a 800GB SFF',
|
||||
media_type='ssd',
|
||||
interface_type='pcie',
|
||||
size_mb=763097,
|
||||
free_size_mb=None,
|
||||
serial_number='S39YNX0JB02343',
|
||||
firmware_version='1.0.4',
|
||||
status='unknown',
|
||||
raid_status=None,
|
||||
sas_address=None,
|
||||
device_protocol='NVMe-MI1.0')
|
||||
|
||||
mock_requests.post(
|
||||
'https://1.2.3.4:443/wsman',
|
||||
|
|
|
@ -2,7 +2,9 @@
|
|||
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_PhysicalDiskView">
|
||||
xmlns:n1="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_PhysicalDiskView"
|
||||
xmlns:n2="http://schemas.dell.com/wbem/wscim/1/cim-schema/2/DCIM_PCIeSSDView"
|
||||
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>
|
||||
|
@ -123,6 +125,33 @@
|
|||
<n1:T10PICapability>0</n1:T10PICapability>
|
||||
<n1:UsedSizeInBytes>0</n1:UsedSizeInBytes>
|
||||
</n1:DCIM_PhysicalDiskView>
|
||||
<n2:DCIM_PCIeSSDView>
|
||||
<n2:BusProtocol>7</n2:BusProtocol>
|
||||
<n2:DeviceDescription>PCIe SSD in Slot 20 in Bay 1</n2:DeviceDescription>
|
||||
<n2:DeviceProtocol>NVMe-MI1.0</n2:DeviceProtocol>
|
||||
<n2:DriveFormFactor>2</n2:DriveFormFactor>
|
||||
<n2:FQDD>Disk.Bay.20:Enclosure.Internal.0-1:PCIeExtender.Slot.1</n2:FQDD>
|
||||
<n2:FailurePredicted>NO</n2:FailurePredicted>
|
||||
<n2:FreeSizeInBytes xsi:nil="true"/>
|
||||
<n2:HotSpareStatus xsi:nil="true"/>
|
||||
<n2:InstanceID>Disk.Bay.20:Enclosure.Internal.0-1:PCIeExtender.Slot.1</n2:InstanceID>
|
||||
<n2:Manufacturer>SAMSUNG</n2:Manufacturer>
|
||||
<n2:MaximumCapableSpeed>8 GT/s</n2:MaximumCapableSpeed>
|
||||
<n2:MediaType>1</n2:MediaType>
|
||||
<n2:Model>Dell Express Flash PM1725a 800GB SFF </n2:Model>
|
||||
<n2:NegotiatedSpeed>8 GT/s</n2:NegotiatedSpeed>
|
||||
<n2:PCIeCapableLinkWidth>x4</n2:PCIeCapableLinkWidth>
|
||||
<n2:PCIeNegotiatedLinkWidth>x4</n2:PCIeNegotiatedLinkWidth>
|
||||
<n2:PrimaryStatus>0</n2:PrimaryStatus>
|
||||
<n2:ProductID>a822</n2:ProductID>
|
||||
<n2:RAIDType>0</n2:RAIDType>
|
||||
<n2:RaidStatus xsi:nil="true"/>
|
||||
<n2:RemainingRatedWriteEndurance>100</n2:RemainingRatedWriteEndurance>
|
||||
<n2:Revision>1.0.4 </n2:Revision>
|
||||
<n2:SerialNumber>S39YNX0JB02343</n2:SerialNumber>
|
||||
<n2:SizeInBytes>800166076416</n2:SizeInBytes>
|
||||
<n2:State>1</n2:State>
|
||||
</n2:DCIM_PCIeSSDView>
|
||||
</wsman:Items>
|
||||
<wsen:EnumerationContext/>
|
||||
<wsman:EndOfSequence/>
|
||||
|
|
Loading…
Reference in New Issue