Hello Xiaolei Shi,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/33183

to review the following change.

Change subject: core: need vds id when build vm numa properties
......................................................................

core: need vds id when build vm numa properties

Change-Id: I19be54812d0ebbb54145f33e6b036af84ff1d8ae
Bug-Url: https://bugzilla.redhat.com/1099417
Signed-off-by: Bruce Shi <xiao-lei....@hp.com>
---
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVDSCommand.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactory.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
A 
backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactoryTest.java
6 files changed, 266 insertions(+), 94 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/83/33183/1

diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVDSCommand.java
index 4d60460..6b70e97 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVDSCommand.java
@@ -54,7 +54,7 @@
             // backward compatibility for 3.0
             return new VmOldInfoBuilder(vm, createInfo);
         } else {
-            return new VmInfoBuilder(vm, createInfo);
+            return new VmInfoBuilder(vm, getParameters().getVdsId(), 
createInfo);
         }
     }
 
@@ -79,6 +79,7 @@
         builder.buildVmRngDevice();
         builder.buildUnmanagedDevices();
         builder.buildVmSerialNumber();
+        builder.buildVmNumaProperties();
     }
 
     private static final Log log = LogFactory.getLog(CreateVDSCommand.class);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactory.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactory.java
new file mode 100644
index 0000000..5b3021d
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactory.java
@@ -0,0 +1,78 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+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()));
+            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 = 
NumaUtils.getPinnedNodeIndexList(node.getVdsNumaNodeList());
+            if (!pinnedNodeIndexes.isEmpty()) {
+                Set <Integer> totalPinnedVdsCpus = new LinkedHashSet<>();
+                for (Integer vCpu : node.getCpuIds()) {
+                    for (Integer pinnedVdsNode : pinnedNodeIndexes) {
+                        if (vdsNumaNodeCpus.containsKey(pinnedVdsNode)) {
+                            
totalPinnedVdsCpus.addAll(vdsNumaNodeCpus.get(pinnedVdsNode));
+                        }
+                    }
+                    cpuPinDict.put(String.valueOf(vCpu), 
NumaUtils.buildStringFromListForNuma(totalPinnedVdsCpus));
+                }
+            }
+        }
+        return cpuPinDict;
+    }
+
+    public static Map<String, Object> buildVmNumatuneSetting(
+            NumaTuneMode numaTuneMode, List<VmNumaNode> vmNumaNodes, 
List<VdsNumaNode> totalVdsNumaNodes) {
+        List<Integer> totalVdsNumaNodesIndexes = 
NumaUtils.getNodeIndexList(totalVdsNumaNodes);
+        Map<String, Object> createNumaTune = new HashMap<>(2);
+        Set<Integer> vmNumaNodePinInfo = new HashSet<>();
+        for (VmNumaNode node : vmNumaNodes) {
+            if (!node.getVdsNumaNodeList().isEmpty()) {
+                
vmNumaNodePinInfo.addAll(NumaUtils.getPinnedNodeIndexList(node.getVdsNumaNodeList()));
+            }
+        }
+        if (vmNumaNodePinInfo.isEmpty()) {
+            if (!totalVdsNumaNodesIndexes.isEmpty()) {
+                createNumaTune.put(VdsProperties.NUMA_TUNE_NODESET,
+                        
NumaUtils.buildStringFromListForNuma(totalVdsNumaNodesIndexes));
+            }
+        }
+        else {
+            createNumaTune.put(VdsProperties.NUMA_TUNE_NODESET,
+                    NumaUtils.buildStringFromListForNuma(vmNumaNodePinInfo));
+        }
+        //The two items nodeset and mode should both exist or not
+        if (createNumaTune.containsKey(VdsProperties.NUMA_TUNE_NODESET)) {
+            createNumaTune.put(VdsProperties.NUMA_TUNE_MODE, 
numaTuneMode.getValue());
+        }
+        return createNumaTune;
+    }
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
index fab0aba..5801002 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java
@@ -18,11 +18,14 @@
 import org.ovirt.engine.core.common.businessentities.DisplayType;
 import org.ovirt.engine.core.common.businessentities.Entities;
 import org.ovirt.engine.core.common.businessentities.LunDisk;
+import org.ovirt.engine.core.common.businessentities.NumaTuneMode;
 import org.ovirt.engine.core.common.businessentities.PropagateErrors;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType;
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
+import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmPayload;
 import org.ovirt.engine.core.common.businessentities.VolumeFormat;
 import org.ovirt.engine.core.common.businessentities.network.Network;
@@ -57,9 +60,11 @@
     private final List<Map<String, Object>> devices = new 
ArrayList<Map<String, Object>>();
     private List<VmDevice> managedDevices = null;
     private final boolean hasNonDefaultBootOrder;
+    private Guid vdsId;
 
-    public VmInfoBuilder(VM vm, Map createInfo) {
+    public VmInfoBuilder(VM vm, Guid vdsId, Map createInfo) {
         this.vm = vm;
+        this.vdsId = vdsId;
         this.createInfo = createInfo;
         hasNonDefaultBootOrder = (vm.getBootSequence() != 
vm.getDefaultBootSequence());
         if (hasNonDefaultBootOrder) {
@@ -1117,4 +1122,45 @@
             addDevice(struct, vmDevice, null);
         }
     }
+
+    protected void buildVmNumaProperties() {
+        final String compatibilityVersion = 
vm.getVdsGroupCompatibilityVersion().toString();
+        addNumaSetting(compatibilityVersion);
+    }
+
+    /**
+     * Numa will use the same compatibilityVersion as cpu pinning since
+     * numa may also add cpu pinning configuration and the two features
+     * have almost the same libvirt version support
+     *
+     * @param compatibilityVersion
+     */
+    private void addNumaSetting(final String compatibilityVersion) {
+        if (Boolean.TRUE.equals(Config.<Boolean> 
getValue(ConfigValues.CpuPinningEnabled,
+                        compatibilityVersion))) {
+            NumaTuneMode numaTune = vm.getNumaTuneMode();
+            List<VmNumaNode> vmNumaNodes = 
DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(vm.getId());
+            List<VdsNumaNode> totalVdsNumaNodes = 
DbFacade.getInstance().getVdsNumaNodeDAO()
+                    .getAllVdsNumaNodeByVdsId(vdsId);
+            if (numaTune != null) {
+                Map<String, Object> numaTuneSetting =
+                        NumaSettingFactory.buildVmNumatuneSetting(numaTune, 
vmNumaNodes, totalVdsNumaNodes);
+                if (!numaTuneSetting.isEmpty()) {
+                    createInfo.put(VdsProperties.NUMA_TUNE, numaTuneSetting);
+                }
+            }
+            List<Map<String, Object>> createVmNumaNodes = 
NumaSettingFactory.buildVmNumaNodeSetting(vmNumaNodes);
+            if (!createVmNumaNodes.isEmpty()) {
+                createInfo.put(VdsProperties.VM_NUMA_NODES, createVmNumaNodes);
+            }
+            if (StringUtils.isEmpty(vm.getCpuPinning())) {
+                Map<String, Object> cpuPinDict =
+                        
NumaSettingFactory.buildCpuPinningWithNumaSetting(vmNumaNodes, 
totalVdsNumaNodes);
+                if (!cpuPinDict.isEmpty()) {
+                    createInfo.put(VdsProperties.cpuPinning, cpuPinDict);
+                }
+            }
+        }
+    }
+
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
index f4952f8..ac80bd4 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
@@ -6,11 +6,8 @@
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.TimeZone;
 
 import org.apache.commons.lang.StringUtils;
@@ -18,13 +15,10 @@
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.businessentities.Disk;
 import org.ovirt.engine.core.common.businessentities.DisplayType;
-import org.ovirt.engine.core.common.businessentities.NumaTuneMode;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VM;
-import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmDevice;
 import org.ovirt.engine.core.common.businessentities.VmDeviceId;
-import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import 
org.ovirt.engine.core.common.businessentities.comparators.DiskImageByDiskAliasComparator;
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
@@ -40,7 +34,6 @@
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
-import org.ovirt.engine.core.utils.NumaUtils;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
 
@@ -149,8 +142,6 @@
         createInfo.put(VdsProperties.transparent_huge_pages,
                 vm.isTransparentHugePages() ? "true" : "false");
 
-        addNumaSetting(compatibilityVersion);
-
         if (vm.getDisplayType() == DisplayType.qxl) {
             createInfo.put(VdsProperties.spiceFileTransferEnable,
                 Boolean.toString(vm.isSpiceFileTransferEnabled()));
@@ -186,89 +177,6 @@
             }
             createInfo.put(VdsProperties.cpuPinning, pinDict);
         }
-    }
-
-    /**
-     * Numa will use the same compatibilityVersion as cpu pinning since
-     * numa may also add cpu pinning configuration and the two features
-     * have almost the same libvirt version support
-     *
-     * @param compatibilityVersion
-     */
-    private void addNumaSetting(final String compatibilityVersion) {
-        if (Boolean.TRUE.equals(Config.<Boolean> 
getValue(ConfigValues.CpuPinningEnabled,
-                        compatibilityVersion))) {
-            NumaTuneMode numaTune = vm.getNumaTuneMode() == null ? 
NumaTuneMode.PREFERRED : vm.getNumaTuneMode();
-            List<VmNumaNode> vmNumaNodes = 
DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(vm.getId());
-            List<VdsNumaNode> totalVdsNumaNodes = 
DbFacade.getInstance().getVdsNumaNodeDAO()
-                    .getAllVdsNumaNodeByVdsId(vm.getRunOnVds());
-            List<Integer> totalVdsNumaNodesIndexes = 
NumaUtils.getNodeIndexList(totalVdsNumaNodes);
-            Map<String, Object> createNumaTune = new HashMap<>(2);
-            createNumaTune.put(VdsProperties.NUMA_TUNE_MODE, 
numaTune.getValue());
-            boolean useAllVdsNodesMem = false;
-            Set<Integer> vmNumaNodePinInfo = new HashSet<>();
-            if (!vmNumaNodes.isEmpty()) {
-                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()));
-                    createVmNumaNodes.add(createVmNumaNode);
-                    if (node.getVdsNumaNodeList().isEmpty()) {
-                        useAllVdsNodesMem = true;
-                    }
-                    else {
-                        
vmNumaNodePinInfo.addAll(NumaUtils.getPinnedNodeIndexList(node.getVdsNumaNodeList()));
-                    }
-                }
-                createInfo.put(VdsProperties.VM_NUMA_NODES, createVmNumaNodes);
-            }
-            else {
-                useAllVdsNodesMem = true;
-            }
-            if (useAllVdsNodesMem) {
-                if (!totalVdsNumaNodesIndexes.isEmpty()) {
-                    createNumaTune.put(VdsProperties.NUMA_TUNE_NODESET,
-                            
NumaUtils.buildStringFromListForNuma(totalVdsNumaNodesIndexes));
-                }
-            }
-            else {
-                if (!vmNumaNodePinInfo.isEmpty()) {
-                    createNumaTune.put(VdsProperties.NUMA_TUNE_NODESET,
-                            
NumaUtils.buildStringFromListForNuma(vmNumaNodePinInfo));
-                }
-            }
-            createInfo.put(VdsProperties.NUMA_TUNE, createNumaTune);
-            if (StringUtils.isEmpty(vm.getCpuPinning())) {
-                Map<String, Object> cpuPinDict = 
addCpuPinningForNumaSetting(vmNumaNodes, totalVdsNumaNodes);
-                if (!cpuPinDict.isEmpty()) {
-                    createInfo.put(VdsProperties.cpuPinning, cpuPinDict);
-                }
-            }
-        }
-    }
-
-    private Map<String, Object> addCpuPinningForNumaSetting(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 = 
NumaUtils.getPinnedNodeIndexList(node.getVdsNumaNodeList());
-            if (!pinnedNodeIndexes.isEmpty()) {
-                Set <Integer> totalPinnedVdsCpus = new LinkedHashSet<>();
-                for (Integer vCpu : node.getCpuIds()) {
-                    for (Integer pinnedVdsNode : pinnedNodeIndexes) {
-                        if (vdsNumaNodeCpus.containsKey(pinnedVdsNode)) {
-                            
totalPinnedVdsCpus.addAll(vdsNumaNodeCpus.get(pinnedVdsNode));
-                        }
-                    }
-                    cpuPinDict.put(String.valueOf(vCpu), 
NumaUtils.buildStringFromListForNuma(totalPinnedVdsCpus));
-                }
-            }
-        }
-        return cpuPinDict;
     }
 
     protected void buildVmNetworkCluster() {
@@ -429,6 +337,8 @@
 
     protected abstract void buildVmVirtioSerial();
 
+    protected abstract void buildVmNumaProperties();
+
     protected static enum VNIC_PROFILE_PROPERTIES {
         PORT_MIRRORING("Port Mirroring"),
         CUSTOM_PROPERTIES("Custom Properties"),
@@ -451,4 +361,5 @@
         }
         return vdsGroup;
     }
+
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
index 28a3a66..96b3baa 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
@@ -269,4 +269,9 @@
     protected void buildVmVirtioSerial() {
         // Not supported in old code
     }
+
+    @Override
+    protected void buildVmNumaProperties() {
+        // Not supported in old code
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactoryTest.java
 
b/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactoryTest.java
new file mode 100644
index 0000000..2cbe249
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/vdsbroker/NumaSettingFactoryTest.java
@@ -0,0 +1,131 @@
+package org.ovirt.engine.core.vdsbroker.vdsbroker;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.ovirt.engine.core.common.businessentities.NumaNodeStatistics;
+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.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+
+public class NumaSettingFactoryTest {
+
+    private static NumaTuneMode numaTuneMode;
+    private static List<VdsNumaNode> vdsNumaNodes;
+    private static List<VmNumaNode> vmNumaNodes;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        numaTuneMode = NumaTuneMode.INTERLEAVE;
+        vdsNumaNodes = createTestVdsNumaNodes();
+        vmNumaNodes = createTestVmNumaNodes();
+    }
+
+    @Test
+    public void testBuildVmNumaNodeSetting() throws Exception {
+        List<Map<String, Object>> vmNumaNodesSetting =
+                NumaSettingFactory.buildVmNumaNodeSetting(vmNumaNodes);
+        assertEquals(2, vmNumaNodesSetting.size());
+        
assertTrue(vmNumaNodesSetting.get(0).containsKey(VdsProperties.NUMA_NODE_CPU_LIST));
+        assertEquals("0,1,2,3", 
vmNumaNodesSetting.get(0).get(VdsProperties.NUMA_NODE_CPU_LIST));
+        
assertTrue(vmNumaNodesSetting.get(1).containsKey(VdsProperties.VM_NUMA_NODE_MEM));
+        assertEquals("1024", 
vmNumaNodesSetting.get(1).get(VdsProperties.VM_NUMA_NODE_MEM));
+    }
+
+    @Test
+    public void testBuildCpuPinningWithNumaSetting() throws Exception {
+        Map<String, Object> cpuPinning =
+                NumaSettingFactory.buildCpuPinningWithNumaSetting(vmNumaNodes, 
vdsNumaNodes);
+        assertEquals(8, cpuPinning.size());
+        assertTrue(cpuPinning.containsKey("3"));
+        assertEquals("0,1,2,3", cpuPinning.get("3"));
+        assertTrue(cpuPinning.containsKey("7"));
+        assertEquals("4,5,6,7", cpuPinning.get("7"));
+    }
+
+    @Test
+    public void testBuildVmNumatuneSetting() throws Exception {
+        Map<String, Object> numaTune =
+                NumaSettingFactory.buildVmNumatuneSetting(numaTuneMode, 
vmNumaNodes, vdsNumaNodes);
+        assertEquals(2, numaTune.size());
+        assertTrue(numaTune.containsKey(VdsProperties.NUMA_TUNE_MODE));
+        assertEquals(NumaTuneMode.INTERLEAVE.getValue(), 
numaTune.get(VdsProperties.NUMA_TUNE_MODE));
+        assertTrue(numaTune.containsKey(VdsProperties.NUMA_TUNE_NODESET));
+        assertEquals("0,1", numaTune.get(VdsProperties.NUMA_TUNE_NODESET));
+    }
+
+    private static List<VmNumaNode> createTestVmNumaNodes() {
+
+        List<VmNumaNode> newVmNodes = new ArrayList<>();
+        VmNumaNode newVmNumaNode = new VmNumaNode();
+        newVmNumaNode.setCpuIds(generateCpuList(0, 4));
+        newVmNumaNode.setId(Guid.newGuid());
+        newVmNumaNode.setIndex(0);
+        newVmNumaNode.setMemTotal(1024);
+        newVmNumaNode.getVdsNumaNodeList().add(new Pair<>(Guid.newGuid(), new 
Pair<>(true, 0)));
+        newVmNodes.add(newVmNumaNode);
+
+        newVmNumaNode = new VmNumaNode();
+        newVmNumaNode.setCpuIds(generateCpuList(4, 4));
+        newVmNumaNode.setId(Guid.newGuid());
+        newVmNumaNode.setIndex(1);
+        newVmNumaNode.setMemTotal(1024);
+        newVmNumaNode.getVdsNumaNodeList().add(new Pair<>(Guid.newGuid(), new 
Pair<>(true, 1)));
+        newVmNodes.add(newVmNumaNode);
+
+        return newVmNodes;
+    }
+
+    private static List<VdsNumaNode> createTestVdsNumaNodes() {
+
+        NumaNodeStatistics newNodeStatistics = new NumaNodeStatistics();
+        newNodeStatistics.setCpuUsagePercent(20);
+        newNodeStatistics.setMemUsagePercent(50);
+
+        List<VdsNumaNode> newVdsNodes = new ArrayList<>();
+
+        VdsNumaNode newVdsNumaNode= new VdsNumaNode();
+        newVdsNumaNode.setCpuIds(generateCpuList(0, 4));
+        newVdsNumaNode.setId(Guid.newGuid());
+        newVdsNumaNode.setIndex(0);
+        newVdsNumaNode.setNumaNodeDistances(generateDistance(2, 0));
+        newVdsNumaNode.setNumaNodeStatistics(newNodeStatistics);
+        newVdsNodes.add(newVdsNumaNode);
+
+        newVdsNumaNode= new VdsNumaNode();
+        newVdsNumaNode.setCpuIds(generateCpuList(4, 4));
+        newVdsNumaNode.setId(Guid.newGuid());
+        newVdsNumaNode.setIndex(1);
+        newVdsNumaNode.setNumaNodeDistances(generateDistance(2, 1));
+        newVdsNumaNode.setNumaNodeStatistics(newNodeStatistics);
+        newVdsNodes.add(newVdsNumaNode);
+
+        return newVdsNodes;
+    }
+
+    private static List<Integer> generateCpuList(int fromIndex, int count) {
+        List<Integer> cpuList = new ArrayList<>(count);
+        for (int i = fromIndex; i < (fromIndex + count); i++) {
+            cpuList.add(i);
+        }
+        return cpuList;
+    }
+
+    private static Map<Integer, Integer> generateDistance(int nodeCount, int 
selfNodeIndex) {
+        Map<Integer, Integer> distance = new HashMap<>(nodeCount);
+        for (int i = 0; i < nodeCount; i++) {
+            distance.put(i, (Math.abs(selfNodeIndex - i) + 1) * 10);
+        }
+        return distance;
+    }
+
+}


-- 
To view, visit http://gerrit.ovirt.org/33183
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I19be54812d0ebbb54145f33e6b036af84ff1d8ae
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com>
Gerrit-Reviewer: Xiaolei Shi <xiao-lei....@hp.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to