package org.ovirt.engine.core.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.NumaNodeStatistics;
import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
import org.ovirt.engine.core.compat.Guid;
public class VdsNumaNodeDaoTest extends BaseDaoTestCase {
private static final Guid EXISTING_VDS_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6");
private static final Guid ANOTHER_EXISTING_VDS_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e7");
private VdsNumaNodeDao vdsNumaNodeDao;
private NumaNodeStatistics newNodeStatistics;
@Override
public void setUp() throws Exception {
super.setUp();
vdsNumaNodeDao = dbFacade.getVdsNumaNodeDao();
newNodeStatistics = new NumaNodeStatistics();
newNodeStatistics.setCpuUsagePercent(20);
newNodeStatistics.setMemUsagePercent(50);
}
@Test
public void testGetAllVdsNumaNodeByVdsId() {
List<VdsNumaNode> result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
}
@Test
public void testMassSaveNumaNode() {
List<VdsNumaNode> result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(ANOTHER_EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(0, result.size());
List<VdsNumaNode> newVdsNode = 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);
newVdsNode.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);
newVdsNode.add(newVdsNumaNode);
vdsNumaNodeDao.massSaveNumaNode(newVdsNode, ANOTHER_EXISTING_VDS_ID);
result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(ANOTHER_EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
}
@Test
public void testMassUpdateNumaNode() {
List<VdsNumaNode> result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
Set<Integer> cpuList = new HashSet<>();
cpuList.addAll(result.get(0).getCpuIds());
cpuList.addAll(result.get(1).getCpuIds());
Set<Integer> expectedCpuList = new HashSet<>();
expectedCpuList.addAll(generateCpuList(0, 4));
assertEquals(expectedCpuList, cpuList);
result.get(0).setCpuIds(generateCpuList(4, 2));
result.get(1).setCpuIds(generateCpuList(6, 2));
vdsNumaNodeDao.massUpdateNumaNode(result);
result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
cpuList.clear();
cpuList.addAll(result.get(0).getCpuIds());
cpuList.addAll(result.get(1).getCpuIds());
expectedCpuList.clear();
expectedCpuList.addAll(generateCpuList(4, 4));
assertEquals(expectedCpuList, cpuList);
}
@Test
public void testMassUpdateNumaNodeStatistics() {
List<VdsNumaNode> result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(47607, result.get(0).getNumaNodeStatistics().getMemFree());
assertEquals(47607, result.get(1).getNumaNodeStatistics().getMemFree());
result.get(0).getNumaNodeStatistics().setMemFree(50000);
result.get(1).getNumaNodeStatistics().setMemFree(50000);
vdsNumaNodeDao.massUpdateNumaNodeStatistics(result);
result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(50000, result.get(0).getNumaNodeStatistics().getMemFree());
assertEquals(50000, result.get(1).getNumaNodeStatistics().getMemFree());
}
@Test
public void testMassRemoveNumaNodeByNumaNodeId() {
List<VdsNumaNode> newVdsNode = 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);
newVdsNode.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);
newVdsNode.add(newVdsNumaNode);
vdsNumaNodeDao.massSaveNumaNode(newVdsNode, ANOTHER_EXISTING_VDS_ID);
List<VdsNumaNode> result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(ANOTHER_EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(2, result.size());
List<Guid> numaNodeIds = new ArrayList<>();
numaNodeIds.add(result.get(0).getId());
numaNodeIds.add(result.get(1).getId());
vdsNumaNodeDao.massRemoveNumaNodeByNumaNodeId(numaNodeIds);
result = vdsNumaNodeDao.getAllVdsNumaNodeByVdsId(ANOTHER_EXISTING_VDS_ID);
assertNotNull(result);
assertEquals(0, result.size());
}
private 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 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;
}
}