Merge ~ltrager/maas:lp1910473 into maas:master

Proposed by Lee Trager
Status: Merged
Approved by: Adam Collard
Approved revision: b2e1da41c90501ef5322075e490ecc5f5f58880a
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ltrager/maas:lp1910473
Merge into: maas:master
Diff against target: 88 lines (+37/-11)
2 files modified
src/metadataserver/builtin_scripts/hooks.py (+5/-3)
src/metadataserver/builtin_scripts/tests/test_hooks.py (+32/-8)
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
MAAS Lander Approve
Review via email: mp+395878@code.launchpad.net

Commit message

LP: #1910473 - Don't assume NUMA nodes maintain linear continuity.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1910473 lp:~ltrager/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: b2e1da41c90501ef5322075e490ecc5f5f58880a

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/builtin_scripts/hooks.py b/src/metadataserver/builtin_scripts/hooks.py
2index 6840288..d3ec6b0 100644
3--- a/src/metadataserver/builtin_scripts/hooks.py
4+++ b/src/metadataserver/builtin_scripts/hooks.py
5@@ -652,8 +652,10 @@ def _process_lxd_resources(node, data):
6 node.memory, hugepages_size, numa_nodes_info = _parse_memory(
7 resources.get("memory", {}), numa_nodes
8 )
9- # Create or update NUMA nodes.
10- numa_nodes = []
11+ # Create or update NUMA nodes. This must be kept as a dictionary as not all
12+ # systems maintain linear continuity. e.g the PPC64 machine in our CI uses
13+ # 0, 1, 16, 17.
14+ numa_nodes = {}
15 for numa_index, numa_data in numa_nodes_info.items():
16 numa_node, _ = NUMANode.objects.update_or_create(
17 node=node,
18@@ -666,7 +668,7 @@ def _process_lxd_resources(node, data):
19 page_size=hugepages_size,
20 defaults={"total": numa_data.hugepages},
21 )
22- numa_nodes.append(numa_node)
23+ numa_nodes[numa_index] = numa_node
24
25 # Network interfaces
26 # LP: #1849355 -- Don't update the node network information
27diff --git a/src/metadataserver/builtin_scripts/tests/test_hooks.py b/src/metadataserver/builtin_scripts/tests/test_hooks.py
28index e991837..34df4f8 100644
29--- a/src/metadataserver/builtin_scripts/tests/test_hooks.py
30+++ b/src/metadataserver/builtin_scripts/tests/test_hooks.py
31@@ -398,18 +398,19 @@ def make_lxd_host_info(
32 }
33
34
35-def make_lxd_pcie_device():
36- return {
37- "driver": factory.make_name("driver"),
38- "driver_version": factory.make_name("driver-version"),
39- "numa_node": 0,
40- "pci_address": "%s:%s:%s.%s"
41- % (
42+def make_lxd_pcie_device(numa_node=0, pci_address=None):
43+ if pci_address is None:
44+ pci_address = "%s:%s:%s.%s" % (
45 factory.make_hex_string(size=4),
46 factory.make_hex_string(size=2),
47 factory.make_hex_string(size=2),
48 factory.make_hex_string(size=1),
49- ),
50+ )
51+ return {
52+ "driver": factory.make_name("driver"),
53+ "driver_version": factory.make_name("driver-version"),
54+ "numa_node": numa_node,
55+ "pci_address": pci_address,
56 "product": factory.make_name("product"),
57 "product_id": factory.make_hex_string(size=4),
58 "vendor": factory.make_name("vendor"),
59@@ -1755,6 +1756,29 @@ class TestProcessLXDResults(MAASServerTestCase):
60 },
61 )
62
63+ def test_allows_devices_on_sparse_numa_nodes(self):
64+ node = factory.make_Node()
65+ lxd_output = make_lxd_output()
66+ pci_address = lxd_output["resources"]["network"]["cards"][-1][
67+ "pci_address"
68+ ]
69+ lxd_output["resources"]["cpu"]["sockets"][-1]["cores"][-1]["threads"][
70+ -1
71+ ]["numa_node"] = 16
72+ lxd_output["resources"]["network"]["cards"][-1]["numa_node"] = 16
73+ lxd_output["resources"]["pci"] = {
74+ "devices": [
75+ make_lxd_pcie_device(numa_node=16, pci_address=pci_address)
76+ ],
77+ "total": 1,
78+ }
79+
80+ process_lxd_results(node, json.dumps(lxd_output).encode(), 0)
81+ node_device = node.node_devices.get(pci_address=pci_address)
82+
83+ self.assertEquals(16, node_device.numa_node.index)
84+ self.assertEquals(16, node_device.physical_interface.numa_node.index)
85+
86 def test_updates_interfaces_speed(self):
87 node = factory.make_Node()
88 iface = factory.make_Interface(

Subscribers

People subscribed via source and target branches