package org.ovirt.engine.core.bll.storage.domain;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Rule;
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.ExtendSANStorageDomainParameters;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StorageFormatType;
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.storage.LUNs;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.dao.LunDao;
import org.ovirt.engine.core.dao.StorageDomainStaticDao;
import org.ovirt.engine.core.utils.RandomUtils;
import org.ovirt.engine.core.utils.RandomUtilsSeedingRule;
public class RefreshLunsSizeCommandTest extends BaseCommandTest {
private static final String STORAGE = "STORAGE";
private Guid sdId = Guid.newGuid();
private StorageDomain sd;
private Guid spId;
@Rule
public RandomUtilsSeedingRule rusr = new RandomUtilsSeedingRule();
@Spy
@InjectMocks
private RefreshLunsSizeCommand<ExtendSANStorageDomainParameters> cmd =
new RefreshLunsSizeCommand<>(
new ExtendSANStorageDomainParameters(sdId, new ArrayList<>(Arrays.asList("1", "2"))), null);
@Mock
private StorageDomainStaticDao sdsDao;
@Mock
private LunDao lunsDao;
@Before
public void setUp() {
StorageDomainStatic sdStatic = createStorageDomain();
spId = Guid.newGuid();
sd = new StorageDomain();
sd.setStorageStaticData(sdStatic);
sd.setStatus(StorageDomainStatus.Active);
sd.setStoragePoolId(spId);
StoragePool sp = new StoragePool();
sp.setId(spId);
sp.setStatus(StoragePoolStatus.Up);
sp.setIsLocal(false);
sp.setCompatibilityVersion(Version.v3_6);
doReturn(sd).when(cmd).getStorageDomain();
doReturn(sp).when(cmd).getStoragePool();
when(sdsDao.get(sdId)).thenReturn(sdStatic);
LUNs lun1 = new LUNs();
lun1.setLUNId("1");
lun1.setStorageDomainId(sdId);
LUNs lun2 = new LUNs();
lun2.setLUNId("2");
lun2.setStorageDomainId(sdId);
when(lunsDao.getAll()).thenReturn(Arrays.asList(lun1, lun2));
}
private StorageDomainStatic createStorageDomain() {
StorageDomainStatic sd = new StorageDomainStatic();
sd.setId(sdId);
sd.setStorageName("newStorageDomain");
sd.setComment("a storage domain for testing");
sd.setDescription("a storage domain for testing");
sd.setStorageDomainType(StorageDomainType.Data);
sd.setStorageType(StorageType.ISCSI);
sd.setStorageFormat(StorageFormatType.V3);
sd.setStorage(STORAGE);
return sd;
}
@Test
public void validateWrongStorage() {
StorageDomainStatic nfsStatic = createStorageDomain();
nfsStatic.setStorageType(StorageType.NFS);
StorageDomain sd = new StorageDomain();
sd.setStorageStaticData(nfsStatic);
sd.setStatus(StorageDomainStatus.Active);
sd.setStoragePoolId(spId);
doReturn(sd).when(cmd).getStorageDomain();
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL);
}
@Test
public void validateWrongStatus() {
sd.setStatus(StorageDomainStatus.Maintenance);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2);
}
@Test
public void validateStatusLocked() {
sd.setStatus(StorageDomainStatus.Locked);
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_OBJECT_LOCKED);
}
@Test
public void validateNoDomain() {
doReturn(null).when(cmd).getStorageDomain();
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
}
@Test
public void setActionMessageParameters() {
cmd.setActionMessageParameters();
List<String> messages = cmd.getReturnValue().getValidationMessages();
assertTrue("action name not in messages", messages.remove(EngineMessage.VAR__ACTION__UPDATE.name()));
assertTrue("type not in messages", messages.remove(EngineMessage.VAR__TYPE__STORAGE__DOMAIN.name()));
assertTrue("redundant messages " + messages, messages.isEmpty());
}
@Test
public void validateLunsNotPartOfStorageDomain() {
LUNs lun1 = new LUNs();
lun1.setLUNId("111");
lun1.setStorageDomainId(sdId);
LUNs lun2 = new LUNs();
lun2.setLUNId("222");
lun2.setStorageDomainId(sdId);
when(lunsDao.getAllForVolumeGroup(STORAGE)).thenReturn(Arrays.asList(lun1, lun2));
ValidateTestUtils.runAndAssertValidateFailure(cmd,
EngineMessage.ACTION_TYPE_FAILED_LUNS_NOT_PART_OF_STORAGE_DOMAIN);
}
@Test
public void validate() {
LUNs lun1 = new LUNs();
lun1.setLUNId("1");
lun1.setStorageDomainId(sdId);
LUNs lun2 = new LUNs();
lun2.setLUNId("2");
lun2.setStorageDomainId(sdId);
when(lunsDao.getAllForVolumeGroup(STORAGE)).thenReturn(Arrays.asList(lun1, lun2));
ValidateTestUtils.runAndAssertValidateSuccess(cmd);
}
@Test
public void validateLunSizeSimilarOnAllHostsSucceeds() {
assertTrue(cmd.getFailedLuns(createLunMap(true)).isEmpty());
}
@Test
public void validateLunSizeDifferentOnOneHostFails() {
assertFalse(cmd.getFailedLuns(createLunMap(false)).isEmpty());
}
private Map<String, List<Pair<VDS, LUNs>>> createLunMap(boolean sameLunSizesPerHost) {
RandomUtils rnd = RandomUtils.instance();
String lunId = rnd.nextString(34);
int lunSize = rnd.nextInt();
List<Pair<VDS, LUNs>> lunList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
LUNs lun = new LUNs();
if (!sameLunSizesPerHost) {
lunSize++;
}
lun.setDeviceSize(lunSize);
lunList.add(new Pair<>(new VDS(), lun));
}
return Collections.singletonMap(lunId, lunList);
}
}