package org.ovirt.engine.core.bll.storage.disk;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.AbstractUserQueryTest;
import org.ovirt.engine.core.bll.storage.disk.image.ImagesHandler;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.VmDao;
@RunWith(MockitoJUnitRunner.class)
public class GetNextAvailableDiskAliasNameByVMIdQueryTest extends AbstractUserQueryTest<IdQueryParameters, GetNextAvailableDiskAliasNameByVMIdQuery<IdQueryParameters>> {
@Mock
private VmDao vmDao;
private VM vm;
private static final Guid vmId = Guid.newGuid();
private static final String VM_NAME = "VmTESTNaME";
@Override
protected void initQuery(GetNextAvailableDiskAliasNameByVMIdQuery<IdQueryParameters> query) {
super.initQuery(query);
doNothing().when(query).updateDisksFromDb(any(VM.class));
}
@Test
public void testExecuteQueryVmWithNoDisks() throws Exception {
mockParameters();
vm = mockVmAndReturnFromDao();
String diskAliasName = ImagesHandler.getDefaultDiskAlias(vm.getName(), "1");
// Execute query.
getQuery().executeQueryCommand();
assertEquals(diskAliasName, getQuery().getQueryReturnValue().getReturnValue().toString());
}
@Test
public void testExecuteQueryWithInValidVmIdOrMissingPermissions() throws Exception {
mockParameters();
vm = mockVm();
// Execute query.
getQuery().executeQueryCommand();
assertNull(getQuery().getQueryReturnValue().getReturnValue());
}
@Test
public void testExecuteQueryVmWithMultipleDisks() throws Exception {
mockParameters();
vm = mockVmAndReturnFromDao();
populateVmDiskMap(vm, 5);
String expectedDiskAlias = ImagesHandler.getDefaultDiskAlias(vm.getName(), "6");
getQuery().executeQueryCommand();
assertEquals(expectedDiskAlias, getQuery().getQueryReturnValue().getReturnValue());
}
/**
* When removing the first disk from VM with n disks the default disk alias should be recycled and take the
* disk alias of the disk we removed
*/
@Test
public void testExecuteQueryRecycling() throws Exception {
mockParameters();
vm = mockVmAndReturnFromDao();
populateVmDiskMap(vm, 5);
String expectedDiskAlias = ImagesHandler.getDefaultDiskAlias(vm.getName(), "3");
Optional<Guid> removedDiskId =
vm.getDiskMap().values().stream()
.filter(d -> d.getDiskAlias().equals(expectedDiskAlias)).map(Disk::getId).findFirst();
removedDiskId.ifPresent(id -> vm.getDiskMap().remove(id));
getQuery().executeQueryCommand();
assertEquals(expectedDiskAlias, getQuery().getQueryReturnValue().getReturnValue());
}
/**
* Populates the VM disk map with the amount of disks specified, each with a default disk alias
*/
private static void populateVmDiskMap(VM vm, int numOfDisks) {
Map<Guid, Disk> diskMap = vm.getDiskMap();
for (Integer i = 0; i < numOfDisks; i++) {
DiskImage diskImage = new DiskImage();
diskImage.setId(Guid.newGuid());
diskImage.setDiskAlias(ImagesHandler.getDefaultDiskAlias(vm.getName(), Integer.toString(i + 1)));
diskMap.put(diskImage.getId(), diskImage);
}
}
private void mockParameters() throws Exception {
when(getQueryParameters().getId()).thenReturn(vmId);
}
private VM mockVm() {
vm = new VM();
vm.setId(vmId);
vm.setName(VM_NAME);
vm.setDiskMap(new HashMap<>());
return vm;
}
private VM mockVmAndReturnFromDao() {
vm = mockVm();
when(vmDao.get(vmId, getUser().getId(), getQueryParameters().isFiltered())).thenReturn(vm);
return vm;
}
}