package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase; import org.ovirt.engine.core.common.action.StoragePoolWithStoragesParameter; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.storage_pool_iso_map; import org.ovirt.engine.core.common.vdscommands.AttachStorageDomainVDSCommandParameters; 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.TransactionScopeOption; 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 AttachStorageDomainToPoolCommand<T extends StorageDomainPoolParametersBase> extends StorageDomainCommandBase<T> { private storage_pool_iso_map map; public AttachStorageDomainToPoolCommand(T parameters) { super(parameters); } /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected AttachStorageDomainToPoolCommand(Guid commandId) { super(commandId); } @Override protected void executeCommand() { if (getStorageDomain() != null) { if (getStoragePool().getstatus() == StoragePoolStatus.Uninitialized) { StoragePoolWithStoragesParameter parameters = new StoragePoolWithStoragesParameter(getStoragePool(), new java.util.ArrayList<Guid>( java.util.Arrays.asList(new Guid[] { getStorageDomain().getid() })), getParameters().getSessionId()); parameters.setIsInternal(true); parameters.setTransactionScopeOption(TransactionScopeOption.Suppress); setSucceeded(Backend.getInstance() .runInternalAction(VdcActionType.AddStoragePoolWithStorages, parameters, getCompensationContext()) .getSucceeded()); } else { map = DbFacade.getInstance() .getStoragePoolIsoMapDAO().get(new StoragePoolIsoMapId(getStorageDomain().getid(), getParameters().getStoragePoolId())); if (map == null) { TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { @Override public Object runInTransaction() { map = new storage_pool_iso_map(getStorageDomain().getid(), getParameters() .getStoragePoolId(), StorageDomainStatus.Locked); DbFacade.getInstance().getStoragePoolIsoMapDAO().save(map); getCompensationContext().snapshotNewEntity(map); getCompensationContext().stateChanged(); return null; } }); ConnectAllHostsToPool(); VDSReturnValue returnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.AttachStorageDomain, new AttachStorageDomainVDSCommandParameters(getParameters().getStoragePoolId(), getParameters().getStorageDomainId())); DiconnectAllHostsInPool(); TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { @Override public Object runInTransaction() { getCompensationContext().snapshotEntityStatus(map, map.getstatus()); map.setstatus(StorageDomainStatus.InActive); DbFacade.getInstance().getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getstatus()); if (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master) { CalcStoragePoolStatusByDomainsStatus(); } getCompensationContext().stateChanged(); return null; } }); setSucceeded(returnValue.getSucceeded()); } } } } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_ATTACH_STORAGE_DOMAIN_TO_POOL : AuditLogType.USER_ATTACH_STORAGE_DOMAIN_TO_POOL_FAILED; } @Override protected boolean canDoAction() { super.canDoAction(); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH); // We can share only ISO or Export domain , or a data domain // which is not attached. boolean returnValue = CheckStoragePool() && InitializeVds() && CheckStorageDomain() && checkDomainCanBeAttached(getStorageDomain()); if (returnValue && getStoragePool().getstatus() == StoragePoolStatus.Uninitialized && getStorageDomain().getstorage_domain_type() != StorageDomainType.Data) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_ADD_STORAGE_POOL_WITHOUT_DATA_DOMAIN); } if (returnValue && getStoragePool().getstatus() != StoragePoolStatus.Uninitialized) { returnValue = CheckMasterDomainIsUp(); } return returnValue; } }