package org.ovirt.engine.core.bll.storage;
import org.ovirt.engine.core.bll.Backend;
import org.ovirt.engine.core.common.action.ReconstructMasterParameters;
import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.compat.TransactionScopeOption;
public class HandleFailedStorageDomainCommand<T extends StorageDomainPoolParametersBase> extends
StorageDomainCommandBase<T> {
private static final String STORAGE_DOMAIN_DOES_NOT_EXIST_MSG = "Storage domain %1$s does not exist";
public HandleFailedStorageDomainCommand(T parameters) {
super(parameters);
}
@Override
protected boolean canDoAction() {
// This code is added in order to minimize a race which is described in
// https://bugzilla.redhat.com/show_bug.cgi?id=702432
// A race condition between HandleFailedStorageDomain and RemoveStorageDomainbool
return super.canDoAction() && CheckStorageDomain();
}
@Override
protected void executeCommand() {
// Performing here a double check to see that storage is not null at beginning of execution.
// As this code happens in negative flows which are more rare than positive flows, the penalty for
// accessing the DB is less painful.
if (!checkStorageDomainInDb()) {
setSucceeded(false);
log.error(String.format(STORAGE_DOMAIN_DOES_NOT_EXIST_MSG, getStorageDomain().getid()));
return;
}
StorageDomainParametersBase localParameters = (StorageDomainParametersBase) getParameters();
if (getStorageDomain().getstorage_domain_type() == StorageDomainType.Master) {
// send required new and set succeeded to true
// in order not to fail calling commands in case this failed
ReconstructMasterParameters reconstructParameters = new ReconstructMasterParameters(
localParameters.getStoragePoolId(), localParameters.getStorageDomainId(), true);
reconstructParameters.setTransactionScopeOption(TransactionScopeOption.RequiresNew);
Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain, reconstructParameters);
setSucceeded(true);
} else {
localParameters.setIsInternal(true);
setSucceeded(Backend.getInstance()
.runInternalAction(VdcActionType.DeactivateStorageDomain, localParameters).getSucceeded());
}
}
private LogCompat log = LogFactoryCompat.getLog(getClass());
}