package org.ovirt.engine.core.bll.storage;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mock;
import java.util.ArrayList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.ovirt.engine.core.bll.BaseMockitoTest;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters;
import org.ovirt.engine.core.common.action.RemoveStorageDomainParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
import org.ovirt.engine.core.common.businessentities.StorageType;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.storage_domain_static;
import org.ovirt.engine.core.common.businessentities.storage_domains;
import org.ovirt.engine.core.common.businessentities.storage_pool;
import org.ovirt.engine.core.common.businessentities.storage_pool_iso_map;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.interfaces.VDSBrokerFrontend;
import org.ovirt.engine.core.common.vdscommands.FormatStorageDomainVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.RemoveVGVDSCommandParameters;
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.compat.Version;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.BusinessEntitySnapshotDAO;
import org.ovirt.engine.core.dao.StorageDomainDAO;
import org.ovirt.engine.core.dao.StorageDomainDynamicDAO;
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;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@PrepareForTest({ Config.class })
@RunWith(PowerMockRunner.class)
public class RemoveStorageDomainTest extends BaseMockitoTest {
private Guid STORAGE_DOMAIN_ID = GUIDS[0];
private Guid STORAGE_POOL_ID = GUIDS[1];
private Guid VDS_ID = GUIDS[2];
@Test
public void testCanDoAction() {
DbFacade db = setUpDB();
expectGetStoragePool(db, STORAGE_POOL_ID);
expectGetStorageDomain(db,
STORAGE_DOMAIN_ID,
STORAGE_POOL_ID,
StorageDomainType.Data,
StorageType.NFS);
expectGetVds(db, VDS_ID);
expectGetIsoMap(db, STORAGE_DOMAIN_ID);
expectBusinessEntitySnapshotDAO(db);
RemoveStorageDomainCommand cmd = new RemoveStorageDomainCommand(getParams(true));
assertTrue(cmd.canDoAction());
checkSucceeded(cmd, false);
checkMessages(cmd,
VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN,
VdcBllMessages.VAR__ACTION__REMOVE);
}
@Test
public void testRemoveNfsData() {
doTestRemove(StorageDomainType.Data, StorageType.NFS, true, false);
}
@Test
public void testRemoveIscsiData() {
doTestRemove(StorageDomainType.Data, StorageType.ISCSI, true, false);
}
@Test
public void testRemoveAndFormatNfsIso() {
doTestRemove(StorageDomainType.ISO, StorageType.NFS, true, false);
}
@Test
public void testRemoveNfsExport() {
doTestRemove(StorageDomainType.ImportExport, StorageType.NFS, false, false);
}
@Test
public void testRemoveLocalData() {
doTestRemove(StorageDomainType.Data, StorageType.LOCALFS, true, false);
}
@Test
public void testRemoveFormatFailed() {
doTestRemove(StorageDomainType.Data, StorageType.NFS, true, true);
}
public void doTestRemove(StorageDomainType type, StorageType storageType, boolean format, boolean failure) {
DbFacade db = setUpDB();
expectGetStoragePool(db, STORAGE_POOL_ID);
storage_domains dom = expectGetStorageDomain(db,
STORAGE_DOMAIN_ID,
STORAGE_POOL_ID,
type,
storageType);
expectGetVds(db, VDS_ID);
BackendInternal backend = null;
if (storageType == StorageType.LOCALFS) {
expectGetIsAttached(db, STORAGE_DOMAIN_ID, STORAGE_POOL_ID);
if (backend == null) {
backend = setUpBackend();
}
expectDetach(backend, STORAGE_DOMAIN_ID, STORAGE_POOL_ID);
}
if (format || (type != StorageDomainType.ISO && type != StorageDomainType.ImportExport)) {
setUpStorageHelper(dom, storageType, true, failure);
if (backend == null) {
backend = setUpBackend();
}
VDSBrokerFrontend vdsBroker = expectFormat(setUpVdsBroker(backend), failure);
if (storageType == StorageType.ISCSI) {
expectRemove(vdsBroker);
}
} else {
setUpStorageHelper(dom, storageType, false, false);
}
if (!failure) {
expectRemoveFromDb(db, STORAGE_DOMAIN_ID);
}
expectBusinessEntitySnapshotDAO(db);
expectConfigGetValue();
RemoveStorageDomainCommand cmd = new RemoveStorageDomainCommand(getParams(format));
cmd.executeCommand();
checkSucceeded(cmd, !failure);
checkMessages(cmd);
}
private void expectConfigGetValue() {
PowerMockito.mockStatic(Config.class);
Mockito.when(Config.GetValue(eq(ConfigValues.IsNeedSupportForOldVgAPI), any(String.class)))
.thenReturn(Boolean.TRUE);
}
protected VDSBrokerFrontend setUpVdsBroker(BackendInternal backend) {
VDSBrokerFrontend vdsBroker = mock(VDSBrokerFrontend.class);
when(backend.getResourceManager()).thenReturn(vdsBroker);
return vdsBroker;
}
protected VDSBrokerFrontend expectRemove(VDSBrokerFrontend vdsBroker) {
VDSReturnValue ret = new VDSReturnValue();
ret.setSucceeded(true);
when(vdsBroker.RunVdsCommand(eq(VDSCommandType.RemoveVG),
any(RemoveVGVDSCommandParameters.class))).thenReturn(ret);
return vdsBroker;
}
protected IStorageHelper setUpStorageHelper(storage_domains dom,
StorageType storageType,
boolean connect,
boolean failure) {
StorageHelperDirector director = mock(StorageHelperDirector.class);
when(StorageHelperDirector.getInstance()).thenReturn(director);
IStorageHelper helper = mock(IStorageHelper.class);
if (connect) {
when(helper.ConnectStorageToDomainByVdsId(dom, VDS_ID)).thenReturn(true);
when(helper.DisconnectStorageFromDomainByVdsId(dom, VDS_ID)).thenReturn(true);
}
if (!failure) {
when(helper.StorageDomainRemoved(dom.getStorageStaticData())).thenReturn(true);
}
when(director.getItem(storageType)).thenReturn(helper);
return helper;
}
protected RemoveStorageDomainParameters getParams(boolean format) {
RemoveStorageDomainParameters params = new RemoveStorageDomainParameters(STORAGE_DOMAIN_ID);
params.setStoragePoolId(STORAGE_POOL_ID);
params.setVdsId(VDS_ID);
params.setDoFormat(format);
return params;
}
protected storage_domains expectGetStorageDomain(DbFacade db,
Guid domId,
Guid poolId,
StorageDomainType type,
StorageType storageType) {
StorageDomainDAO dao = mock(StorageDomainDAO.class);
when(db.getStorageDomainDAO()).thenReturn(dao);
storage_domains dom = getStorageDomain(domId, poolId, type, storageType);
when(dao.getForStoragePool(domId, poolId)).thenReturn(dom);
return dom;
}
protected void expectGetStorageDomainStatic(DbFacade db, Guid domId) {
StorageDomainStaticDAO dao = mock(StorageDomainStaticDAO.class);
when(db.getStorageDomainStaticDAO()).thenReturn(dao);
when(dao.get(domId)).thenReturn(getStorageDomainStatic(domId));
}
protected void expectGetStoragePool(DbFacade db, Guid id) {
StoragePoolDAO dao = mock(StoragePoolDAO.class);
when(db.getStoragePoolDAO()).thenReturn(dao);
when(dao.get(id)).thenReturn(getStoragePool(id));
}
protected void expectGetIsoMap(DbFacade db, Guid id) {
ArrayList<storage_pool_iso_map> ret = new ArrayList<storage_pool_iso_map>();
StoragePoolIsoMapDAO dao = mock(StoragePoolIsoMapDAO.class);
when(db.getStoragePoolIsoMapDAO()).thenReturn(dao);
when(dao.getAllForStorage(id)).thenReturn(ret);
}
protected void expectGetVds(DbFacade db, Guid id) {
VdsDAO dao = mock(VdsDAO.class);
when(db.getVdsDAO()).thenReturn(dao);
when(dao.get(id)).thenReturn(getVds(id));
}
protected void expectGetIsAttached(DbFacade db, Guid id, Guid poolId) {
StoragePoolIsoMapDAO dao = mock(StoragePoolIsoMapDAO.class);
when(db.getStoragePoolIsoMapDAO()).thenReturn(dao);
when(dao.get(new StoragePoolIsoMapId(id, poolId))).thenReturn(new storage_pool_iso_map());
}
protected void expectDetach(BackendInternal backend, Guid id, Guid poolId) {
VdcReturnValueBase ret = new VdcReturnValueBase();
ret.setSucceeded(true);
when(backend.runInternalAction(eq(VdcActionType.DetachStorageDomainFromPool),
any(DetachStorageDomainFromPoolParameters.class))).thenReturn(ret);
}
protected VDSBrokerFrontend expectFormat(VDSBrokerFrontend vdsBroker, boolean failure) {
VDSReturnValue ret = new VDSReturnValue();
ret.setSucceeded(!failure);
when(vdsBroker.RunVdsCommand(eq(VDSCommandType.FormatStorageDomain),
any(FormatStorageDomainVDSCommandParameters.class))).thenReturn(ret);
return vdsBroker;
}
protected void expectBusinessEntitySnapshotDAO(DbFacade db) {
BusinessEntitySnapshotDAO dao = mock(BusinessEntitySnapshotDAO.class);
when(db.getBusinessEntitySnapshotDAO()).thenReturn(dao);
}
protected void expectRemoveStaticFromDb(DbFacade db, Guid id) {
StorageDomainStaticDAO dao = mock(StorageDomainStaticDAO.class);
when(db.getStorageDomainStaticDAO()).thenReturn(dao);
// dao.remove(id);
}
protected void expectRemoveDynamicFromDb(DbFacade db, Guid id) {
StorageDomainDynamicDAO dao = mock(StorageDomainDynamicDAO.class);
when(db.getStorageDomainDynamicDAO()).thenReturn(dao);
// dao.remove(id);
}
protected void expectRemoveFromDb(DbFacade db, Guid id) {
expectRemoveDynamicFromDb(db, id);
expectRemoveStaticFromDb(db, id);
}
protected storage_domains getStorageDomain(Guid id,
Guid poolId,
StorageDomainType type,
StorageType storageType) {
storage_domains dom = new storage_domains();
dom.setid(id);
dom.setstorage_pool_id(poolId);
dom.setstorage_domain_type(type);
dom.setstorage_type(storageType);
dom.setstorage_domain_shared_status(StorageDomainSharedStatus.Unattached);
return dom;
}
protected storage_domain_static getStorageDomainStatic(Guid id) {
storage_domain_static dom = new storage_domain_static();
dom.setId(id);
return dom;
}
protected storage_pool getStoragePool(Guid id) {
storage_pool pool = new storage_pool();
pool.setId(id);
return pool;
}
protected VDS getVds(Guid id) {
VDS vds = new VDS();
vds.setvds_id(id);
vds.setvds_group_compatibility_version(new Version(2, 2));
return vds;
}
}