diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index e142fdb9e..ecc9fba24 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -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(): @@ -1143,10 +1148,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: diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 060e71b3a..b69c80d14 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -4390,6 +4390,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()