Fix vendor info retrieval for some versions of lshw

There is one more place that relies on lshw json output being a dict,
so let's fix the function that gets the dict rather than places it is
being used in.

Change-Id: Ia1c2c2e6a32c76ac0249e6a46e4cced18d6093a9
Task: 39527
Story: 2007588
(cherry picked from commit 3761a44800)
This commit is contained in:
Vladyslav Drok 2020-11-16 14:51:53 +01:00
parent 8c38177e0e
commit 31e9d0db8c
2 changed files with 14 additions and 5 deletions

View File

@ -97,7 +97,12 @@ def _get_system_lshw_dict():
:return: A python dict from the lshw json output
"""
out, _e = utils.execute('lshw', '-quiet', '-json', log_stdout=False)
return json.loads(out)
out = json.loads(out)
# Depending on lshw version, output might be a list, starting with
# https://github.com/lyonel/lshw/commit/135a853c60582b14c5b67e5cd988a8062d9896f4 # noqa
if isinstance(out, list):
return out[0]
return out
def _udev_settle():
@ -1111,10 +1116,6 @@ class GenericHardwareManager(HardwareManager):
LOG.warning('Could not get real physical RAM from lshw: %s', e)
physical = None
else:
# Depending on lshw version, output might be a list, starting with
# https://github.com/lyonel/lshw/commit/135a853c60582b14c5b67e5cd988a8062d9896f4 # noqa
if isinstance(sys_dict, list):
sys_dict = sys_dict[0]
physical = _calc_memory(sys_dict)
if not physical:

View File

@ -4306,6 +4306,14 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertEqual('1234567', vendor_info.serial_number)
self.assertEqual('GENERIC', vendor_info.manufacturer)
@mock.patch.object(utils, 'execute', autospec=True)
def test_get_system_vendor_info_lshw_list(self, mocked_execute):
mocked_execute.return_value = (f"[{LSHW_JSON_OUTPUT_V2[0]}]", "")
vendor_info = self.hardware.get_system_vendor_info()
self.assertEqual('ABCD', vendor_info.product_name)
self.assertEqual('1234', vendor_info.serial_number)
self.assertEqual('ABCD', vendor_info.manufacturer)
@mock.patch.object(utils, 'execute', autospec=True)
def test_get_system_vendor_info_failure(self, mocked_execute):
mocked_execute.side_effect = processutils.ProcessExecutionError()