package org.ovirt.engine.core.bll;
import java.util.Collections;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.RunVmParams;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdsActionParameters;
import org.ovirt.engine.core.common.businessentities.VDSStatus;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmsComparer;
import org.ovirt.engine.core.common.vdscommands.SetVmStatusVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.UpdateVdsVMsClearedVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public class ClearNonResponsiveVdsVmsCommand<T extends VdsActionParameters> extends VdsCommand<T> {
/**
* Constructor for command creation when compensation is applied on startup
*
* @param commandId
*/
protected ClearNonResponsiveVdsVmsCommand(Guid commandId) {
super(commandId);
}
public ClearNonResponsiveVdsVmsCommand(T parameters) {
super(parameters);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_CLEAR_UNKNOWN_VMS : AuditLogType.USER_FAILED_CLEAR_UNKNOWN_VMS;
}
@Override
protected void executeCommand() {
List<VM> vms = DbFacade.getInstance().getVmDAO().getAllRunningForVds(getVdsId());
Collections.sort(vms, Collections.reverseOrder(new VmsComparer()));
java.util.ArrayList<VdcActionParametersBase> runVmParamsList =
new java.util.ArrayList<VdcActionParametersBase>();
for (VM vm : vms) {
if (vm.getauto_startup()) {
runVmParamsList.add(new RunVmParams(vm.getvm_guid()));
}
VDSReturnValue returnValue = Backend
.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.SetVmStatus,
new SetVmStatusVDSCommandParameters(vm.getvm_guid(), VMStatus.Down));
// Write that this VM was shut down by host rebbot or manual fence
if (returnValue != null && returnValue.getSucceeded()) {
LogSettingVmToDown(getVds().getvds_id(), vm.getvm_guid());
}
VmPoolHandler.ProcessVmPoolOnStopVm(vm.getvm_guid());
}
Backend.getInstance()
.getResourceManager()
.RunVdsCommand(VDSCommandType.UpdateVdsVMsCleared,
new UpdateVdsVMsClearedVDSCommandParameters(getVdsId()));
if (runVmParamsList.size() > 0) {
Backend.getInstance().runInternalMultipleActions(VdcActionType.RunVm, runVmParamsList);
}
setSucceeded(true);
}
@Override
protected boolean canDoAction() {
boolean returnValue = true;
if (getVds() == null) {
addCanDoActionMessage(VdcBllMessages.VDS_INVALID_SERVER_ID);
returnValue = false;
} else if (hasVMs() && getVds().getstatus() != VDSStatus.NonResponsive) {
addCanDoActionMessage(VdcBllMessages.VDS_CANNOT_CLEAR_VMS_WRONG_STATUS);
returnValue = false;
}
return returnValue;
}
private boolean hasVMs() {
List<VM> vms = DbFacade.getInstance().getVmDAO().getAllRunningForVds(getVdsId());
return (vms.size() > 0);
}
}