package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.ReconstructMasterParameters; import org.ovirt.engine.core.common.action.StorageDomainParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.vdscommands.DetachStorageDomainVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters; 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.compat.TransactionScopeOption; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class ForceRemoveStorageDomainCommand<T extends StorageDomainParametersBase> extends StorageDomainCommandBase<T> { public ForceRemoveStorageDomainCommand(T parameters) { super(parameters); setVdsId(parameters.getVdsId()); } @Override protected void executeCommand() { if (getStoragePool() != null) { try { // if master try to reconstruct if (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master) { ReconstructMasterParameters tempVar = new ReconstructMasterParameters(getStoragePool().getId(), getStorageDomain().getid(), true); tempVar.setTransactionScopeOption(TransactionScopeOption.RequiresNew); Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain, tempVar); } // try to force detach first DetachStorageDomainVDSCommandParameters tempVar2 = new DetachStorageDomainVDSCommandParameters( getStoragePool().getId(), getStorageDomain().getid(), Guid.Empty, -1); tempVar2.setForce(true); Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.DetachStorageDomain, tempVar2); } catch (RuntimeException ex) { log.errorFormat("Could not force detach storage domain {0}. error: {1}", getStorageDomain() .getstorage_name(), ex.toString()); } } StorageHelperDirector.getInstance().getItem(getStorageDomain().getstorage_type()) .StorageDomainRemoved(getStorageDomain().getStorageStaticData()); DbFacade.getInstance().getStorageDomainDAO().remove(getStorageDomain().getid()); if (getStoragePool() != null) { // if iso reset path for pool if (getStorageDomain().getstorage_domain_type() == StorageDomainType.ISO) { // todo: when iso in multiple pools will be implemented, we // should reset iso path for all related pools Backend.getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.ResetISOPath, new IrsBaseVDSCommandParameters(getStoragePool().getId())); } if (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master) { CalcStoragePoolStatusByDomainsStatus(); } } setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_FORCE_REMOVE_STORAGE_DOMAIN : AuditLogType.USER_FORCE_REMOVE_STORAGE_DOMAIN_FAILED; } @Override protected boolean canDoAction() { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__DESTROY_DOMAIN); boolean returnValue = super.canDoAction() && CheckStorageDomain() && (getStorageDomain().getstorage_domain_shared_status() == StorageDomainSharedStatus.Unattached || CheckStorageDomainStatusNotEqual(StorageDomainStatus.Active)); if (returnValue && getStorageDomain().getstorage_domain_type() == StorageDomainType.Master && getStoragePool() != null) { if (electNewMaster() == null) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_DESTROY_LAST_STORAGE_DOMAIN); } else if (!InitializeVds()) { returnValue = false; addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_DESTROY_LAST_STORAGE_DOMAIN_HOST_NOT_ACTIVE); } } return returnValue; } private static LogCompat log = LogFactoryCompat.getLog(ForceRemoveStorageDomainCommand.class); }