package org.ovirt.engine.core.vdsbroker.vdsbroker; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.ovirt.engine.core.common.businessentities.NumaTuneMode; import org.ovirt.engine.core.common.businessentities.VdsNumaNode; import org.ovirt.engine.core.common.businessentities.VmNumaNode; import org.ovirt.engine.core.utils.NumaUtils; public class NumaSettingFactory { public static List<Map<String, Object>> buildVmNumaNodeSetting(List<VmNumaNode> vmNumaNodes) { List<Map<String, Object>> createVmNumaNodes = new ArrayList<>(); for (VmNumaNode node : vmNumaNodes) { Map<String, Object> createVmNumaNode = new HashMap<>(); createVmNumaNode.put(VdsProperties.NUMA_NODE_CPU_LIST, NumaUtils.buildStringFromListForNuma(node.getCpuIds())); createVmNumaNode.put(VdsProperties.VM_NUMA_NODE_MEM, String.valueOf(node.getMemTotal())); createVmNumaNode.put(VdsProperties.NUMA_NODE_INDEX, node.getIndex()); createVmNumaNodes.add(createVmNumaNode); } return createVmNumaNodes; } public static Map<String, Object> buildCpuPinningWithNumaSetting(List<VmNumaNode> vmNodes, List<VdsNumaNode> vdsNodes) { Map<Integer, List<Integer>> vdsNumaNodeCpus = new HashMap<>(); Map<String, Object> cpuPinDict = new HashMap<>(); for (VdsNumaNode node : vdsNodes) { vdsNumaNodeCpus.put(node.getIndex(), node.getCpuIds()); } for (VmNumaNode node : vmNodes) { List<Integer> pinnedNodeIndexes = node.getVdsNumaNodeList(); if (!pinnedNodeIndexes.isEmpty()) { Set<Integer> totalPinnedVdsCpus = new LinkedHashSet<>(); for (Integer pinnedVdsNode : pinnedNodeIndexes) { totalPinnedVdsCpus.addAll(vdsNumaNodeCpus.getOrDefault(pinnedVdsNode, Collections.emptyList())); } for (Integer vCpu : node.getCpuIds()) { cpuPinDict.put(String.valueOf(vCpu), NumaUtils.buildStringFromListForNuma(totalPinnedVdsCpus)); } } } return cpuPinDict; } public static Map<String, Object> buildVmNumatuneSetting( NumaTuneMode numaTuneMode, List<VmNumaNode> vmNumaNodes) { List<Map<String, String>> memNodeList = new ArrayList<>(); for (VmNumaNode node : vmNumaNodes) { if (node.getVdsNumaNodeList().isEmpty()) { continue; } Map<String, String> memNode = new HashMap<>(); memNode.put(VdsProperties.NUMA_TUNE_VM_NODE_INDEX, String.valueOf(node.getIndex())); memNode.put(VdsProperties.NUMA_TUNE_NODESET, NumaUtils.buildStringFromListForNuma(node.getVdsNumaNodeList())); memNodeList.add(memNode); } // If no node is pinned, leave pinning implicit if (memNodeList.isEmpty()) { return Collections.emptyMap(); } Map<String, Object> createNumaTune = new HashMap<>(); createNumaTune.put(VdsProperties.NUMA_TUNE_MEMNODES, memNodeList); createNumaTune.put(VdsProperties.NUMA_TUNE_MODE, numaTuneMode.getValue()); return createNumaTune; } }