Merge ~ltrager/maas:lp1878923_lp1878685_2.7 into maas:2.7

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: 7581c7169bef4bb44a3a1fddc60c38bbc5bcd295
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1878923_lp1878685_2.7
Merge into: maas:2.7
Diff against target: 108 lines (+51/-12)
3 files modified
src/machine-resources/src/machine-resources/Gopkg.lock (+7/-2)
src/metadataserver/builtin_scripts/hooks.py (+8/-10)
src/metadataserver/builtin_scripts/tests/test_hooks.py (+36/-0)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
MAAS Lander unittests Pending
Review via email: mp+384287@code.launchpad.net

Commit message

Backport of 894a324 - LP: #1878923, #1878685 - Fix incorrect memory detection.

LXD was only detecting the amount of available memory in user space.
Memory reserved by the kernel was not shown as available. This caused MAAS
to show slightly less RAM then the system actually had.

MAAS was assuming that a NUMA node always had memory assigned to it. When
0 memory was assigned to a node commissioning would raise an exception and
fail.

To post a comment you must log in.
Revision history for this message
Lee Trager (ltrager) wrote :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/machine-resources/src/machine-resources/Gopkg.lock b/src/machine-resources/src/machine-resources/Gopkg.lock
2index a96f98c..3006552 100644
3--- a/src/machine-resources/src/machine-resources/Gopkg.lock
4+++ b/src/machine-resources/src/machine-resources/Gopkg.lock
5@@ -20,10 +20,15 @@
6 version = "0.5.0"
7
8 [[projects]]
9+ name = "github.com/juju/errors"
10+ packages = ["."]
11+ revision = "3fe23663418fc1d724868c84f21b7519bbac7441"
12+
13+[[projects]]
14 branch = "master"
15 name = "github.com/lxc/lxd"
16- packages = ["lxd/resources","shared","shared/api","shared/cancel","shared/ioprogress","shared/logger","shared/units","shared/usbid"]
17- revision = "7b12be0dc6b099dffc369299af2803a77611fc8d"
18+ packages = ["lxd/resources","shared","shared/api","shared/cancel","shared/ioprogress","shared/logger","shared/osarch","shared/units","shared/usbid","shared/version"]
19+ revision = "7516f0a2968b025efd1ea5066e78b16d6646b1c8"
20
21 [[projects]]
22 name = "github.com/mitchellh/go-homedir"
23diff --git a/src/metadataserver/builtin_scripts/hooks.py b/src/metadataserver/builtin_scripts/hooks.py
24index d301090..c0d3b2a 100644
25--- a/src/metadataserver/builtin_scripts/hooks.py
26+++ b/src/metadataserver/builtin_scripts/hooks.py
27@@ -450,7 +450,7 @@ def process_lxd_results(node, output, exit_status):
28 data
29 )
30 # Update memory.
31- node.memory, numa_nodes = _parse_memory(data, numa_nodes)
32+ node.memory, numa_nodes = _parse_memory(data.get("memory", {}), numa_nodes)
33
34 # Create or update NUMA nodes.
35 numa_nodes = [
36@@ -543,18 +543,16 @@ def _parse_cpuinfo(data):
37 return cpu_count, cpu_speed, cpu_model, numa_nodes
38
39
40-def _parse_memory(data, numa_nodes):
41-
42- total_memory = data.get("memory", {}).get("total", 0)
43+def _parse_memory(memory, numa_nodes):
44+ total_memory = memory.get("total", 0)
45 default_numa_node = {"numa_node": 0, "total": total_memory}
46- for memory_node in data.get("memory", {}).get(
47- "nodes", [default_numa_node]
48- ):
49- numa_nodes[memory_node["numa_node"]]["memory"] = (
50- memory_node["total"] / 1024 / 1024
51+
52+ for memory_node in memory.get("nodes", [default_numa_node]):
53+ numa_nodes[memory_node["numa_node"]]["memory"] = int(
54+ memory_node.get("total", 0) / 1024 ** 2
55 )
56
57- return total_memory / 1024 / 1024, numa_nodes
58+ return int(total_memory / 1024 ** 2), numa_nodes
59
60
61 def set_virtual_tag(node, output, exit_status):
62diff --git a/src/metadataserver/builtin_scripts/tests/test_hooks.py b/src/metadataserver/builtin_scripts/tests/test_hooks.py
63index e5f6fa9..423e0e4 100644
64--- a/src/metadataserver/builtin_scripts/tests/test_hooks.py
65+++ b/src/metadataserver/builtin_scripts/tests/test_hooks.py
66@@ -1659,6 +1659,42 @@ class TestProcessLXDResults(MAASServerTestCase):
67 for numa_node in numa_nodes:
68 self.assertEqual(int(total_memory / 1024 / 1024), numa_node.memory)
69
70+ def test__accepts_numa_node_zero_memory(self):
71+ # Regression test for LP:1878923
72+ node = factory.make_Node()
73+ self.patch(hooks_module, "update_node_network_information")
74+ data = deepcopy(SAMPLE_LXD_JSON)
75+ data["memory"] = {
76+ "nodes": [
77+ {
78+ "numa_node": 0,
79+ "hugepages_used": 0,
80+ "hugepages_total": 0,
81+ "used": 1314131968,
82+ "total": 33720463360,
83+ },
84+ {
85+ "numa_node": 1,
86+ "hugepages_used": 0,
87+ "hugepages_total": 0,
88+ "used": 0,
89+ "total": 0,
90+ },
91+ ],
92+ "hugepages_total": 0,
93+ "hugepages_used": 0,
94+ "hugepages_size": 2097152,
95+ "used": 602902528,
96+ "total": 33720463360,
97+ }
98+
99+ process_lxd_results(node, json.dumps(data).encode(), 0)
100+
101+ self.assertEquals(32158, node.memory)
102+ self.assertItemsEqual(
103+ [32158, 0], [numa.memory for numa in node.numanode_set.all()]
104+ )
105+
106 def test__updates_cpu_numa_nodes(self):
107 node = factory.make_Node()
108 self.patch(hooks_module, "update_node_network_information")

Subscribers

People subscribed via source and target branches