package org.ovirt.engine.core.vdsbroker.vdsbroker; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.vdscommands.DestroyVmVDSCommandParameters; public class DestroyVDSCommand<P extends DestroyVmVDSCommandParameters> extends VdsBrokerCommand<P> { public DestroyVDSCommand(P parameters) { super(parameters); } @Override protected void executeVdsBrokerCommand() { if (getParameters().getGracefully()) { status = getBroker().shutdown(getParameters().getVmId().toString(), String.valueOf(getParameters().getSecondsToWait()), Config.getValue(ConfigValues.VmGracefulShutdownMessage)); } else { status = getBroker().destroy(getParameters().getVmId().toString()); } proceedProxyReturnValue(); } /** * Overridden to improve error handling after Cancel Migration. * Swallow error message if * a VM is reported as Down on destination but was already destroyed by VDSM * * The noVM error message will be still logged if * - source sets VM as UP * - and report of Down VMs is received from destination afterwards */ @Override protected void proceedProxyReturnValue() { EngineError returnStatus = getReturnValueFromStatus(getReturnStatus()); switch (returnStatus) { case noVM: if (getParameters().isIgnoreNoVm()) {// do not log error log.info("Failed to destroy VM '{}' because VM does not exist, ignoring", getParameters().getVmId()); return; } log.info("Destroy VM couldn't find VM '{}'. If after Cancel Migration and VM is UP on source, " + "ignore next error, it's just a clean-up call", getParameters().getVmId()); // do not break here default: super.proceedProxyReturnValue(); } } }