package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.IsoDomainListSyncronizer; import org.ovirt.engine.core.bll.LockIdNameAttribute; 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.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.ActivateStorageDomainVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; 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; @LockIdNameAttribute(fieldName = "StorageDomainId") @NonTransactiveCommandAttribute(forceCompensation=true) public class ActivateStorageDomainCommand<T extends StorageDomainPoolParametersBase> extends StorageDomainCommandBase<T> { private static LogCompat log = LogFactoryCompat.getLog(ActivateStorageDomainCommand.class); public ActivateStorageDomainCommand(T parameters) { super(parameters); } /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected ActivateStorageDomainCommand(Guid commandId) { super(commandId); } @Override protected boolean canDoAction() { super.canDoAction(); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ACTIVATE); boolean returnValue = CheckStoragePool() && CheckStoragePoolStatusNotEqual(StoragePoolStatus.Uninitialized, VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_STATUS_ILLEGAL) && CheckStorageDomain() && storageDomainStatusIsValid() && (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master || CheckMasterDomainIsUp()); return returnValue; } @Override protected void executeCommand() { final storage_pool_iso_map map = DbFacade.getInstance().getStoragePoolIsoMapDAO().get(new StoragePoolIsoMapId(getParameters().getStorageDomainId(),getParameters().getStoragePoolId())); changeStorageDomainStatusInTransaction(map,StorageDomainStatus.Locked); freeLock(); log.infoFormat("ActivateStorage Domain. Before Connect all hosts to pool. Time:{0}", new java.util.Date()); ConnectAllHostsToPool(); log.infoFormat("ActivateStorage Domain. After Connect all hosts to pool. Time:{0}", new java.util.Date()); setSucceeded(Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.ActivateStorageDomain, new ActivateStorageDomainVDSCommandParameters(getStoragePool().getId(), getStorageDomain() .getid())).getSucceeded()); log.infoFormat("ActivateStorage Domain. After Activate storage domain in vds. Time:{0}", new java.util.Date()); if (getSucceeded()) { RefreshAllVdssInPool(false); log.infoFormat("ActivateStorage Domain. After Refresh all pools . Time:{0}", new java.util.Date()); TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { @Override public Void runInTransaction() { getCompensationContext().snapshotEntityStatus(map, map.getstatus()); map.setstatus(StorageDomainStatus.Active); DbFacade.getInstance().getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getstatus()); if (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master) { CalcStoragePoolStatusByDomainsStatus(); } getCompensationContext().stateChanged(); return null; } }); log.infoFormat("ActivateStorage Domain. After change storage pool status in vds. Time:{0}", new java.util.Date()); if (getStorageDomain().getstorage_domain_type() == StorageDomainType.ISO) { IsoDomainListSyncronizer.getInstance().refresheIsoDomainWhenActivateDomain(getStorageDomain().getid(), getStoragePool().getId()); } } else { compensate(); } } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_ACTIVATED_STORAGE_DOMAIN : AuditLogType.USER_ACTIVATE_STORAGE_DOMAIN_FAILED; } private boolean storageDomainStatusIsValid() { boolean returnValue; if(isInternalExecution()) { returnValue = checkStorageDomainStatus(StorageDomainStatus.InActive, StorageDomainStatus.Unknown, StorageDomainStatus.Locked, StorageDomainStatus.Maintenance); } else { returnValue = checkStorageDomainStatus(StorageDomainStatus.InActive, StorageDomainStatus.Unknown, StorageDomainStatus.Maintenance); } return returnValue; } }