package org.ovirt.engine.core.bll.storage.disk;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.ovirt.engine.core.bll.BaseCommandTest;
import org.ovirt.engine.core.bll.ValidateTestUtils;
import org.ovirt.engine.core.common.action.GetDiskAlignmentParameters;
import org.ovirt.engine.core.common.businessentities.ArchitectureType;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmDevice;
import org.ovirt.engine.core.common.businessentities.VmDeviceId;
import org.ovirt.engine.core.common.businessentities.VmEntityType;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.StorageDomainStaticDao;
import org.ovirt.engine.core.dao.StoragePoolDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.VmDeviceDao;
/** A test case for {@link GetDiskAlignmentCommandTest} */
public class GetDiskAlignmentCommandTest extends BaseCommandTest {
@Mock
private VmDao vmDao;
@Mock
private VdsDao vdsDao;
@Mock
private StorageDomainStaticDao storageDomainStaticDao;
@Mock
private StoragePoolDao spDao;
@Mock
private VmDeviceDao vmDeviceDao;
@Mock
private ClusterDao clusterDao;
private Guid diskId = Guid.newGuid();
private Guid groupId;
private DiskImage disk;
private VM vm;
private StoragePool storagePool;
private StorageDomain storageDomain;
private Cluster cluster;
@Spy
@InjectMocks
private GetDiskAlignmentCommand<GetDiskAlignmentParameters> cmd =
new GetDiskAlignmentCommand<>(new GetDiskAlignmentParameters(diskId), null);
@Before
public void setUp() {
Guid vmId = Guid.newGuid();
Guid poolId = Guid.newGuid();
Guid storageDomainId = Guid.newGuid();
groupId = Guid.newGuid();
Guid vdsId = Guid.newGuid();
disk = new DiskImage();
disk.setId(diskId);
disk.setVmEntityType(VmEntityType.VM);
disk.setImageStatus(ImageStatus.OK);
disk.setStorageIds(new ArrayList<>(Collections.singletonList(storageDomainId)));
vm = new VM();
vm.setId(vmId);
vm.setStatus(VMStatus.Down);
vm.setStoragePoolId(poolId);
vm.setClusterId(groupId);
VmDeviceId vmDeviceId = new VmDeviceId(diskId, vmId);
VmDevice vmDevice = new VmDevice();
vmDevice.setId(vmDeviceId);
cluster = new Cluster();
cluster.setId(groupId);
cluster.setArchitecture(ArchitectureType.x86_64);
VDS vds = new VDS();
vds.setId(vdsId);
storagePool = new StoragePool();
storagePool.setStatus(StoragePoolStatus.Up);
storageDomain = new StorageDomain();
storageDomain.setStorageType(StorageType.ISCSI);
when(vmDao.getVmsListForDisk(diskId, Boolean.FALSE)).thenReturn(Collections.singletonList(vm));
when(vmDeviceDao.get(vmDeviceId)).thenReturn(vmDevice);
when(vdsDao.getAllForClusterWithStatus(groupId, VDSStatus.Up)).thenReturn(Collections.singletonList(vds));
when(spDao.get(poolId)).thenReturn(storagePool);
when(clusterDao.get(groupId)).thenReturn(cluster);
when(storageDomainStaticDao.get(storageDomainId)).thenReturn(storageDomain.getStorageStaticData());
doReturn(disk).when(cmd).getDisk();
}
/* Tests for validate() flow */
@Test
public void testValidateSuccess() {
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
@Test
public void testValidateImageDoesNotExist() {
doReturn(null).when(cmd).getDisk();
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_DISK_NOT_EXIST);
}
@Test
public void testValidateImageIsLocked() {
disk.setImageStatus(ImageStatus.LOCKED);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_DISKS_LOCKED);
}
@Test
public void testValidateFloatingDisk() {
when(vmDao.getVmsListForDisk(diskId, Boolean.FALSE)).thenReturn(Collections.emptyList());
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_DISK_IS_NOT_VM_DISK);
}
@Test
public void testValidateVmRunningFail() {
vm.setStatus(VMStatus.Up);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ERROR_CANNOT_RUN_ALIGNMENT_SCAN_VM_IS_RUNNING);
}
@Test
public void testValidateVdsNotFound() {
when(vdsDao.getAllForClusterWithStatus(groupId, VDSStatus.Up))
.thenReturn(Collections.emptyList());
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_NO_VDS_IN_POOL);
}
@Test
public void testValidateStoragePoolDown() {
storagePool.setStatus(StoragePoolStatus.Maintenance);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_IMAGE_REPOSITORY_NOT_FOUND);
}
@Test
public void testValidateStorageDomainIsFileStorage() {
storageDomain.setStorageType(StorageType.NFS);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_ALIGNMENT_SCAN_STORAGE_TYPE);
}
@Test
public void testGetAlignmentFailsForPPC() {
cluster.setArchitecture(ArchitectureType.ppc64);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_ALIGNMENT_SCAN_NOT_SUPPORTED_ON_PPC);
}
}