package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.FenceVdsActionParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.vdscommands.UpdateVdsVMsClearedVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.VdcBllMessages;
@NonTransactiveCommandAttribute
public class StopVdsCommand<T extends FenceVdsActionParameters> extends FenceVdsBaseCommand<T> {
public StopVdsCommand(T parameters) {
super(parameters);
}
@Override
protected boolean canDoAction() {
boolean retValue = true;
if (getParameters().getParentCommand() == VdcActionType.Unknown) {
retValue = super.canDoAction();
if (getVds() != null && getVds().getstatus() != VDSStatus.Maintenance) {
addCanDoActionMessage(VdcBllMessages.VDS_STATUS_NOT_VALID_FOR_STOP);
retValue = false;
}
}
return retValue;
}
@Override
protected void setStatus() {
VDSStatus newStatus = VDSStatus.Down;
if (getParameters().getParentCommand() == VdcActionType.RestartVds) {
// In case the stop was issued as a result of VDS command , we
// cannot set the VDS to down -
// According to bug fix #605215 it can be that backend will crash
// during restart, and upon restart, all down VDS are not
// monitored. Instead, we will set the status to rebooting
newStatus = VDSStatus.Reboot;
}
setStatus(newStatus);
}
@Override
protected void HandleError() {
addCanDoActionMessage(VdcBllMessages.VDS_FENCING_OPERATION_FAILED);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__HOST);
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__STOP);
log.errorFormat("Failed to run StopVdsCommand on vds :{0}", getVdsName());
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_VDS_STOP : AuditLogType.USER_FAILED_VDS_STOP;
}
@Override
protected void handleSpecificCommandActions() {
if (mVmList.size() > 0) {
RestartVdsVms();
Backend.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.UpdateVdsVMsCleared,
new UpdateVdsVMsClearedVDSCommandParameters(getVds().getvds_id()));
}
}
private static LogCompat log = LogFactoryCompat.getLog(StopVdsCommand.class);
@Override
protected int getRerties() {
return Config.<Integer> GetValue(ConfigValues.FenceStopStatusRetries);
}
@Override
protected int getDelayInSeconds() {
return Config.<Integer> GetValue(ConfigValues.FenceStopStatusDelayBetweenRetriesInSec);
}
}