From 86759d886b0855fd3febbe25cdc88c49e463c667 Mon Sep 17 00:00:00 2001 From: kesper Date: Tue, 25 Apr 2017 06:43:28 +0000 Subject: [PATCH] Adding capability to check NVDIMM_N availability This commit adds a new capability to check NVDIMM_N availability using the bios parameter on the ProLiant Servers. Change-Id: I91206332562bc5929df06806884811af73738304 --- proliantutils/ilo/ris.py | 17 ++++++++++ proliantutils/tests/ilo/ris_sample_outputs.py | 1 + proliantutils/tests/ilo/test_ris.py | 34 +++++++++++++++++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/proliantutils/ilo/ris.py b/proliantutils/ilo/ris.py index 2f5cf101..784b699f 100755 --- a/proliantutils/ilo/ris.py +++ b/proliantutils/ilo/ris.py @@ -978,6 +978,8 @@ class RISOperations(rest.RestConnectorBase, operations.IloOperations): capabilities.update(self._get_tpm_capability()) if self._get_cpu_virtualization(): capabilities['cpu_vt'] = 'true' + if self._get_nvdimm_n_status(): + capabilities['nvdimm_n'] = 'true' try: self.get_secure_boot_mode() capabilities['secure_boot'] = 'true' @@ -1526,3 +1528,18 @@ class RISOperations(rest.RestConnectorBase, operations.IloOperations): else: vt_status = False return vt_status + + def _get_nvdimm_n_status(self): + """Get status of NVDIMM_N. + + :returns: True if NVDIMM_N is present and enabled, False otherwise. + """ + try: + nvdimm_n_status = self._get_bios_setting('NvDimmNMemFunctionality') + if nvdimm_n_status == 'Enabled': + nvn_status = True + else: + nvn_status = False + except exception.IloCommandNotSupportedError: + nvn_status = False + return nvn_status diff --git a/proliantutils/tests/ilo/ris_sample_outputs.py b/proliantutils/tests/ilo/ris_sample_outputs.py index dae80ee9..1462cc88 100755 --- a/proliantutils/tests/ilo/ris_sample_outputs.py +++ b/proliantutils/tests/ilo/ris_sample_outputs.py @@ -1276,6 +1276,7 @@ GET_BIOS_SETTINGS = """ "NmiDebugButton": "Enabled", "NodeInterleaving": "Disabled", "NumaGroupSizeOpt": "Clustered", + "NvDimmNMemFunctionality": "Enabled", "OldAdminPassword": null, "OldPowerOnPassword": null, "PciBusPadding": "Enabled", diff --git a/proliantutils/tests/ilo/test_ris.py b/proliantutils/tests/ilo/test_ris.py index 828fbc0f..60d8059f 100755 --- a/proliantutils/tests/ilo/test_ris.py +++ b/proliantutils/tests/ilo/test_ris.py @@ -375,6 +375,7 @@ class IloRisTestCase(testtools.TestCase): validate_mock.assert_called_once_with(ris_outputs.GET_HEADERS, settings_uri) + @mock.patch.object(ris.RISOperations, '_get_nvdimm_n_status') @mock.patch.object(ris.RISOperations, '_get_cpu_virtualization') @mock.patch.object(ris.RISOperations, '_get_tpm_capability') @@ -385,7 +386,7 @@ class IloRisTestCase(testtools.TestCase): @mock.patch.object(ris.RISOperations, '_get_host_details') def test_get_server_capabilities(self, get_details_mock, ilo_firm_mock, secure_mock, gpu_mock, tpm_mock, - cpu_vt_mock): + cpu_vt_mock, nvdimm_n_mock): host_details = json.loads(ris_outputs.RESPONSE_BODY_FOR_REST_OP) get_details_mock.return_value = host_details ilo_firm_mock.return_value = {'ilo_firmware_version': 'iLO 4 v2.20'} @@ -393,13 +394,15 @@ class IloRisTestCase(testtools.TestCase): cpu_vt_mock.return_value = True secure_mock.return_value = False tpm_mock.return_value = {'trusted_boot': True} + nvdimm_n_mock.return_value = True expected_caps = {'secure_boot': 'true', 'ilo_firmware_version': 'iLO 4 v2.20', 'rom_firmware_version': u'I36 v1.40 (01/28/2015)', 'server_model': u'ProLiant BL460c Gen9', 'pci_gpu_devices': 2, 'trusted_boot': True, - 'cpu_vt': 'true'} + 'cpu_vt': 'true', + 'nvdimm_n': 'true'} capabilities = self.client.get_server_capabilities() self.assertEqual(expected_caps, capabilities) @@ -1820,3 +1823,30 @@ class TestRISOperationsPrivateMethods(testtools.TestCase): expected_out = {'trusted_boot': False} status = self.client._get_tpm_capability() self.assertEqual(expected_out, status) + + @mock.patch.object(ris.RISOperations, '_get_bios_setting') + def test___get_nvdimm_n_status_enabled(self, bios_mock): + bios_settings = json.loads(ris_outputs.GET_BIOS_SETTINGS) + bios_mock.return_value = bios_settings['NvDimmNMemFunctionality'] + expected_nvdimm_n_status = True + nvdimm_n_status_return = self.client._get_nvdimm_n_status() + self.assertEqual(nvdimm_n_status_return, expected_nvdimm_n_status) + self.assertTrue(bios_mock.called) + + @mock.patch.object(ris.RISOperations, '_get_bios_setting') + def test___get_nvdimm_n_status_disabled(self, bios_mock): + bios_mock.return_value = 'Disabled' + expected_nvdimm_n_status = False + nvdimm_n_status_return = self.client._get_nvdimm_n_status() + self.assertEqual(nvdimm_n_status_return, expected_nvdimm_n_status) + self.assertTrue(bios_mock.called) + + @mock.patch.object(ris.RISOperations, '_get_bios_setting') + def test___get_nvdimm_n_status_not_supported_error(self, bios_mock): + msg = ("BIOS Property 'NvDimmNMemFunctionality' is not supported on" + " this system") + bios_mock.side_effect = exception.IloCommandNotSupportedError(msg) + expected_nvdimm_n_status = False + nvdimm_n_status_return = self.client._get_nvdimm_n_status() + self.assertEqual(nvdimm_n_status_return, expected_nvdimm_n_status) + self.assertTrue(bios_mock.called)