package org.ovirt.engine.core.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.junit.Test;
import org.ovirt.engine.core.common.scheduling.AffinityGroup;
import org.ovirt.engine.core.common.scheduling.EntityAffinityRule;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.scheduling.AffinityGroupDao;
public class AffinityGroupDaoTest extends BaseDaoTestCase {
private static final String AFFINITY_GROUP_NAME = "affinityGroup1";
private static final int NUM_OF_AFFINITY_GROUPS_IN_CLUSTER = 3;
private static final int NUM_OF_AFFINITY_GROUPS_FOR_VM = 2;
private static final int NUM_OF_VMS_IN_EXISTING_AFFINITY_GROUP = 2;
private AffinityGroupDao dao;
@Override
public void setUp() throws Exception {
super.setUp();
dao = dbFacade.getAffinityGroupDao();
}
@Test
public void testGetById() {
AffinityGroup affinityGroup = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertNotNull(affinityGroup);
assertEquals(FixturesTool.EXISTING_AFFINITY_GROUP_ID, affinityGroup.getId());
// empty
affinityGroup = dao.get(null);
assertNull(affinityGroup);
affinityGroup = dao.get(Guid.Empty);
assertNull(affinityGroup);
affinityGroup = dao.get(Guid.newGuid());
assertNull(affinityGroup);
}
@Test
public void testGetByClusterId() {
List<AffinityGroup> affinityGroupList = dao.getAllAffinityGroupsByClusterId(FixturesTool.CLUSTER_RHEL6_ISCSI);
assertFalse(affinityGroupList.isEmpty());
assertEquals(NUM_OF_AFFINITY_GROUPS_IN_CLUSTER, affinityGroupList.size());
// empty
affinityGroupList = dao.getAllAffinityGroupsByClusterId(null);
assertTrue(affinityGroupList.isEmpty());
affinityGroupList = dao.getAllAffinityGroupsByClusterId(Guid.Empty);
assertTrue(affinityGroupList.isEmpty());
affinityGroupList = dao.getAllAffinityGroupsByClusterId(Guid.newGuid());
assertTrue(affinityGroupList.isEmpty());
}
@Test
public void testGetByVmId() {
List<AffinityGroup> affinityGroupList = dao.getAllAffinityGroupsByVmId(FixturesTool.VM_RHEL5_POOL_50);
assertFalse(affinityGroupList.isEmpty());
assertEquals(NUM_OF_AFFINITY_GROUPS_FOR_VM, affinityGroupList.size());
// empty
affinityGroupList = dao.getAllAffinityGroupsByVmId(null);
assertTrue(affinityGroupList.isEmpty());
affinityGroupList = dao.getAllAffinityGroupsByVmId(Guid.Empty);
assertTrue(affinityGroupList.isEmpty());
affinityGroupList = dao.getAllAffinityGroupsByVmId(Guid.newGuid());
assertTrue(affinityGroupList.isEmpty());
}
@Test
public void testGetByName() {
AffinityGroup affinityGroup = dao.getByName(AFFINITY_GROUP_NAME);
assertNotNull(affinityGroup);
affinityGroup = dao.getByName(AFFINITY_GROUP_NAME + "A");
assertNull(affinityGroup);
}
@Test
public void testSave() {
AffinityGroup ag = new AffinityGroup();
ag.setId(Guid.newGuid());
ag.setName("testAG");
ag.setDescription("desc");
ag.setClusterId(FixturesTool.CLUSTER_RHEL6_NFS);
ag.setVmEnforcing(false);
ag.setVmAffinityRule(EntityAffinityRule.NEGATIVE);
ag.setVdsEnforcing(false);
ag.setVdsAffinityRule(EntityAffinityRule.POSITIVE);
ag.setVmIds(new ArrayList<>());
ag.getVmIds().add(FixturesTool.VM_RHEL5_POOL_50);
ag.setVmEntityNames(new ArrayList<>());
ag.getVmEntityNames().add(FixturesTool.VM_RHEL5_POOL_50_NAME);
ag.setVdsIds(new ArrayList<>());
ag.getVdsIds().add(FixturesTool.VDS_RHEL6_NFS_SPM);
ag.setVdsEntityNames(new ArrayList<>());
ag.getVdsEntityNames().add("magenta-vdsc");
dao.save(ag);
AffinityGroup fetched = dao.get(ag.getId());
assertTrue(equals(ag, fetched));
}
@Test
public void testSimpleUpdate() {
AffinityGroup existing = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
existing.setName("my_new_name");
existing.setVmAffinityRule(EntityAffinityRule.NEGATIVE);
existing.setVmEnforcing(true);
dao.update(existing);
AffinityGroup fetched = dao.get(existing.getId());
assertTrue(equals(existing, fetched));
}
@Test
public void testRemoveVmsFromExistingAffinityGroup() {
AffinityGroup existing = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertFalse(existing.getVmEntityNames().isEmpty());
existing.getVmIds().clear();
dao.update(existing);
AffinityGroup fetched = dao.get(existing.getId());
assertTrue(fetched.getVmEntityNames().isEmpty());
}
@Test
public void testRemoveVdsFromExistingAffinityGroup() {
AffinityGroup existing = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertFalse(existing.getVdsEntityNames().isEmpty());
existing.getVdsIds().clear();
dao.update(existing);
AffinityGroup fetched = dao.get(existing.getId());
assertTrue(fetched.getVdsEntityNames().isEmpty());
}
@Test
public void testAddVmsForExistingAffinityGroup() {
AffinityGroup existing = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertEquals(NUM_OF_VMS_IN_EXISTING_AFFINITY_GROUP, existing.getVmEntityNames().size());
existing.getVmIds().add(FixturesTool.VM_RHEL5_POOL_51);
dao.update(existing);
AffinityGroup fetched = dao.get(existing.getId());
assertEquals(NUM_OF_VMS_IN_EXISTING_AFFINITY_GROUP + 1, fetched.getVmEntityNames().size());
}
@Test
public void testRemove() {
dao.remove(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertNull(dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID));
assertEquals(NUM_OF_AFFINITY_GROUPS_IN_CLUSTER - 1,
dao.getAllAffinityGroupsByClusterId(FixturesTool.CLUSTER_RHEL6_ISCSI).size());
}
@Test
public void testRemoveVmFromAffinityGroups() {
assertFalse(dao.getAllAffinityGroupsByVmId(FixturesTool.VM_RHEL5_POOL_50).isEmpty());
dao.removeVmFromAffinityGroups(FixturesTool.VM_RHEL5_POOL_50);
assertTrue(dao.getAllAffinityGroupsByVmId(FixturesTool.VM_RHEL5_POOL_50).isEmpty());
}
@Test
public void testEmptyGetAffinityGroupByVdsId() {
getAffinityGroupByVdsIdHelper(Guid.Empty, 0);
}
@Test
public void testGetAffinityGroupByVdsId() {
getAffinityGroupByVdsIdHelper(FixturesTool.VDS_RHEL6_NFS_SPM, 1);
}
private void getAffinityGroupByVdsIdHelper(Guid vdsId, int count) {
List<AffinityGroup> affinityGroups =
dao.getPositiveEnforcingAffinityGroupsByRunningVmsOnVdsId(vdsId);
assertNotNull(affinityGroups);
assertEquals(count, affinityGroups.size());
}
@Test
public void testRemoveVdsFromAffinityGroups() {
AffinityGroup existing = dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID);
assertFalse(existing.getVdsIds().isEmpty());
dao.removeVdsFromAffinityGroups(FixturesTool.VDS_RHEL6_NFS_SPM);
assertTrue(dao.get(FixturesTool.EXISTING_AFFINITY_GROUP_ID).getVdsIds().isEmpty());
}
private boolean equals(AffinityGroup affinityGroup, AffinityGroup other) {
return Objects.equals(affinityGroup.getClusterId(), other.getClusterId())
&& Objects.equals(affinityGroup.getDescription(), other.getDescription())
&& affinityGroup.isVmEnforcing() == other.isVmEnforcing()
&& affinityGroup.isVdsEnforcing() == other.isVdsEnforcing()
&& Objects.equals(affinityGroup.getId(), other.getId())
&& Objects.equals(affinityGroup.getName(), other.getName())
&& affinityGroup.getVmAffinityRule().equals(other.getVmAffinityRule())
&& affinityGroup.getVdsAffinityRule().equals(other.getVdsAffinityRule());
}
}