package org.ovirt.engine.core.vdsbroker;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
import org.ovirt.engine.core.common.businessentities.VmNetworkStatistics;
import org.ovirt.engine.core.common.vdscommands.DestroyVmVDSCommandParameters;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dal.dbbroker.generic.RepositoryException;
import org.ovirt.engine.core.utils.transaction.TransactionMethod;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
import org.ovirt.engine.core.vdsbroker.vdsbroker.DestroyVDSCommand;
public class DestroyVmVDSCommand<P extends DestroyVmVDSCommandParameters> extends VdsIdVDSCommandBase<P> {
public DestroyVmVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void ExecuteVdsIdCommand() {
if (_vdsManager != null) {
final DestroyVmVDSCommandParameters parameters = getParameters();
ResourceManager.getInstance().RemoveAsyncRunningVm(parameters.getVmId());
final VM curVm = DbFacade.getInstance().getVmDAO().getById(parameters.getVmId());
DestroyVDSCommand<DestroyVmVDSCommandParameters> vdsBrokerCommand =
new DestroyVDSCommand<DestroyVmVDSCommandParameters>(parameters);
vdsBrokerCommand.Execute();
if (vdsBrokerCommand.getVDSReturnValue().getSucceeded()) {
if (curVm.getstatus() == VMStatus.Down) {
getVDSReturnValue().setReturnValue(VMStatus.Down);
}
// Updating the DB
ResourceManager.getInstance().InternalSetVmStatus(curVm,
parameters.getGracefully() ? VMStatus.PoweringDown : VMStatus.Down);
TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
@Override
public Void runInTransaction() {
try {
curVm.guestLogoutTimeTreatmentAfterDestroy();
// SaveVmDynamicToDBThreaded(curVm);
DbFacade.getInstance().getVmDynamicDAO().update(curVm.getDynamicData());
DbFacade.getInstance().getVmStatisticsDAO().update(curVm.getStatisticsData());
List<VmNetworkInterface> interfaces = curVm.getInterfaces();
if (interfaces != null && interfaces.size() > 0) {
for (VmNetworkInterface ifc : interfaces) {
VmNetworkStatistics stats = ifc.getStatistics();
DbFacade.getInstance().getVmNetworkStatisticsDAO().update(stats);
}
}
// if using stop then call to ProcessOnVmStop because
// will not be called from UpdateRunTimeInfo
if (!parameters.getGracefully()) {
ResourceManager.getInstance()
.getEventListener()
.ProcessOnVmStop(curVm.getvm_guid());
}
} catch (RepositoryException ex) {
log.errorFormat(
"VDS::destroy Failed to update vds status in database, vds = {1} : {2}, error = {3}",
getVds().getvds_id(),
getVds().getvds_name(),
ex.getMessage());
log.error("Exception: ", ex);
throw ex;
}
getVds().setmem_commited(getVds().getmem_commited() - curVm.getvm_mem_size_mb());
getVds().setmem_commited(getVds().getmem_commited() - getVds().getguest_overhead());
getVds().setvms_cores_count(getVds().getvms_cores_count() - curVm.getnum_of_cpus());
_vdsManager.UpdateDynamicData(getVds().getDynamicData());
return null;
}
});
getVDSReturnValue().setReturnValue(curVm.getstatus());
} else if (vdsBrokerCommand.getVDSReturnValue().getExceptionObject() != null) {
log.errorFormat("VDS::destroy Failed destroying vm '{0}' in vds = {1} : {2}, error = {3}",
parameters.getVmId(),
getVds().getvds_id(),
getVds().getvds_name(),
vdsBrokerCommand
.getVDSReturnValue().getExceptionString());
getVDSReturnValue().setSucceeded(false);
getVDSReturnValue().setExceptionString(vdsBrokerCommand.getVDSReturnValue()
.getExceptionString());
getVDSReturnValue().setExceptionObject(vdsBrokerCommand.getVDSReturnValue()
.getExceptionObject());
getVDSReturnValue().setVdsError(vdsBrokerCommand.getVDSReturnValue().getVdsError());
}
} else {
getVDSReturnValue().setSucceeded(false);
}
}
private static LogCompat log = LogFactoryCompat.getLog(DestroyVmVDSCommand.class);
}