diff --git a/dracclient/client.py b/dracclient/client.py index f3ff34f..641063f 100644 --- a/dracclient/client.py +++ b/dracclient/client.py @@ -716,6 +716,15 @@ class DRACClient(object): return self._inventory_mgmt.list_nics() + def get_system(self): + """Return a Systen object. + + :returns: a System object + :raises: WSManRequestFailure on request failures + :raises: WSManInvalidResponse when receiving invalid response + """ + return self._inventory_mgmt.get_system() + def is_idrac_ready(self): """Indicates if the iDRAC is ready to accept commands diff --git a/dracclient/resources/inventory.py b/dracclient/resources/inventory.py index 4ce4eae..5fbea88 100644 --- a/dracclient/resources/inventory.py +++ b/dracclient/resources/inventory.py @@ -57,6 +57,10 @@ NIC = collections.namedtuple( 'NIC', ['id', 'mac', 'model', 'speed_mbps', 'duplex', 'media_type']) +System = collections.namedtuple( + 'System', + ['id', 'lcc_version', 'model', 'service_tag']) + class InventoryManagement(object): @@ -170,3 +174,31 @@ class InventoryManagement(object): def _get_nic_attr(self, drac_nic, attr_name): return utils.get_wsman_resource_attr(drac_nic, uris.DCIM_NICView, attr_name) + + def get_system(self): + """Returns a System object + + :returns: a System object + :raises: WSManRequestFailure on request failures + :raises: WSManInvalidRespons when receiving invalid response + """ + doc = self.client.enumerate(uris.DCIM_SystemView) + drac_system = utils.find_xml(doc, + 'DCIM_SystemView', + uris.DCIM_SystemView, + find_all=False) + + return self._parse_drac_system(drac_system) + + def _parse_drac_system(self, drac_system): + return System( + id=self._get_system_attr(drac_system, 'InstanceID'), + service_tag=self._get_system_attr(drac_system, 'ServiceTag'), + model=self._get_system_attr(drac_system, 'Model'), + lcc_version=self._get_system_attr(drac_system, + 'LifecycleControllerVersion')) + + def _get_system_attr(self, drac_system, attr_name): + return utils.get_wsman_resource_attr(drac_system, + uris.DCIM_SystemView, + attr_name) diff --git a/dracclient/tests/test_inventory.py b/dracclient/tests/test_inventory.py index 27b116c..8b6fa71 100644 --- a/dracclient/tests/test_inventory.py +++ b/dracclient/tests/test_inventory.py @@ -129,3 +129,17 @@ class ClientInventoryManagementTestCase(base.BaseTest): self.assertEqual( expected_nics, self.drac_client.list_nics()) + + def test_get_system(self, mock_requests, mock_wait_until_idrac_is_ready): + expected_system = inventory.System( + id='System.Embedded.1', + service_tag='A1B2C3D', + model='PowerEdge R630', + lcc_version='2.1.0') + mock_requests.post( + 'https://1.2.3.4:443/wsman', + text=test_utils.LifecycleControllerEnumerations[ + uris.DCIM_SystemView]['ok']) + self.assertEqual( + expected_system, + self.drac_client.get_system()) diff --git a/dracclient/tests/wsman_mocks/system_view-enum-ok.xml b/dracclient/tests/wsman_mocks/system_view-enum-ok.xml index ad2d5a5..73db373 100644 --- a/dracclient/tests/wsman_mocks/system_view-enum-ok.xml +++ b/dracclient/tests/wsman_mocks/system_view-enum-ok.xml @@ -15,9 +15,11 @@ System.Embedded.1 2.1.0 + PowerEdge R630 + A1B2C3D - \ No newline at end of file +