package org.ovirt.engine.core.bll.storage; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.common.AuditLogType; 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.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_domains; 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.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class RemoveStorageDomainCommand<T extends RemoveStorageDomainParameters> extends StorageDomainCommandBase<T> { public RemoveStorageDomainCommand(T parameters) { super(parameters); setVdsId(parameters.getVdsId()); } @Override protected void executeCommand() { storage_domains dom = getStorageDomain(); VDS vds = getVds(); boolean format = getParameters().getDoFormat(); setSucceeded(false); if (isLocalFs(dom) && isDomainAttached(dom) && !detachStorage(dom)) { return; } if (!isISO(dom) && !isExport(dom) || format) { if (!ConnectStorage()) { return; } boolean failed = !formatStorage(dom, vds) || !removeStorage(dom, vds); DisconnectStorage(); if (failed) { return; } } getStorageHelper(dom).StorageDomainRemoved(dom.getStorageStaticData()); getDb().getStorageDomainDynamicDAO().remove(dom.getid()); getDb().getStorageDomainStaticDAO().remove(dom.getid()); setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_REMOVE_STORAGE_DOMAIN : AuditLogType.USER_REMOVE_STORAGE_DOMAIN_FAILED; } @Override protected boolean canDoAction() { if (!super.canDoAction()) { return false; } storage_domains dom = getStorageDomain(); VDS vds = getVds(); boolean format = getParameters().getDoFormat(); boolean localFs = isLocalFs(dom); addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REMOVE); if (!CheckStorageDomain() || !checkStorageDomainSharedStatusNotLocked(dom)) { return false; } if (!localFs && !CheckStorageDomainNotInPool()) { return false; } if (localFs && isDomainAttached(dom) && !canDetachDomain(getParameters().getDestroyingPool(), false, true)) { return false; } if (vds == null) { if (localFs) { if (!InitializeVds()) { return false; } } else { addCanDoActionMessage(VdcBllMessages.CANNOT_REMOVE_STORAGE_DOMAIN_INVALID_HOST_ID); return false; } } if (isDataDomain(dom) && !format) { addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_REMOVE_STORAGE_DOMAIN_DO_FORMAT); return false; } return true; } private boolean ConnectStorage() { return getStorageHelper(getStorageDomain()).ConnectStorageToDomainByVdsId(getStorageDomain(), getVds().getvds_id()); } private void DisconnectStorage() { getStorageHelper(getStorageDomain()).DisconnectStorageFromDomainByVdsId(getStorageDomain(), getVds().getvds_id()); } protected DbFacade getDb() { return DbFacade.getInstance(); } protected BackendInternal getBackend() { return Backend.getInstance(); } protected VDSBrokerFrontend getVdsBroker() { return getBackend().getResourceManager(); } protected IStorageHelper getStorageHelper(storage_domains storageDomain) { return StorageHelperDirector.getInstance().getItem(storageDomain.getstorage_type()); } protected boolean isFCP(storage_domains dom) { return dom.getstorage_type() == StorageType.FCP; } protected boolean isISCSI(storage_domains dom) { return dom.getstorage_type() == StorageType.ISCSI; } protected boolean isLocalFs(storage_domains dom) { return dom.getstorage_type() == StorageType.LOCALFS; } protected boolean isDataDomain(storage_domains dom) { return dom.getstorage_domain_type() == StorageDomainType.Data; } protected boolean isISO(storage_domains dom) { return dom.getstorage_domain_type() == StorageDomainType.ISO; } protected boolean isExport(storage_domains dom) { return dom.getstorage_domain_type() == StorageDomainType.ImportExport; } protected boolean isDomainAttached(storage_domains storageDomain) { if (storageDomain.getstorage_pool_id() == null) { return false; } Guid storageDomainId = storageDomain.getid(); Guid storagePoolId = storageDomain.getstorage_pool_id().getValue(); return getDb().getStoragePoolIsoMapDAO() .get(new StoragePoolIsoMapId(storageDomainId, storagePoolId)) != null; } protected boolean detachStorage(storage_domains dom) { Guid domId = dom.getid(); Guid poolId = dom.getstorage_pool_id().getValue(); DetachStorageDomainFromPoolParameters params = new DetachStorageDomainFromPoolParameters(domId, poolId); params.setDestroyingPool(getParameters().getDestroyingPool()); return getBackend() .runInternalAction(VdcActionType.DetachStorageDomainFromPool, params).getSucceeded(); } protected boolean formatStorage(storage_domains dom, VDS vds) { return getVdsBroker() .RunVdsCommand(VDSCommandType.FormatStorageDomain, new FormatStorageDomainVDSCommandParameters(vds.getvds_id(), dom.getid())).getSucceeded(); } @SuppressWarnings("deprecation") protected boolean removeStorage(storage_domains dom, VDS vds) { if (Config.<Boolean> GetValue(ConfigValues.IsNeedSupportForOldVgAPI, vds.getvds_group_compatibility_version().getValue()) && (isFCP(dom) || isISCSI(dom))) { return getVdsBroker() .RunVdsCommand(VDSCommandType.RemoveVG, new RemoveVGVDSCommandParameters(vds.getvds_id(), dom.getstorage())).getSucceeded(); } return true; } }