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.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import org.ovirt.engine.core.common.businessentities.HostDevice;
import org.ovirt.engine.core.common.businessentities.HostDeviceId;
import org.ovirt.engine.core.common.businessentities.HostDeviceView;
import org.ovirt.engine.core.compat.Guid;
public class HostDeviceDaoTest extends BaseGenericDaoTestCase<HostDeviceId, HostDevice, HostDeviceDao> {
private static final Guid EXISTING_VM_ID = new Guid("77296e00-0cad-4e5a-9299-008a7b6f4355");
private static final Guid EXISTING_VM_ID_2 = new Guid("1b85420c-b84c-4f29-997e-0eb674b40b79");
private static final Guid EXISTING_VM_ID_3 = new Guid("77296e00-0cad-4e5a-9299-008a7b6f5002");
private static final Guid EXISTING_HOST_ID = new Guid("afce7a39-8e8c-4819-ba9c-796d316592e6");
private static final String EXISTING_VM_NAME = "rhel5-pool-57";
private static final String EXISTING_VM_NAME_2 = "1";
private static final String EXISTING_VM_NAME_3 = "rhel5-pool-52";
private static final String EXISTING_DEVICE_NAME = "pci_0000_00_1f_0";
private static final String EXISTING_DEVICE_NAME_2 = "pci_0000_00_1f_2";
private static final int EXISTING_IOMMU_GROUP = 9;
private static final int TOTAL_DEVICES_IN_GROUP = 4;
@Override
protected HostDevice generateNewEntity() {
HostDevice device = new HostDevice();
device.setHostId(EXISTING_HOST_ID);
device.setDeviceName(EXISTING_DEVICE_NAME + "___child");
device.setParentDeviceName(EXISTING_DEVICE_NAME);
device.setCapability("pci");
device.setDriver("mock driver");
device.setAssignable(true);
return device;
}
@Override
protected void updateExistingEntity() {
existingEntity.setIommuGroup(null);
existingEntity.setProductName("device upgrade");
}
@Override
protected HostDeviceId getExistingEntityId() {
return new HostDeviceId(EXISTING_HOST_ID, EXISTING_DEVICE_NAME);
}
@Override
protected HostDeviceDao prepareDao() {
return dbFacade.getHostDeviceDao();
}
@Override
protected HostDeviceId generateNonExistingId() {
return new HostDeviceId(Guid.newGuid(), "this_device_probably_doesnt_exist");
}
@Override
protected int getEntitiesTotalCount() {
return 36;
}
@Test
public void saveNetworkDevice() {
HostDevice netDevice = generateNewEntity();
netDevice.setCapability("net");
netDevice.setNetworkInterfaceName("eth1");
dao.save(netDevice);
HostDevice result = dao.get(netDevice.getId());
assertNotNull(result);
assertEquals(netDevice, result);
}
@Test
public void updateNetworkDevice() {
HostDevice before = getNetworkDevice();
before.setNetworkInterfaceName(before.getNetworkInterfaceName() + "new");
before.setDriver("updated driver");
dao.update(before);
HostDevice after = dao.get(before.getId());
assertNotNull(after);
assertEquals(before, after);
}
@Test
public void testGetHostDevicesByHostIdAndIommuGroup() {
List<HostDevice> hostDevices = dao.getHostDevicesByHostIdAndIommuGroup(EXISTING_HOST_ID, EXISTING_IOMMU_GROUP);
assertEquals(TOTAL_DEVICES_IN_GROUP, hostDevices.size());
for (HostDevice hostDevice : hostDevices) {
assertEquals(EXISTING_HOST_ID, hostDevice.getHostId());
assertEquals(Integer.valueOf(EXISTING_IOMMU_GROUP), hostDevice.getIommuGroup());
}
}
@Test
public void testGetVmExtendedHostDevicesByVmId() {
List<HostDeviceView> hostDevices = dao.getVmExtendedHostDevicesByVmId(EXISTING_VM_ID);
assertEquals(1, hostDevices.size());
assertEquals(EXISTING_VM_ID, hostDevices.get(0).getConfiguredVmId());
assertSetEquals(Collections.singletonList(EXISTING_VM_NAME), hostDevices.get(0).getAttachedVmNames());
assertNull(hostDevices.get(0).getRunningVmName());
assertNull(hostDevices.get(0).getRunningVmId());
hostDevices = dao.getVmExtendedHostDevicesByVmId(EXISTING_VM_ID_3);
assertEquals(1, hostDevices.size());
assertEquals(EXISTING_VM_ID_3, hostDevices.get(0).getConfiguredVmId());
assertSetEquals(Arrays.asList(EXISTING_VM_NAME_2, EXISTING_VM_NAME_3), hostDevices.get(0).getAttachedVmNames());
assertEquals(EXISTING_VM_NAME_2, hostDevices.get(0).getRunningVmName());
assertEquals(EXISTING_VM_ID_2, hostDevices.get(0).getRunningVmId());
}
@Test
public void testGetExtendedHostDevicesByHostId() {
List<HostDeviceView> hostDevices = dao.getExtendedHostDevicesByHostId(EXISTING_HOST_ID);
assertEquals(getEntitiesTotalCount(), hostDevices.size());
for (HostDeviceView hostDevice : hostDevices) {
assertEquals(EXISTING_HOST_ID, hostDevice.getHostId());
}
}
@Test
public void testCheckVmHostDeviceAvailability() {
assertTrue(dao.checkVmHostDeviceAvailability(EXISTING_VM_ID, EXISTING_HOST_ID));
}
@Test
public void testCheckVmHostDeviceAvailabilityOnAlreadyAllocatedDevice() {
assertTrue(dao.checkVmHostDeviceAvailability(EXISTING_VM_ID_2, EXISTING_HOST_ID));
}
@Test
public void testCheckVmHostDeviceAvailabilityOnAllocatedToDifferentVm() {
assertFalse(dao.checkVmHostDeviceAvailability(EXISTING_VM_ID_3, EXISTING_HOST_ID));
}
@Test
public void testMarkHostDevicesUsedByVmId() {
dao.markHostDevicesUsedByVmId(EXISTING_VM_ID, EXISTING_HOST_ID);
HostDevice hostDevice = dao.getHostDeviceByHostIdAndDeviceName(EXISTING_HOST_ID, EXISTING_DEVICE_NAME);
assertEquals(EXISTING_VM_ID, hostDevice.getVmId());
}
@Test
public void testFreeHostDevicesUsedByVmId() {
dao.freeHostDevicesUsedByVmId(EXISTING_VM_ID_2);
HostDevice hostDevice = dao.getHostDeviceByHostIdAndDeviceName(EXISTING_HOST_ID, EXISTING_DEVICE_NAME_2);
assertNull(hostDevice.getVmId());
}
private <T> void assertSetEquals(Collection<T> expected, Collection<T> actual) {
Set<T> expectedSet = new HashSet<>();
expectedSet.addAll(expected);
Set<T> actualSet = new HashSet<>();
actualSet.addAll(actual);
assertEquals(expectedSet, actualSet);
}
@Test
public void setVmIdOnHostDeviceTest() {
HostDevice before = getNetworkDevice();
assertNull(before.getVmId());
Guid vmId = FixturesTool.VM_WITH_NO_ATTACHED_DISKS;
dao.setVmIdOnHostDevice(before.getId(), vmId);
before.setVmId(vmId);
HostDevice after = dao.get(before.getId());
assertEquals(before, after);
}
@Test
public void cleanDownVmsTest() {
HostDevice device = getNetworkDevice();
HostDeviceId deviceId = device.getId();
// Setting an id of VM with VMStatus.Down
Guid vmId = FixturesTool.VM_WITH_NO_ATTACHED_DISKS;
dao.setVmIdOnHostDevice(deviceId, vmId);
device = dao.get(deviceId);
assertNotNull(device);
assertEquals(vmId, device.getVmId());
dao.cleanDownVms();
device = dao.get(deviceId);
assertNull(device.getVmId());
}
private HostDevice getNetworkDevice() {
HostDeviceId netDeviceId =
new HostDeviceId(FixturesTool.NETWORK_HOST_DEVICE_HOST_ID, FixturesTool.NETWORK_HOST_DEVICE_NAME);
return dao.get(netDeviceId);
}
}