package org.ovirt.engine.core.bll.storage.domain;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.ClassRule;
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.StorageDomainManagementParameter;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
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.VDS;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.HSMGetStorageDomainInfoVDSCommandParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
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.utils.MockConfigRule;
public class AddExistingFileStorageDomainCommandTest extends BaseCommandTest {
private StorageDomainManagementParameter parameters = new StorageDomainManagementParameter(getStorageDomain());
@Spy
@InjectMocks
private AddExistingFileStorageDomainCommand<StorageDomainManagementParameter> command =
new AddExistingFileStorageDomainCommand<>(parameters, null);
@ClassRule
public static MockConfigRule mcr = new MockConfigRule();
@Mock
private VdsDao vdsDao;
@Mock
private StoragePoolDao storagePoolDao;
@Mock
private StorageDomainStaticDao storageDomainStaticDao;
@Before
public void setUp() {
command.setStoragePool(getStoragePool());
doReturn(false).when(command).isStorageWithSameNameExists();
doNothing().when(command).addStorageDomainInDb();
doNothing().when(command).updateStorageDomainDynamicFromIrs();
when(vdsDao.getAllForStoragePoolAndStatus(any(Guid.class), eq(VDSStatus.Up))).thenReturn(getHosts());
when(storagePoolDao.get(any(Guid.class))).thenReturn(getStoragePool());
}
@Test
public void testAddExistingSuccessfully() {
StorageDomainStatic sdStatic = command.getStorageDomain().getStorageStaticData();
doReturn(new Pair<>(sdStatic, sdStatic.getId())).when(command).executeHSMGetStorageDomainInfo(
any(HSMGetStorageDomainInfoVDSCommandParameters.class));
ValidateTestUtils.runAndAssertValidateSuccess(command);
command.executeCommand();
assertTrue(command.getReturnValue().getSucceeded());
}
@Test
public void testAlreadyExistStorageDomain() {
when(storageDomainStaticDao.get(any(Guid.class))).thenReturn(parameters.getStorageDomain());
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_ALREADY_EXIST);
}
@Test
public void testNonExistingStorageDomain() {
doReturn(null).when(command).executeHSMGetStorageDomainInfo(
any(HSMGetStorageDomainInfoVDSCommandParameters.class));
ValidateTestUtils.runAndAssertValidateFailure(command,
EngineMessage.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
}
@Test
public void testSwitchStorageDomainType() {
StorageDomainStatic sdStatic = command.getStorageDomain().getStorageStaticData();
doReturn(new Pair<>(sdStatic, sdStatic.getId())).when(command).executeHSMGetStorageDomainInfo(
any(HSMGetStorageDomainInfoVDSCommandParameters.class));
ValidateTestUtils.runAndAssertValidateSuccess(command);
}
private static StorageDomainStatic getStorageDomain() {
StorageDomainStatic storageDomain = new StorageDomainStatic();
storageDomain.setStorage(Guid.newGuid().toString());
storageDomain.setStorageDomainType(StorageDomainType.Data);
storageDomain.setStorageFormat(StorageFormatType.V3);
return storageDomain;
}
private static StoragePool getStoragePool() {
StoragePool storagePool = new StoragePool();
storagePool.setId(Guid.newGuid());
storagePool.setCompatibilityVersion(Version.getLast());
return storagePool;
}
private static List<VDS> getHosts() {
VDS host = new VDS();
host.setId(Guid.newGuid());
host.setStatus(VDSStatus.Up);
return Collections.singletonList(host);
}
}