package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.ShutdownVmParameters; import org.ovirt.engine.core.common.action.StopVmParameters; import org.ovirt.engine.core.common.action.StopVmTypeEnum; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.vdscommands.DestroyVmVDSCommandParameters; 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; public class ShutdownVmCommand<T extends ShutdownVmParameters> extends StopVmCommandBase<T> { public ShutdownVmCommand(T shutdownVmParamsData) { super(shutdownVmParamsData); } @Override public AuditLogType getAuditLogTypeValue() { if (getSuspendedVm()) { return getSucceeded() ? AuditLogType.USER_STOP_SUSPENDED_VM : AuditLogType.USER_STOP_SUSPENDED_VM_FAILED; } else { return getSucceeded() ? AuditLogType.USER_INITIATED_SHUTDOWN_VM : AuditLogType.USER_FAILED_SHUTDOWN_VM; } } @Override protected boolean canDoAction() { boolean ret = super.canDoAction(); if (!ret) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__SHUTDOWN); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM); } return ret; } @Override protected void Perform() { log.infoFormat("VmHandler.cs:ShutdownVmCommand:Perform: entered (Desktop {0}).", getVm().getvm_name()); VmHandler.UpdateVmGuestAgentVersion(getVm()); boolean CanShutDown = (getVm().getstatus() == VMStatus.Up) && ((getVm().getacpi_enable() == null ? false : getVm().getacpi_enable()) || getVm().getHasAgent()); if (CanShutDown) // shutting down desktop and waiting for it in a separate thread to // become 'down': { log.infoFormat("VmHandler.cs:ShutdownVmCommand:Perform: sending shutdown command for Desktop {0}.", getVm() .getvm_name()); int secondsToWait = getParameters().getWaitBeforeShutdown() ? Config .<Integer> GetValue(ConfigValues.VmGracefulShutdownTimeout) : 0; // sending a shutdown command to the VM: setActionReturnValue(Backend .getInstance() .getResourceManager() .RunVdsCommand(VDSCommandType.DestroyVm, new DestroyVmVDSCommandParameters(getVdsId(), getVmId(), false, true, secondsToWait)) .getReturnValue()); } else // cannot shutdown -> send a StopVm command instead ('destroy'): { // don't log -> log will appear for the // StopVmCommand we are about to run: setCommandShouldBeLogged(false); log.infoFormat( "VmHandler.cs:ShutdownVmCommand:Perform: Cannot shutdown Desktop {0}, status is not up. Stopping instead.", getVm().getvm_name()); StopVmParameters stopVmParams = new StopVmParameters(getVmId(), StopVmTypeEnum.CANNOT_SHUTDOWN); // stopVmParams.ParametersCurrentUser = CurrentUser; stopVmParams.setSessionId(getParameters().getSessionId()); Backend.getInstance().runInternalAction(VdcActionType.StopVm, stopVmParams); } setSucceeded(true); } private static LogCompat log = LogFactoryCompat.getLog(ShutdownVmCommand.class); }