diff --git a/dracclient/client.py b/dracclient/client.py index 48d10f8..b01dc24 100644 --- a/dracclient/client.py +++ b/dracclient/client.py @@ -1021,6 +1021,17 @@ class DRACClient(object): """ return self._inventory_mgmt.list_cpus() + def list_video_controllers(self): + """Returns the list of video controllers + + :returns: a list of Video objects + :raises: WSManRequestFailure on request failures + :raises: WSManInvalidResponse when receiving invalid response + :raises: DRACOperationFailed on error reported back by the DRAC + interface + """ + return self._inventory_mgmt.list_video_controllers() + def list_memory(self): """Returns a list of memory modules diff --git a/dracclient/resources/inventory.py b/dracclient/resources/inventory.py index b29452a..3e9ac40 100644 --- a/dracclient/resources/inventory.py +++ b/dracclient/resources/inventory.py @@ -57,6 +57,11 @@ NIC = collections.namedtuple( 'NIC', ['id', 'mac', 'model', 'speed_mbps', 'duplex', 'media_type']) +Video = collections.namedtuple( + 'Video', + ['id', 'description', 'function_number', 'manufacturer', 'pci_device_id', + 'pci_vendor_id', 'pci_subdevice_id', 'pci_subvendor_id']) + System = collections.namedtuple( 'System', ['id', 'lcc_version', 'model', 'service_tag', 'uuid']) @@ -188,6 +193,43 @@ class InventoryManagement(object): return utils.get_wsman_resource_attr(drac_nic, uris.DCIM_NICView, attr_name) + def list_video_controllers(self): + """Returns the list of video controllers + + :returns: a list of Video objects + :raises: WSManRequestFailure on request failures + :raises: WSManInvalidResponse when receiving invalid response + :raises: DRACOperationFailed on error reported back by the DRAC + """ + + doc = self.client.enumerate(uris.DCIM_VideoView) + + controllers = utils.find_xml(doc, 'DCIM_VideoView', + uris.DCIM_VideoView, + find_all=True) + + return [self._parse_video_controllers(controller) + for controller in controllers] + + def _parse_video_controllers(self, controller): + return Video( + id=self._get_video_attr(controller, 'FQDD'), + description=self._get_video_attr(controller, 'Description'), + function_number=int(self._get_video_attr(controller, + 'FunctionNumber')), + manufacturer=self._get_video_attr(controller, 'Manufacturer'), + pci_device_id=self._get_video_attr(controller, 'PCIDeviceID'), + pci_vendor_id=self._get_video_attr(controller, 'PCIVendorID'), + pci_subdevice_id=self._get_video_attr(controller, + 'PCISubDeviceID'), + pci_subvendor_id=self._get_video_attr(controller, + 'PCISubVendorID')) + + def _get_video_attr(self, controller, attr_name, allow_missing=False): + return utils.get_wsman_resource_attr( + controller, uris.DCIM_VideoView, attr_name, + allow_missing=allow_missing) + def get_system(self): """Returns a System object diff --git a/dracclient/resources/uris.py b/dracclient/resources/uris.py index 218d85d..91830af 100644 --- a/dracclient/resources/uris.py +++ b/dracclient/resources/uris.py @@ -119,5 +119,8 @@ DCIM_SystemString = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' DCIM_SystemView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' 'DCIM_SystemView') +DCIM_VideoView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' + 'DCIM_VideoView') + DCIM_VirtualDiskView = ('http://schemas.dell.com/wbem/wscim/1/cim-schema/2/' 'DCIM_VirtualDiskView') diff --git a/dracclient/tests/test_inventory.py b/dracclient/tests/test_inventory.py index ecd6a40..d549949 100644 --- a/dracclient/tests/test_inventory.py +++ b/dracclient/tests/test_inventory.py @@ -132,6 +132,36 @@ class ClientInventoryManagementTestCase(base.BaseTest): expected_nics, self.drac_client.list_nics()) + def test_list_video_controllers(self, mock_requests, + mock_wait_until_idrac_is_ready): + expected_video_controllers = [ + inventory.Video( + id='Video.Embedded.1-1', + description='Integrated Matrox G200eW3 Graphics Controller', + function_number=0, + manufacturer='Matrox Electronics Systems Ltd.', + pci_device_id='0536', + pci_vendor_id='102B', + pci_subdevice_id='0737', + pci_subvendor_id='1028'), + inventory.Video( + id='Video.Slot.7-1', + description='TU104GL [Tesla T4]', + function_number=0, + manufacturer='NVIDIA Corporation', + pci_device_id='1EB8', + pci_vendor_id='10DE', + pci_subdevice_id='12A2', + pci_subvendor_id='10DE')] + + mock_requests.post( + 'https://1.2.3.4:443/wsman', + text=test_utils.InventoryEnumerations[uris.DCIM_VideoView]['ok']) + + self.assertEqual( + expected_video_controllers, + self.drac_client.list_video_controllers()) + def test_get_system(self, mock_requests, mock_wait_until_idrac_is_ready): expected_system = inventory.System( id='System.Embedded.1', diff --git a/dracclient/tests/utils.py b/dracclient/tests/utils.py index 4e4ee11..0545f93 100644 --- a/dracclient/tests/utils.py +++ b/dracclient/tests/utils.py @@ -109,6 +109,9 @@ InventoryEnumerations = { }, uris.DCIM_NICView: { 'ok': load_wsman_xml('nic_view-enum-ok') + }, + uris.DCIM_VideoView: { + 'ok': load_wsman_xml('video_view-enum-ok'), } } diff --git a/dracclient/tests/wsman_mocks/video_view-enum-ok.xml b/dracclient/tests/wsman_mocks/video_view-enum-ok.xml new file mode 100644 index 0000000..5ded7fc --- /dev/null +++ b/dracclient/tests/wsman_mocks/video_view-enum-ok.xml @@ -0,0 +1,58 @@ + + + http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous + http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponse + uuid:dd7ea19a-8633-4fa4-a43a-66ae8220f689 + uuid:247e710c-29de-19de-93c9-f148d4fe83b0 + + + + + + 3 + 0002 + Integrated Matrox G200eW3 Graphics Controller + Embedded Video Controller 1 + 0 + Video.Embedded.1-1 + 0 + Video.Embedded.1-1 + 20200811163707.000000+000 + 20200520203243.000000+000 + Matrox Electronics Systems Ltd. + 0536 + 0737 + 1028 + 102B + 0002 + 0002 + + + 135 + 000B + TU104GL [Tesla T4] + Video Controller in Slot 7 + 0 + Video.Slot.7-1 + 0 + Video.Slot.7-1 + 20200811163707.000000+000 + 20200710054947.000000+000 + NVIDIA Corporation + 1EB8 + 12A2 + 10DE + 10DE + 0004 + 00B6 + + + + + + +