package org.ovirt.engine.core.bll.storage.disk;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.ovirt.engine.core.bll.BaseCommandTest;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.common.action.MoveDiskParameters;
import org.ovirt.engine.core.common.action.MoveDisksParameters;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.LunDisk;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.DiskDao;
import org.ovirt.engine.core.dao.DiskImageDao;
import org.ovirt.engine.core.dao.VmDao;
public class MoveDisksCommandTest extends BaseCommandTest {
private final Guid diskImageId = Guid.newGuid();
private final Guid templateDiskImageId = Guid.newGuid();
private final Guid srcStorageId = Guid.newGuid();
private final Guid dstStorageId = Guid.newGuid();
@Mock
private DiskImageDao diskImageDao;
@Mock
private DiskDao diskDao;
@Mock
private VmDao vmDao;
/**
* The command under test
*/
@InjectMocks
protected MoveDisksCommand<MoveDisksParameters> command =
new MoveDisksCommand<>(new MoveDisksParameters(new ArrayList<>()), null);
private List<MoveDiskParameters> createMoveDisksParameters() {
return Collections.singletonList(new MoveDiskParameters(diskImageId, srcStorageId, dstStorageId));
}
@Test
public void validateNoDisksSpecified() {
assertFalse(command.validate());
assertTrue(command.getReturnValue()
.getValidationMessages()
.contains(EngineMessage.ACTION_TYPE_FAILED_NO_DISKS_SPECIFIED.toString()));
}
@Test
public void validateInvalidVmStatus() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
initVm(VMStatus.Unknown, Guid.newGuid(), diskImageId);
command.init();
command.updateParameters();
assertTrue(command.getReturnValue()
.getValidationMessages()
.contains(EngineMessage.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN_OR_UP.toString()));
}
@Test
public void moveDisk() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
initVm(VMStatus.Down, null, diskImageId);
command.init();
command.updateParameters();
assertEquals(1, command.getMoveDiskParametersList().size());
}
@Test
public void moveFloatingDisk() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
command.init();
command.updateParameters();
assertEquals(1, command.getMoveDiskParametersList().size());
}
@Test
public void liveMigrateDisk() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
initVm(VMStatus.Up, Guid.newGuid(), diskImageId);
command.init();
command.updateParameters();
assertEquals(1, command.getLiveMigrateVmDisksParametersList().size());
}
@Test
public void liveMigrateDiskBasedOnTemplate() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImageBasedOnTemplate(diskImageId);
initVm(VMStatus.Up, Guid.newGuid(), diskImageId);
command.init();
command.updateParameters();
assertEquals(1, command.getLiveMigrateVmDisksParametersList().size());
}
@Test
public void moveUnpluggedDiskVmDown() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
initVm(VMStatus.Down, Guid.newGuid(), diskImageId, false);
command.init();
command.updateParameters();
assertEquals(1, command.getMoveDiskParametersList().size());
}
@Test
public void moveUnpluggedDiskVmUp() {
command.getParameters().setParametersList(createMoveDisksParameters());
initDiskImage(diskImageId);
initVm(VMStatus.Up, Guid.newGuid(), diskImageId, false);
command.init();
command.updateParameters();
assertEquals(1, command.getMoveDiskParametersList().size());
}
@Test
public void moveDiskAndLiveMigrateDisk() {
Guid diskImageId1 = Guid.newGuid();
Guid diskImageId2 = Guid.newGuid();
MoveDiskParameters moveDiskParameters1 = new MoveDiskParameters(diskImageId1, srcStorageId, dstStorageId);
MoveDiskParameters moveDiskParameters2 = new MoveDiskParameters(diskImageId2, srcStorageId, dstStorageId);
command.getParameters().setParametersList(Arrays.asList(moveDiskParameters1, moveDiskParameters2));
initDiskImage(diskImageId1);
initDiskImage(diskImageId2);
initVm(VMStatus.Up, Guid.newGuid(), diskImageId1);
initVm(VMStatus.Down, Guid.newGuid(), diskImageId2);
command.init();
command.updateParameters();
assertEquals(1, command.getMoveDiskParametersList().size());
assertEquals(1, command.getLiveMigrateVmDisksParametersList().size());
}
@Test
public void movePluggedDiskAndUnpluggedDiskVmUp() {
Guid diskImageId1 = Guid.newGuid();
Guid diskImageId2 = Guid.newGuid();
MoveDiskParameters moveDiskParameters1 = new MoveDiskParameters(diskImageId1, srcStorageId, dstStorageId);
MoveDiskParameters moveDiskParameters2 = new MoveDiskParameters(diskImageId2, srcStorageId, dstStorageId);
command.getParameters().setParametersList(Arrays.asList(moveDiskParameters1, moveDiskParameters2));
initDiskImage(diskImageId1);
initDiskImage(diskImageId2);
initVm(VMStatus.Up, Guid.newGuid(), diskImageId1, true, diskImageId2, false);
command.init();
command.updateParameters();
assertTrue(command.getReturnValue()
.getValidationMessages()
.contains(EngineMessage.ACTION_TYPE_FAILED_MOVE_DISKS_MIXED_PLUGGED_STATUS.toString()));
}
@Test
public void validateFailureOnMovingLunDisk() {
MoveDiskParameters moveDiskParameters1 = new MoveDiskParameters(Guid.newGuid(), srcStorageId, dstStorageId);
command.getParameters().setParametersList(Collections.singletonList(moveDiskParameters1));
initLunDisk();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_NOT_SUPPORTED_DISK_STORAGE_TYPE);
}
@Test
public void validateFailureOnMovingCinderDisk() {
MoveDiskParameters moveDiskParameters = new MoveDiskParameters(Guid.newGuid(), srcStorageId, dstStorageId);
command.getParameters().setParametersList(Collections.singletonList(moveDiskParameters));
initCinderDisk();
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_NOT_SUPPORTED_DISK_STORAGE_TYPE);
}
/** Initialize Entities */
private void initVm(VMStatus vmStatus, Guid runOnVds, Guid diskImageId) {
initVm(vmStatus, runOnVds, diskImageId, true, null, false);
}
private void initVm(VMStatus vmStatus, Guid runOnVds, Guid diskImageId, boolean isPlugged) {
initVm(vmStatus, runOnVds, diskImageId, isPlugged, null, false);
}
private void initVm(VMStatus vmStatus, Guid runOnVds, Guid diskImageId1, boolean isPlugged1,
Guid diskImageId2, boolean isPlugged2) {
VM vm = new VM();
vm.setStatus(vmStatus);
vm.setRunOnVds(runOnVds);
when(vmDao.get(any(Guid.class))).thenReturn(vm);
when(vmDao.getForDisk(diskImageId1, false)).thenReturn(
Collections.singletonMap(isPlugged1, Collections.singletonList(vm)));
if (diskImageId2 != null) {
when(vmDao.getForDisk(diskImageId2, false)).thenReturn(
Collections.singletonMap(isPlugged2, Collections.singletonList(vm)));
}
}
private void initDiskImage(Guid diskImageId) {
DiskImage diskImage = mockDiskImage(diskImageId);
when(diskImageDao.get(diskImageId)).thenReturn(diskImage);
}
private void initLunDisk() {
Disk lunDisk = new LunDisk();
when(diskDao.get(any(Guid.class))).thenReturn(lunDisk);
}
private void initCinderDisk() {
Disk cinderDisk = new CinderDisk();
when(diskDao.get(any(Guid.class))).thenReturn(cinderDisk);
}
private void initDiskImageBasedOnTemplate(Guid diskImageId) {
DiskImage diskImage = mockDiskImage(diskImageId);
diskImage.setParentId(templateDiskImageId);
when(diskImageDao.get(diskImageId)).thenReturn(diskImage);
}
private DiskImage mockDiskImage(Guid diskImageId) {
DiskImage diskImage = new DiskImage();
diskImage.setId(diskImageId);
diskImage.setImageId(diskImageId);
return diskImage;
}
}