summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-05-30 21:50:29 +0000
committerGerrit Code Review <review@openstack.org>2019-05-30 21:50:29 +0000
commit78ba0d1c30776607c1563bae847c062622ff12b7 (patch)
tree589faf349b570e0b1300bbade96596231381cb9d
parent4f03661f6878c1e5103683fa496202b166b3cf08 (diff)
parent8fc63adaf87d76928530efa95864d519f827a297 (diff)
downloadironic-python-agent-78ba0d1c30776607c1563bae847c062622ff12b7.tar.gz
Merge "Ironic python agent does not extract correct available memory" into stable/rocky3.3.2
-rw-r--r--ironic_python_agent/hardware.py15
-rw-r--r--ironic_python_agent/tests/unit/test_hardware.py222
-rw-r--r--releasenotes/notes/get-physical-memory-535a32362bcdf83a.yaml6
3 files changed, 231 insertions, 12 deletions
diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py
index 95078da6..87f05f9c 100644
--- a/ironic_python_agent/hardware.py
+++ b/ironic_python_agent/hardware.py
@@ -17,6 +17,7 @@ import binascii
import functools
import json
import os
+import re
import shlex
import time
@@ -46,7 +47,7 @@ WARN_BIOSDEVNAME_NOT_FOUND = False
UNIT_CONVERTER = pint.UnitRegistry(filename=None)
UNIT_CONVERTER.define('bytes = []')
UNIT_CONVERTER.define('MB = 1048576 bytes')
-
+_MEMORY_ID_RE = re.compile(r'^memory(:\d+)?$')
NODE = None
@@ -706,11 +707,13 @@ class GenericHardwareManager(HardwareManager):
for sys_child in sys_dict['children']:
if sys_child['id'] == 'core':
for core_child in sys_child['children']:
- if core_child['id'] == 'memory':
- if core_child.get('size'):
- value = "%(size)s %(units)s" % core_child
- physical += int(UNIT_CONVERTER(value).to(
- 'MB').magnitude)
+ if _MEMORY_ID_RE.match(core_child['id']):
+ for bank in core_child.get('children', ()):
+ if bank.get('size'):
+ value = ("%(size)s %(units)s" % bank)
+ physical += int(UNIT_CONVERTER(value).to
+ ('MB').magnitude)
+
if not physical:
LOG.warning('Did not find any physical RAM')
diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py
index 6bdae998..22f9211e 100644
--- a/ironic_python_agent/tests/unit/test_hardware.py
+++ b/ironic_python_agent/tests/unit/test_hardware.py
@@ -240,7 +240,7 @@ CPUINFO_FLAGS_OUTPUT = """
flags : fpu vme de pse
"""
-LSHW_JSON_OUTPUT = ("""
+LSHW_JSON_OUTPUT_V1 = ("""
{
"id": "fuzzypickles",
"product": "ABC123 (GENERIC_SERVER)",
@@ -349,6 +349,194 @@ LSHW_JSON_OUTPUT = ("""
}
""", "")
+LSHW_JSON_OUTPUT_V2 = ("""
+{
+ "id" : "bumblebee",
+ "class" : "system",
+ "claimed" : true,
+ "handle" : "DMI:0001",
+ "description" : "Rack Mount Chassis",
+ "product" : "ABCD",
+ "vendor" : "ABCD",
+ "version" : "1234",
+ "serial" : "1234",
+ "width" : 64,
+ "configuration" : {
+ "boot" : "normal",
+ "chassis" : "rackmount",
+ "family" : "Intel Grantley EP",
+ "sku" : "NULL",
+ "uuid" : "00010002-0003-0004-0005-000600070008"
+ },
+ "capabilities" : {
+ "smbios-2.8" : "SMBIOS version 2.8",
+ "dmi-2.7" : "DMI version 2.7",
+ "vsyscall32" : "32-bit processes"
+ },
+ "children" : [
+ {
+ "id" : "core",
+ "class" : "bus",
+ "claimed" : true,
+ "handle" : "DMI:0002",
+ "description" : "Motherboard",
+ "product" : "ABCD",
+ "vendor" : "ABCD",
+ "physid" : "0",
+ "version" : "1234",
+ "serial" : "1234",
+ "slot" : "NULL",
+ "children" : [
+ {
+ "id" : "memory:0",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:004A",
+ "description" : "System Memory",
+ "physid" : "4a",
+ "slot" : "System board or motherboard",
+ "children" : [
+ {
+ "id" : "bank:0",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:004C",
+ "description" : "DIMM Synchronous 2133 MHz (0.5 ns)",
+ "product" : "36ASF2G72PZ-2G1A2",
+ "vendor" : "Micron",
+ "physid" : "0",
+ "serial" : "101B6543",
+ "slot" : "DIMM_A0",
+ "units" : "bytes",
+ "size" : 17179869184,
+ "width" : 64,
+ "clock" : 2133000000
+ },
+ {
+ "id" : "bank:1",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:004E",
+ "description" : "DIMM Synchronous [empty]",
+ "product" : "NO DIMM",
+ "vendor" : "NO DIMM",
+ "physid" : "1",
+ "serial" : "NO DIMM",
+ "slot" : "DIMM_A1"
+ },
+ {
+ "id" : "bank:2",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:004F",
+ "description" : "DIMM Synchronous 2133 MHz (0.5 ns)",
+ "product" : "36ASF2G72PZ-2G1A2",
+ "vendor" : "Micron",
+ "physid" : "2",
+ "serial" : "101B654E",
+ "slot" : "DIMM_A2",
+ "units" : "bytes",
+ "size" : 17179869184,
+ "width" : 64,
+ "clock" : 2133000000
+ },
+ {
+ "id" : "bank:3",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0051",
+ "description" : "DIMM Synchronous [empty]",
+ "product" : "NO DIMM",
+ "vendor" : "NO DIMM",
+ "physid" : "3",
+ "serial" : "NO DIMM",
+ "slot" : "DIMM_A3"
+ }
+ ]
+ },
+ {
+ "id" : "memory:1",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0052",
+ "description" : "System Memory",
+ "physid" : "52",
+ "slot" : "System board or motherboard",
+ "children" : [
+ {
+ "id" : "bank:0",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0054",
+ "description" : "DIMM Synchronous 2133 MHz (0.5 ns)",
+ "product" : "36ASF2G72PZ-2G1A2",
+ "vendor" : "Micron",
+ "physid" : "0",
+ "serial" : "101B6545",
+ "slot" : "DIMM_A4",
+ "units" : "bytes",
+ "size" : 17179869184,
+ "width" : 64,
+ "clock" : 2133000000
+ },
+ {
+ "id" : "bank:1",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0056",
+ "description" : "DIMM Synchronous [empty]",
+ "product" : "NO DIMM",
+ "vendor" : "NO DIMM",
+ "physid" : "1",
+ "serial" : "NO DIMM",
+ "slot" : "DIMM_A5"
+ },
+ {
+ "id" : "bank:2",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0057",
+ "description" : "DIMM Synchronous 2133 MHz (0.5 ns)",
+ "product" : "36ASF2G72PZ-2G1A2",
+ "vendor" : "Micron",
+ "physid" : "2",
+ "serial" : "101B6540",
+ "slot" : "DIMM_A6",
+ "units" : "bytes",
+ "size" : 17179869184,
+ "width" : 64,
+ "clock" : 2133000000
+ },
+ {
+ "id" : "bank:3",
+ "class" : "memory",
+ "claimed" : true,
+ "handle" : "DMI:0059",
+ "description" : "DIMM Synchronous [empty]",
+ "product" : "NO DIMM",
+ "vendor" : "NO DIMM",
+ "physid" : "3",
+ "serial" : "NO DIMM",
+ "slot" : "DIMM_A7"
+ }
+ ]
+ },
+ {
+ "id" : "memory:4",
+ "class" : "memory",
+ "physid" : "1"
+ },
+ {
+ "id" : "memory:5",
+ "class" : "memory",
+ "physid" : "2"
+ }
+ ]
+ }
+ ]
+}
+""", "")
+
SMARTCTL_NORMAL_OUTPUT = ("""
smartctl 6.2 2017-02-27 r4394 [x86_64-linux-3.10.0-693.21.1.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
@@ -1020,9 +1208,9 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('psutil.virtual_memory', autospec=True)
@mock.patch.object(utils, 'execute', autospec=True)
- def test_get_memory_psutil(self, mocked_execute, mocked_psutil):
+ def test_get_memory_psutil_v1(self, mocked_execute, mocked_psutil):
mocked_psutil.return_value.total = 3952 * 1024 * 1024
- mocked_execute.return_value = LSHW_JSON_OUTPUT
+ mocked_execute.return_value = LSHW_JSON_OUTPUT_V1
mem = self.hardware.get_memory()
self.assertEqual(3952 * 1024 * 1024, mem.total)
@@ -1030,8 +1218,19 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('psutil.virtual_memory', autospec=True)
@mock.patch.object(utils, 'execute', autospec=True)
- def test_get_memory_psutil_exception(self, mocked_execute, mocked_psutil):
- mocked_execute.return_value = LSHW_JSON_OUTPUT
+ def test_get_memory_psutil_v2(self, mocked_execute, mocked_psutil):
+ mocked_psutil.return_value.total = 3952 * 1024 * 1024
+ mocked_execute.return_value = LSHW_JSON_OUTPUT_V2
+ mem = self.hardware.get_memory()
+
+ self.assertEqual(3952 * 1024 * 1024, mem.total)
+ self.assertEqual(65536, mem.physical_mb)
+
+ @mock.patch('psutil.virtual_memory', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
+ def test_get_memory_psutil_exception_v1(self, mocked_execute,
+ mocked_psutil):
+ mocked_execute.return_value = LSHW_JSON_OUTPUT_V1
mocked_psutil.side_effect = AttributeError()
mem = self.hardware.get_memory()
@@ -1040,6 +1239,17 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('psutil.virtual_memory', autospec=True)
@mock.patch.object(utils, 'execute', autospec=True)
+ def test_get_memory_psutil_exception_v2(self, mocked_execute,
+ mocked_psutil):
+ mocked_execute.return_value = LSHW_JSON_OUTPUT_V2
+ mocked_psutil.side_effect = AttributeError()
+ mem = self.hardware.get_memory()
+
+ self.assertIsNone(mem.total)
+ self.assertEqual(65536, mem.physical_mb)
+
+ @mock.patch('psutil.virtual_memory', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_get_memory_lshw_exception(self, mocked_execute, mocked_psutil):
mocked_execute.side_effect = OSError()
mocked_psutil.return_value.total = 3952 * 1024 * 1024
@@ -1951,7 +2161,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch.object(utils, 'execute', autospec=True)
def test_get_system_vendor_info(self, mocked_execute):
- mocked_execute.return_value = LSHW_JSON_OUTPUT
+ mocked_execute.return_value = LSHW_JSON_OUTPUT_V1
vendor_info = self.hardware.get_system_vendor_info()
self.assertEqual('ABC123 (GENERIC_SERVER)', vendor_info.product_name)
self.assertEqual('1234567', vendor_info.serial_number)
diff --git a/releasenotes/notes/get-physical-memory-535a32362bcdf83a.yaml b/releasenotes/notes/get-physical-memory-535a32362bcdf83a.yaml
new file mode 100644
index 00000000..0197f8f2
--- /dev/null
+++ b/releasenotes/notes/get-physical-memory-535a32362bcdf83a.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ Fixes an issue with retrieving all available physical memory.
+ For more details see:
+ `story 2005308 <https://storyboard.openstack.org/#!/story/2005308>`