package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.common.action.RecoveryStoragePoolParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.businessentities.storage_pool_iso_map; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.errors.VdcFault; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.NGuid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.transaction.TransactionMethod; import org.ovirt.engine.core.utils.transaction.TransactionSupport; @NonTransactiveCommandAttribute(forceCompensation = true) public class RecoveryStoragePoolCommand extends ReconstructMasterDomainCommand { /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected RecoveryStoragePoolCommand(Guid commandId) { super(commandId); } public RecoveryStoragePoolCommand(RecoveryStoragePoolParameters parameters) { super(parameters); _newMasterStorageDomainId = getRecoveryStoragePoolParametersData().getNewMasterDomainId(); } private RecoveryStoragePoolParameters getRecoveryStoragePoolParametersData() { VdcActionParametersBase tempVar = getParameters(); return (RecoveryStoragePoolParameters) ((tempVar instanceof RecoveryStoragePoolParameters) ? tempVar : null); } @Override public NGuid getStorageDomainId() { super.setStorageDomainId(getMasterDomainIdFromDb()); return super.getStorageDomainId(); } @Override protected boolean canDoAction() { boolean returnValue = super.canDoAction() && CheckStoragePool(); getReturnValue().getCanDoActionMessages().remove(VdcBllMessages.VAR__ACTION__RECONSTRUCT_MASTER.toString()); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__RECOVER_POOL); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN); if (returnValue) { if (getStoragePool().getstatus() == StoragePoolStatus.Uninitialized) { addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_STATUS_ILLEGAL); return false; } else if (getStorageDomain() != null && getStorageDomain().getstatus() != null && getStorageDomain().getstatus() == StorageDomainStatus.Active) { getReturnValue().getCanDoActionMessages().add( VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2.toString()); returnValue = false; } else if (electNewMaster() != null) { getReturnValue().getCanDoActionMessages().add( VdcBllMessages.STORAGE_POOL_REINITIALIZE_WITH_MORE_THAN_ONE_DATA_DOMAIN.toString()); returnValue = false; } else { storage_domains domain = DbFacade.getInstance().getStorageDomainDAO().get( _newMasterStorageDomainId); if (domain.getstorage_domain_shared_status() != StorageDomainSharedStatus.Unattached) { addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL); returnValue = false; } else if (domain.getstorage_type() != getStoragePool().getstorage_pool_type()) { addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_RECOVERY_STORAGE_POOL_STORAGE_TYPE_MISSMATCH); returnValue = false; } } } return returnValue; } @Override protected void executeCommand() { TransactionSupport.executeInNewTransaction( new TransactionMethod<Object>() { @Override public Object runInTransaction() { storage_pool_iso_map domainPoolMap = new storage_pool_iso_map(getRecoveryStoragePoolParametersData() .getNewMasterDomainId(), getRecoveryStoragePoolParametersData().getStoragePoolId(), StorageDomainStatus.Active); DbFacade.getInstance().getStoragePoolIsoMapDAO().save(domainPoolMap); getCompensationContext().snapshotNewEntity(domainPoolMap); getCompensationContext().stateChanged(); return null; } }); getStoragePool().setstatus(StoragePoolStatus.Problematic); if (StorageHelperDirector.getInstance().getItem(getStorageDomain().getstorage_type()) .ConnectStorageToDomainByVdsId(getNewMaster(), getVds().getvds_id())) { super.executeCommand(); } else { getReturnValue().setFault(new VdcFault(new VdcBLLException(VdcBllErrors.StorageServerConnectionError, "Failed to connect storage"), VdcBllErrors.StorageServerConnectionError)); } } }