diff --git a/orchestration/ansible/roles/inventory-cli/files/inventory-cli b/orchestration/ansible/roles/inventory-cli/files/inventory-cli new file mode 100755 index 0000000..1378df8 Binary files /dev/null and b/orchestration/ansible/roles/inventory-cli/files/inventory-cli differ diff --git a/services/device-inventory/src/client/discovery.cpp b/services/device-inventory/src/client/discovery.cpp index 8483753..86028ea 100644 --- a/services/device-inventory/src/client/discovery.cpp +++ b/services/device-inventory/src/client/discovery.cpp @@ -486,6 +486,9 @@ std::vector Discovery::discover_memory_slots() { } for (auto& b : blocks17) { + // Skip blocks without a Locator — these are malformed/phantom HP firmware entries + if (!b.count("Locator") || b["Locator"].empty()) continue; + DiscoveredPart p; p.type_name = PTYPE_MEMORY_SLOT; @@ -579,8 +582,9 @@ std::vector Discovery::discover_cpus() { DiscoveredPart p; p.type_name = PTYPE_CPU; - if (b.count("ID") && b["ID"] != "Not Specified") - p.kv[K_SERIAL] = b["ID"]; + // Do NOT use dmidecode "ID" (CPUID family/model/stepping) as serial — + // it is identical across matching CPUs in multi-socket systems. + // Socket designation is the actual unique natural key. if (b.count("Version") && b["Version"] != "Not Specified") p.kv[K_NAME] = b["Version"]; if (b.count("Manufacturer") && b["Manufacturer"] != "Not Specified")