package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.FenceVdsActionParameters;
import org.ovirt.engine.core.common.action.FenceVdsManualyParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.FenceActionType;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.vdscommands.SetVdsStatusVDSCommandParameters;
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.utils.transaction.TransactionMethod;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
public class RestartVdsCommand<T extends FenceVdsActionParameters> extends FenceVdsBaseCommand<T> {
protected List<VM> getVmList() {
return mVmList;
}
/**
* Constructor for command creation when compensation is applied on startup
*
* @param commandId
*/
protected RestartVdsCommand(Guid commandId) {
super(commandId);
}
public RestartVdsCommand(T parameters) {
super(parameters);
}
/**
* Restart action is implemented by issuing stop followed by start
*/
@Override
protected void executeCommand() {
VdcReturnValueBase returnValueBase;
final Guid vdsId = getVdsId();
final String sessionId = getParameters().getSessionId();
// execute StopVds action
returnValueBase = executeVdsFenceAction(vdsId, sessionId, FenceActionType.Stop, VdcActionType.StopVds);
if (returnValueBase.getSucceeded()) {
executeFenceVdsManulalyAction(vdsId, sessionId);
// execute StartVds action
returnValueBase = executeVdsFenceAction(vdsId, sessionId, FenceActionType.Start, VdcActionType.StartVds);
setSucceeded(returnValueBase.getSucceeded());
setFencingSucceeded(getSucceeded());
} else {
setSucceeded(false);
}
}
private void executeFenceVdsManulalyAction(final Guid vdsId, String sessionId) {
FenceVdsManualyParameters fenceVdsManuallyParams = new FenceVdsManualyParameters(false);
fenceVdsManuallyParams.setStoragePoolId(getVds().getstorage_pool_id());
fenceVdsManuallyParams.setVdsId(vdsId);
fenceVdsManuallyParams.setShouldBeLogged(false);
fenceVdsManuallyParams.setSessionId(sessionId);
// if fencing succeeded, call to reset irs in order to try select new spm
Backend.getInstance().runInternalAction(VdcActionType.FenceVdsManualy, fenceVdsManuallyParams);
}
private VdcReturnValueBase executeVdsFenceAction(final Guid vdsId,
String sessionId,
FenceActionType fenceAction,
VdcActionType action) {
FenceVdsActionParameters params = new FenceVdsActionParameters(vdsId, fenceAction);
params.setParentCommand(VdcActionType.RestartVds);
params.setSessionId(sessionId);
return Backend.getInstance().runInternalAction(action, params);
}
/**
* If failed to restart the host, move its status to NonResponsive
*/
@Override
public void Rollback() {
super.Rollback();
final Guid vdsId = getVdsId();
log.warnFormat("Restart host action failed, updating host {0} to {1}", vdsId, VDSStatus.NonResponsive.name());
TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
@Override
public Void runInTransaction() {
Backend.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.SetVdsStatus,
new SetVdsStatusVDSCommandParameters(vdsId, VDSStatus.NonResponsive));
return null;
}
});
}
@Override
protected void HandleError() {
addCanDoActionMessage(VdcBllMessages.VDS_FENCING_OPERATION_FAILED);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__HOST);
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__RESTART);
log.errorFormat("Failed to run RestartVdsCommand on vds :{0}", getVdsName());
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_VDS_RESTART : AuditLogType.USER_FAILED_VDS_RESTART;
}
private static LogCompat log = LogFactoryCompat.getLog(RestartVdsCommand.class);
@Override
protected int getRerties() {
return 0;
}
@Override
protected int getDelayInSeconds() {
return 0;
}
@Override
protected void handleSpecificCommandActions() {
}
}