package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.action.VmOperationParameterBase; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.compat.NGuid; public abstract class VmOperationCommandBase<T extends VmOperationParameterBase> extends VmCommand<T> { // Serialization id: private static final long serialVersionUID = -5440497411332483108L; // The log: private static final LogCompat log = LogFactoryCompat.getLog(VmOperationCommandBase.class); /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected VmOperationCommandBase(Guid commandId) { super(commandId); } public VmOperationCommandBase(T parameters) { super(parameters); super.setVmId(parameters.getVmId()); } @Override protected void ExecuteVmCommand() { if (GetRunningOnVds()) { Perform(); return; } setActionReturnValue((getVm() != null) ? getVm().getstatus() : VMStatus.Down); } /** * This method checks if the virtual machine is running in some host. It also * has the side effect of storing the reference to the host inside the command. * * @return <code>true</code> if the virtual machine is running in a any host, * <code>false</code> otherwise */ protected boolean GetRunningOnVds() { // We will need the virtual machine and the status, so it is worth saving references: final VM vm = getVm(); final VMStatus status = vm.getstatus(); // If the status of the machine implies that it is not running in a host then // there is no need to find the id of the host: if (!VM.isStatusUpOrPaused(status) && status != VMStatus.NotResponding) { return false; } // Find the id of the host where the machine is running: NGuid hostId = vm.getrun_on_vds(); if (hostId == null) { log.warnFormat("Strange, according to the status \"{0}\" virtual machine \"{1}\" should be running in a host but it isn't.", status, vm.getvm_guid()); return false; } // Find the reference to the host using the id that we got before (setting // the host to null is required in order to make sure that the host is // reloaded from the database): setVdsId(new Guid(hostId.toString())); setVds(null); if (getVds() == null) { log.warnFormat("Strange, virtual machine \"{0}\" is is running in host \"{1}\" but that host can't be found.", vm.getvm_guid(), hostId); return false; } // If we are here everything went right, so the machine is running in // a host: return true; } protected abstract void Perform(); }