package org.ovirt.engine.core.bll.storage.domain;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
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.context.CommandContext;
import org.ovirt.engine.core.bll.context.CompensationContext;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.common.action.AttachStorageDomainToPoolParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
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.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.AttachStorageDomainVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.HSMGetStorageDomainInfoVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.DiskImageDao;
import org.ovirt.engine.core.dao.StorageDomainDao;
import org.ovirt.engine.core.dao.StorageDomainStaticDao;
import org.ovirt.engine.core.dao.StoragePoolDao;
import org.ovirt.engine.core.dao.StoragePoolIsoMapDao;
import org.ovirt.engine.core.dao.VdsDao;
public class AttachStorageDomainToPoolCommandTest extends BaseCommandTest {
@Mock
private StoragePoolIsoMapDao isoMapDao;
@Mock
private StoragePoolDao storagePoolDao;
@Mock
private StorageDomainDao storageDomainDao;
@Mock
private StorageDomainStaticDao storageDomainStaticDao;
@Mock
private DiskImageDao diskImageDao;
@Mock
private VdsDao vdsDao;
@Mock
private BackendInternal backendInternal;
@Mock
private VDSBrokerFrontend vdsBrokerFrontend;
@Mock
private VDS vds;
private StoragePoolIsoMap map;
@Spy
@InjectMocks
private AttachStorageDomainToPoolCommand<AttachStorageDomainToPoolParameters> cmd =
new AttachStorageDomainToPoolCommand<>(
new AttachStorageDomainToPoolParameters(Guid.newGuid(), Guid.newGuid()),
CommandContext.createContext(""));
@Test
public void statusSetInMap() {
cmd.init();
Guid storageDomainId = cmd.getStorageDomainId();
Guid poolId = cmd.getStoragePoolId();
doNothing().when(cmd).attemptToActivateDomain();
doReturn(Collections.singletonList(new Pair<>(Guid.newGuid(), true))).when(cmd)
.connectHostsInUpToDomainStorageServer();
StoragePool pool = new StoragePool();
pool.setId(poolId);
pool.setStatus(StoragePoolStatus.Up);
when(storagePoolDao.get(any(Guid.class))).thenReturn(pool);
when(isoMapDao.get(any(StoragePoolIsoMapId.class))).thenReturn(map);
when(storageDomainDao.getForStoragePool(any(Guid.class), any(Guid.class))).thenReturn(new StorageDomain());
when(storageDomainStaticDao.get(any(Guid.class))).thenReturn(new StorageDomainStatic());
doReturn(pool.getId()).when(cmd).getStoragePoolIdFromVds();
VdcReturnValueBase vdcReturnValue = new VdcReturnValueBase();
vdcReturnValue.setSucceeded(true);
when(backendInternal.runInternalAction(any(VdcActionType.class),
any(VdcActionParametersBase.class),
any(CommandContext.class))).thenReturn(vdcReturnValue);
StorageDomainStatic storageDomain = new StorageDomainStatic();
storageDomain.setId(Guid.newGuid());
storageDomain.setStorageDomainType(StorageDomainType.ImportExport);
mockGetStorageDomainInfoVdsCommand(storageDomain);
mockAttachStorageDomainVdsCommand();
when(vdsDao.get(any(Guid.class))).thenReturn(vds);
doReturn(Collections.emptyList()).when(cmd).getEntitiesFromStorageOvfDisk(storageDomainId, pool.getId());
doReturn(Collections.emptyList()).when(cmd).getAllOVFDisks(storageDomainId, pool.getId());
doAnswer(invocation -> {
map = (StoragePoolIsoMap) invocation.getArguments()[0];
return null;
}).when(isoMapDao).save(any(StoragePoolIsoMap.class));
cmd.setCompensationContext(mock(CompensationContext.class));
cmd.executeCommand();
assertNotNull(map);
assertEquals(StorageDomainStatus.Maintenance, map.getStatus());
}
private void mockAttachStorageDomainVdsCommand() {
VDSReturnValue returnValue = new VDSReturnValue();
returnValue.setSucceeded(true);
when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.AttachStorageDomain),
any(AttachStorageDomainVDSCommandParameters.class))).thenReturn(returnValue);
}
private void mockGetStorageDomainInfoVdsCommand(StorageDomainStatic storageDomain) {
Pair<StorageDomainStatic, Guid> pairResult = new Pair<>(storageDomain, null);
VDSReturnValue returnValueForGetStorageDomainInfo = new VDSReturnValue();
returnValueForGetStorageDomainInfo.setSucceeded(true);
returnValueForGetStorageDomainInfo.setReturnValue(pairResult);
when(vdsBrokerFrontend.runVdsCommand(eq(VDSCommandType.HSMGetStorageDomainInfo),
any(HSMGetStorageDomainInfoVDSCommandParameters.class))).thenReturn(returnValueForGetStorageDomainInfo);
}
}