Hello Gilad Chaplik,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/15816

to review the following change.

Change subject: core: Introduce scheduling package
......................................................................

core: Introduce scheduling package

Move all host selection code into a separate package within
bll.

Remove all bll dependencies from these files.

This is the first part of refactoring host selection and load balancing.

Gerrit-cntr: 1
Change-Id: Icac8f7bc8a696455134bb90ffc17afd420e18dd4
Signed-off-by: Gilad Chaplik <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
D 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
D 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsComparer.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/EvenlyDistributeComparer.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MemoryVdsComparer.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NonWaitingDelayer.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NoneComparer.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PowerSaveComparer.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/RunVmDelayer.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsComparer.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsCpuVdsLoadBalancingAlgorithm.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsFreeMemoryChecker.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancingAlgorithm.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsSelector.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VmCountVdsLoadBalancingAlgorithm.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
24 files changed, 246 insertions(+), 197 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/15816/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
index 54e9105..1353faf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import java.util.List;
 
 import javax.annotation.PostConstruct;
 import javax.ejb.DependsOn;
@@ -7,11 +8,16 @@
 import javax.ejb.Startup;
 
 import org.ovirt.engine.core.bll.gluster.GlusterJobsManager;
+import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.network.MacPoolManager;
 import org.ovirt.engine.core.bll.provider.ExternalTrustStoreInitializer;
+import org.ovirt.engine.core.bll.scheduling.MigrationHandler;
+import org.ovirt.engine.core.bll.scheduling.VdsLoadBalancer;
 import org.ovirt.engine.core.bll.storage.StoragePoolStatusHandler;
-import org.ovirt.engine.core.common.config.Config;
-import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.common.action.MigrateVmToServerParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.utils.customprop.DevicePropertiesUtils;
 import org.ovirt.engine.core.utils.customprop.VmPropertiesUtils;
 import org.ovirt.engine.core.utils.exceptions.InitializationException;
@@ -43,9 +49,19 @@
         AsyncTaskManager.getInstance().InitAsyncTaskManager();
         OvfDataUpdater.getInstance().initOvfDataUpdater();
 
-        if (Config.<Boolean> GetValue(ConfigValues.EnableVdsLoadBalancing)) {
-            VdsLoadBalancer.EnableLoadBalancer();
-        }
+        VdsLoadBalancer.getInstance().setMigrationHandler(new 
MigrationHandler() {
+
+            @Override
+            public void migrateVMs(List<Pair<Guid, Guid>> list) {
+                for (Pair<Guid, Guid> pair : list) {
+                    MigrateVmToServerParameters parameters =
+                            new MigrateVmToServerParameters(false, 
pair.getFirst(), pair.getSecond());
+                    
Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer,
+                            parameters,
+                            ExecutionHandler.createInternalJobContext());
+                }
+            }
+        });
 
         ThreadPoolUtil.execute(new Runnable() {
             @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
index e66b63f..56a3242 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
@@ -3,6 +3,8 @@
 import java.util.List;
 
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
+import org.ovirt.engine.core.bll.scheduling.VdsFreeMemoryChecker;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
 import org.ovirt.engine.core.common.AuditLogType;
@@ -81,6 +83,7 @@
     protected void initVdss() {
         setVdsIdRef(new Guid(getVm().getRunOnVds().toString()));
         setVdsDestinationId(getVdsSelector().getVdsToRunOn(true));
+        VmHandler.UpdateVmGuestAgentVersion(getVm());
         // make _destinationVds null in order to refresh it from db in case it
         // changed.
         _destinationVds = null;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java
deleted file mode 100644
index aeb94a6..0000000
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.ovirt.engine.core.bll;
-
-public class NoneComparer extends EvenlyDistributeComparer {
-}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
index 82a7301..601621b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
@@ -19,6 +19,8 @@
 import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaVdsDependent;
 import org.ovirt.engine.core.bll.quota.QuotaVdsGroupConsumptionParameter;
+import org.ovirt.engine.core.bll.scheduling.VdsFreeMemoryChecker;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.RunVmValidator;
@@ -611,6 +613,7 @@
     protected boolean getVdsToRunOn() {
         // use destination vds or default vds or none
         setVdsId(getVdsSelector().getVdsToRunOn(false));
+        VmHandler.UpdateVmGuestAgentVersion(getVm());
         setVds(null);
         setVdsName(null);
         if (getVdsId().equals(Guid.Empty)) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
index baa8fe7..ec80a8c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
@@ -15,6 +15,8 @@
 import org.ovirt.engine.core.bll.job.ExecutionContext.ExecutionMethod;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.job.JobRepositoryFactory;
+import org.ovirt.engine.core.bll.scheduling.RunVmDelayer;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StorageHelperDirector;
 import org.ovirt.engine.core.common.action.VmOperationParameterBase;
@@ -23,7 +25,6 @@
 import org.ovirt.engine.core.common.businessentities.LunDisk;
 import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
 import org.ovirt.engine.core.common.businessentities.VDS;
-import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
@@ -83,61 +84,6 @@
      */
     private List<Guid> getRunVdssList() {
         return getVdsSelector().getRunVdssList();
-    }
-
-    /**
-     * Check if the given host has enough CPU to run the VM, without exceeding 
the high utilization threshold.
-     *
-     * @param vds
-     *            The host to check.
-     * @param vm
-     *            The VM to check.
-     * @return Does this host has enough CPU (without exceeding the threshold) 
to run the VM.
-     */
-    public static boolean hasCpuToRunVM(VDS vds, VM vm) {
-        if (vds.getUsageCpuPercent() == null || vm.getUsageCpuPercent() == 
null) {
-            return false;
-        }
-
-        // The predicted CPU is actually the CPU that the VM will take 
considering how many cores it has and now many
-        // cores the host has. This is why we take both parameters into 
consideration.
-        int predictedVmCpu = (vm.getUsageCpuPercent() * vm.getNumOfCpus()) / 
VdsSelector.getEffectiveCpuCores(vds);
-        boolean result = vds.getUsageCpuPercent() + predictedVmCpu <= 
vds.getHighUtilization();
-        if (log.isDebugEnabled()) {
-            log.debugFormat("Host {0} has {1}% CPU load; VM {2} is predicted 
to have {3}% CPU load; " +
-                    "High threshold is {4}%. Host is {5}suitable in terms of 
CPU.",
-                    vds.getName(),
-                    vds.getUsageCpuPercent(),
-                    vm.getName(),
-                    predictedVmCpu,
-                    vds.getHighUtilization(),
-                    (result ? "" : "not "));
-        }
-
-        return result;
-    }
-
-    public static boolean hasMemoryToRunVM(VDS curVds, VM vm) {
-        boolean retVal = false;
-        if (curVds.getMemCommited() != null && curVds.getPhysicalMemMb() != 
null && curVds.getReservedMem() != null) {
-            double vdsCurrentMem =
-                    curVds.getMemCommited() + curVds.getPendingVmemSize() + 
curVds.getGuestOverhead() + curVds
-                            .getReservedMem() + vm.getMinAllocatedMem();
-            double vdsMemLimit = curVds.getMaxVdsMemoryOverCommit() * 
curVds.getPhysicalMemMb() / 100.0;
-            if (log.isDebugEnabled()) {
-                log.debugFormat("hasMemoryToRunVM: host {0} pending vmem size 
is : {1} MB",
-                        curVds.getName(),
-                        curVds.getPendingVmemSize());
-                log.debugFormat("Host Mem Conmmitted: {0}, Host Reserved Mem: 
{1}, Host Guest Overhead {2}, VM Min Allocated Mem {3}",
-                        curVds.getMemCommited(),
-                        curVds.getReservedMem(),
-                        curVds.getGuestOverhead(),
-                        vm.getMinAllocatedMem());
-                log.debugFormat("{0} <= ???  {1}", vdsCurrentMem, vdsMemLimit);
-            }
-            retVal = (vdsCurrentMem <= vdsMemLimit);
-        }
-        return retVal;
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsComparer.java
deleted file mode 100644
index f7f4bef..0000000
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsComparer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.ovirt.engine.core.bll;
-
-import org.ovirt.engine.core.common.businessentities.VDS;
-import org.ovirt.engine.core.common.businessentities.VM;
-import org.ovirt.engine.core.common.businessentities.VdsSelectionAlgorithm;
-import org.ovirt.engine.core.compat.NotImplementedException;
-
-/**
- * Base class for comparing between vdss
- */
-public abstract class VdsComparer {
-    /**
-     * Factory method, creates necessary comparer
-     *
-     * @return
-     */
-    public static VdsComparer CreateComparer(VdsSelectionAlgorithm 
selectionAlgorithm) {
-        switch (selectionAlgorithm) {
-        case EvenlyDistribute:
-            return new EvenlyDistributeComparer();
-        case PowerSave:
-            return new PowerSaveComparer();
-        case None:
-            return new NoneComparer();
-        default:
-            throw new NotImplementedException("Uknown type of selection 
algorithm: " + selectionAlgorithm);
-        }
-        // try
-        // {
-        // //return AppDomain.CurrentDomain.CreateInstanceAndUnwrap("VdcBLL",
-        // GetComparerTypeName(selectionAlgorithm)) as VdsComparer;
-        // java.lang.Class type =
-        // java.lang.Class.forName(GetComparerTypeName(selectionAlgorithm));
-        // //type.GetConstructor(BindingFlags.Instance | 
BindingFlags.NonPublic,
-        // null,
-        // // CallingConventions.HasThis, null, null);
-        // java.lang.reflect.Constructor info = type.getConstructors()[0];
-        // Object TempAsCast = info.newInstance(null);
-        // return (VdsComparer)((TempAsCast instanceof VdsComparer) ? 
TempAsCast
-        // : null);
-        // //return new BestDistributionComparer();
-        // }
-        // catch (Exception ex)
-        // {
-        // throw new ApplicationException("JTODO unhandled exception", ex);
-        // }
-    }
-
-    // private static String GetComparerTypeName(VdsSelectionAlgorithm
-    // selectionAlgorithm)
-    // {
-    // return String.format("%1$s.%2$s%3$s",
-    // "VdcBLL",selectionAlgorithm.toString(), "Comparer");
-    // }
-    /**
-     * Base abstract function for finish best Vds treatment
-     *
-     * @param x
-     */
-    public abstract void BestVdsProcedure(VDS x);
-
-    /**
-     * Base abstract function to compare between two VDSs
-     *
-     * @param x
-     * @param y
-     * @param vm
-     * @return
-     */
-    public abstract boolean IsBetter(VDS x, VDS y, VM vm);
-}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
index fd4ba8b..b3cd76f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
@@ -5,6 +5,9 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import org.ovirt.engine.core.bll.scheduling.NonWaitingDelayer;
+import org.ovirt.engine.core.bll.scheduling.VdsFreeMemoryChecker;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/EvenlyDistributeComparer.java
similarity index 90%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/EvenlyDistributeComparer.java
index 13e5356..799152f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/EvenlyDistributeComparer.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -19,7 +19,7 @@
     }
 
     @Override
-    public boolean IsBetter(VDS x, VDS y, VM vm) {
+    public boolean isBetter(VDS x, VDS y, VM vm) {
         if (VdsSelector.getEffectiveCpuCores(x) == null
                 || VdsSelector.getEffectiveCpuCores(y) == null
                 || x.getUsageCpuPercent() == null
@@ -34,6 +34,6 @@
     }
 
     @Override
-    public void BestVdsProcedure(VDS x) {
+    public void bestVdsProcedure(VDS x) {
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MemoryVdsComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MemoryVdsComparer.java
similarity index 73%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MemoryVdsComparer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MemoryVdsComparer.java
index a600e45..cd59d89 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MemoryVdsComparer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MemoryVdsComparer.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -8,13 +8,13 @@
  */
 public class MemoryVdsComparer extends VdsComparer {
     @Override
-    public boolean IsBetter(VDS x, VDS y, VM vm) {
+    public boolean isBetter(VDS x, VDS y, VM vm) {
         return ((x.getPhysicalMemMb() - x.getMemCommited()) < 
(y.getPhysicalMemMb() - y.getMemCommited()));
 
     }
 
     @Override
-    public void BestVdsProcedure(VDS x) {
+    public void bestVdsProcedure(VDS x) {
 
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java
new file mode 100644
index 0000000..7e53bfc
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java
@@ -0,0 +1,14 @@
+package org.ovirt.engine.core.bll.scheduling;
+
+import java.util.List;
+
+import org.ovirt.engine.core.common.utils.Pair;
+import org.ovirt.engine.core.compat.Guid;
+
+public interface MigrationHandler {
+    /**
+     * this method holds a list of pairs VM id and Host id. each VM should be 
migrated to the specified Host
+     * @param list
+     */
+    void migrateVMs(List<Pair<Guid, Guid>> list);
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NonWaitingDelayer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NonWaitingDelayer.java
similarity index 85%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NonWaitingDelayer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NonWaitingDelayer.java
index 8e600fc..5981327 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NonWaitingDelayer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NonWaitingDelayer.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.ovirt.engine.core.compat.Guid;
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NoneComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NoneComparer.java
new file mode 100644
index 0000000..ea548e6
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/NoneComparer.java
@@ -0,0 +1,5 @@
+package org.ovirt.engine.core.bll.scheduling;
+
+
+public final class NoneComparer extends EvenlyDistributeComparer {
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PowerSaveComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PowerSaveComparer.java
similarity index 83%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PowerSaveComparer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PowerSaveComparer.java
index 125dd90..128f4b8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PowerSaveComparer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PowerSaveComparer.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -11,7 +11,7 @@
 public class PowerSaveComparer extends EvenlyDistributeComparer {
 
     @Override
-    public boolean IsBetter(VDS x, VDS y, VM vm) {
+    public boolean isBetter(VDS x, VDS y, VM vm) {
 
         boolean returnValue = false;
 
@@ -23,7 +23,7 @@
                 returnValue = true;
             }
         } else if (!y_has_zero) {
-            return super.IsBetter(x, y, vm);
+            return super.isBetter(x, y, vm);
         }
         return returnValue;
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/RunVmDelayer.java
similarity index 77%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/RunVmDelayer.java
index 884749b..131b156 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/RunVmDelayer.java
@@ -1,9 +1,9 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.ovirt.engine.core.compat.Guid;
 
 /**
- * Some commands e.g RunVm may run as a bulk AKA {@link MultipleActionsRunner} 
and performs logic to <br>
+ * Some commands e.g RunVm may run as a bulk and performs logic to <br>
  * count and reserve memory and CPU to assure there are both enough resources 
to complete them<br>
  * (i.e run a VM on a selected host) and that we don't exceed those for the 
subsequent executions.<br>
  * Moreover bulk operations may cause a pick in VDSM resources utilization and 
the engine can regulate <br>
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
new file mode 100644
index 0000000..ddd7f30
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
@@ -0,0 +1,70 @@
+package org.ovirt.engine.core.bll.scheduling;
+
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+
+public class SlaValidator {
+    public static Log log = LogFactory.getLog(SlaValidator.class);
+
+    private static final SlaValidator instance = new SlaValidator();
+
+    public static SlaValidator getInstance() {
+        return instance;
+    }
+
+    public boolean hasMemoryToRunVM(VDS curVds, VM vm) {
+        boolean retVal = false;
+        if (curVds.getMemCommited() != null && curVds.getPhysicalMemMb() != 
null && curVds.getReservedMem() != null) {
+            double vdsCurrentMem =
+                    curVds.getMemCommited() + curVds.getPendingVmemSize() + 
curVds.getGuestOverhead() + curVds
+                            .getReservedMem() + vm.getMinAllocatedMem();
+            double vdsMemLimit = curVds.getMaxVdsMemoryOverCommit() * 
curVds.getPhysicalMemMb() / 100.0;
+            if (log.isDebugEnabled()) {
+                log.debugFormat("hasMemoryToRunVM: host {0} pending vmem size 
is : {1} MB",
+                        curVds.getName(),
+                        curVds.getPendingVmemSize());
+                log.debugFormat("Host Mem Conmmitted: {0}, Host Reserved Mem: 
{1}, Host Guest Overhead {2}, VM Min Allocated Mem {3}",
+                        curVds.getMemCommited(),
+                        curVds.getReservedMem(),
+                        curVds.getGuestOverhead(),
+                        vm.getMinAllocatedMem());
+                log.debugFormat("{0} <= ???  {1}", vdsCurrentMem, vdsMemLimit);
+            }
+            retVal = (vdsCurrentMem <= vdsMemLimit);
+        }
+        return retVal;
+    }
+
+    /**
+     * Check if the given host has enough CPU to run the VM, without exceeding 
the high utilization threshold.
+     *
+     * @param vds
+     *            The host to check.
+     * @param vm
+     *            The VM to check.
+     * @return Does this host has enough CPU (without exceeding the threshold) 
to run the VM.
+     */
+    public boolean hasCpuToRunVM(VDS vds, VM vm) {
+        if (vds.getUsageCpuPercent() == null || vm.getUsageCpuPercent() == 
null) {
+            return false;
+        }
+        // The predicted CPU is actually the CPU that the VM will take 
considering how many cores it has and now many
+        // cores the host has. This is why we take both parameters into 
consideration.
+        int predictedVmCpu = (vm.getUsageCpuPercent() * vm.getNumOfCpus()) / 
VdsSelector.getEffectiveCpuCores(vds);
+        boolean result = vds.getUsageCpuPercent() + predictedVmCpu <= 
vds.getHighUtilization();
+        if (log.isDebugEnabled()) {
+            log.debugFormat("Host {0} has {1}% CPU load; VM {2} is predicted 
to have {3}% CPU load; " +
+                    "High threshold is {4}%. Host is {5}suitable in terms of 
CPU.",
+                    vds.getName(),
+                    vds.getUsageCpuPercent(),
+                    vm.getName(),
+                    predictedVmCpu,
+                    vds.getHighUtilization(),
+                    (result ? "" : "not "));
+        }
+        return result;
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsComparer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsComparer.java
new file mode 100644
index 0000000..417a750
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsComparer.java
@@ -0,0 +1,43 @@
+package org.ovirt.engine.core.bll.scheduling;
+
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VdsSelectionAlgorithm;
+
+/**
+ * Base class for comparing between Hosts
+ */
+public abstract class VdsComparer {
+    /**
+     * Factory method, creates necessary comparer
+     *
+     * @return
+     */
+    public static VdsComparer CreateComparer(VdsSelectionAlgorithm 
selectionAlgorithm) {
+        switch (selectionAlgorithm) {
+        case EvenlyDistribute:
+            return new EvenlyDistributeComparer();
+        case PowerSave:
+            return new PowerSaveComparer();
+        default:
+            return new NoneComparer();
+        }
+    }
+
+    /**
+     * Base abstract function for finish best Vds treatment
+     *
+     * @param x
+     */
+    public abstract void bestVdsProcedure(VDS x);
+
+    /**
+     * Base abstract function to compare between two VDSs
+     *
+     * @param x
+     * @param y
+     * @param vm
+     * @return
+     */
+    public abstract boolean isBetter(VDS x, VDS y, VM vm);
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsCpuVdsLoadBalancingAlgorithm.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsCpuVdsLoadBalancingAlgorithm.java
similarity index 99%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsCpuVdsLoadBalancingAlgorithm.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsCpuVdsLoadBalancingAlgorithm.java
index cb7f868..a5199d7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsCpuVdsLoadBalancingAlgorithm.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsCpuVdsLoadBalancingAlgorithm.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import java.util.Collections;
 import java.util.Comparator;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsFreeMemoryChecker.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsFreeMemoryChecker.java
similarity index 87%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsFreeMemoryChecker.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsFreeMemoryChecker.java
index 57ceca6..f8f0296 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsFreeMemoryChecker.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsFreeMemoryChecker.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import org.apache.commons.logging.Log;
 import org.ovirt.engine.core.common.businessentities.VDS;
@@ -18,7 +18,7 @@
 
     public boolean evaluate(VDS vds, VM vm) {
         // first check if this host has enough memory run the VM.
-        if (!RunVmCommandBase.hasMemoryToRunVM(vds, vm)) {
+        if (!SlaValidator.getInstance().hasMemoryToRunVM(vds, vm)) {
 
             if (vds.getPendingVmemSize() == 0) {
                 // there are no pending VMs to run - we hit the hard limit of 
memory, no special treatment
@@ -35,7 +35,7 @@
             vds = DbFacade.getInstance().getVdsDao().get(vds.getId());
 
             // check free memory on the updated host
-            return RunVmCommandBase.hasMemoryToRunVM(vds, vm);
+            return SlaValidator.getInstance().hasMemoryToRunVM(vds, vm);
         }
         return true;
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java
similarity index 73%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancer.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java
index b503908..12a977d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -7,9 +7,9 @@
 import org.ovirt.engine.core.common.businessentities.VdsSelectionAlgorithm;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
-import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
 import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
 
@@ -19,8 +19,22 @@
  */
 public final class VdsLoadBalancer {
     private static Log log = LogFactory.getLog(VdsLoadBalancer.class);
+    private static VdsLoadBalancer instance = null;
+    private MigrationHandler migrationHandler = null;
 
-    private static VdsLoadBalancer instance = new VdsLoadBalancer();
+    public static VdsLoadBalancer getInstance() {
+        if (instance == null) {
+            synchronized (VdsLoadBalancer.class) {
+                if (instance == null) {
+                    instance = new VdsLoadBalancer();
+                    if (Config.<Boolean> 
GetValue(ConfigValues.EnableVdsLoadBalancing)) {
+                        EnableLoadBalancer();
+                    }
+                }
+            }
+        }
+        return instance;
+    }
 
     private VdsLoadBalancer() {
     }
@@ -40,7 +54,7 @@
                         group.gethigh_utilization(), 
group.getlow_utilization(),
                         group.getcpu_over_commit_duration_minutes(),
                         Config.<Integer> 
GetValue(ConfigValues.UtilizationThresholdInPercent));
-                loadBalancingAlgorithm.LoadBalance();
+                
migrationHandler.migrateVMs(loadBalancingAlgorithm.LoadBalance());
             } else {
                 log.debugFormat("VdsLoadBalancer: Cluster {0} skipped because 
no selection algorithm selected.",
                         group.getname());
@@ -55,4 +69,11 @@
                 Config.<Integer> 
GetValue(ConfigValues.VdsLoadBalancingeIntervalInMinutes), TimeUnit.MINUTES);
         log.info("Finished scheduling to enable vds load balancer");
     }
+
+    public void setMigrationHandler(MigrationHandler migrationHandler) {
+        if (this.migrationHandler != null) {
+            throw new RuntimeException("Load balance migration handler should 
be set only once");
+        }
+        this.migrationHandler = migrationHandler;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancingAlgorithm.java
similarity index 88%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancingAlgorithm.java
index e149da8..f4adb51 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancingAlgorithm.java
@@ -1,5 +1,6 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -7,13 +8,11 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.ovirt.engine.core.bll.job.ExecutionHandler;
-import org.ovirt.engine.core.common.action.MigrateVmToServerParameters;
-import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.MigrationSupport;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.linq.Function;
@@ -107,7 +106,14 @@
         return new VdsCpuVdsLoadBalancingAlgorithm(group);
     }
 
-    public void LoadBalance() {
+    /**
+     * LoadBalace method iterates over the cluster's hosts and determine which 
hosts are over/under utilized according
+     * to derivative logic, then it selects the best vm to migrate out of 
these hosts.
+     * @return a list of pairs <vmId, hostID> VM and Host, which later engine 
try to migrate: vm to migrate ->
+     *         destination host
+     */
+    public List<Pair<Guid, Guid>> LoadBalance() {
+        List<Pair<Guid, Guid>> migrationList = new ArrayList<Pair<Guid, 
Guid>>();
         
setAllRelevantVdss(DbFacade.getInstance().getVdsDao().getAllForVdsGroupWithoutMigrating(getVdsGroup().getId()));
         log.infoFormat("VdsLoadBalancer: number of relevant vdss (no 
migration, no pending): {0}.",
                 getAllRelevantVdss().size());
@@ -116,12 +122,13 @@
         InitUnderUtilizedList();
         if (getOverUtilizedServers().size() != 0
                 && (getReadyToMigrationServers().size() != 0 || 
getUnderUtilizedServers().size() != 0)) {
-            ProceedOverUtilizedServers();
+            migrationList.addAll(ProceedOverUtilizedServers());
         }
         if (getUnderUtilizedServers().size() > 0
                 && (getReadyToMigrationServers().size() > 0 || 
getUnderUtilizedServers().size() > 1)) {
-            ProceedUnderUtilizedServers();
+            migrationList.addAll(ProceedUnderUtilizedServers());
         }
+        return migrationList;
     }
 
     protected abstract void InitOverUtilizedList();
@@ -130,7 +137,7 @@
 
     protected abstract void InitUnderUtilizedList();
 
-    private void ProceedOverUtilizedServers() {
+    private List<Pair<Guid, Guid>> ProceedOverUtilizedServers() {
         List<Guid> overUtilizedServersIds = 
LinqUtils.foreach(getOverUtilizedServers().values(),
                 new Function<VDS, Guid>() {
                     @Override
@@ -138,6 +145,7 @@
                         return vds.getId();
                     }
                 });
+        List<Pair<Guid, Guid>> vmVdsMigrationList = new ArrayList<Pair<Guid, 
Guid>>();
         for (Guid vdsId : overUtilizedServersIds) {
             VDS vds = getOverUtilizedServers().get(vdsId);
             log.infoFormat("VdsLoadBalancer: Server {0} decided as 
overutilized", vds.getName());
@@ -178,11 +186,7 @@
                     /**
                      * Migrate vm from OverUtilezed server
                      */
-                    MigrateVmToServerParameters parameters =
-                        new MigrateVmToServerParameters(false, vm.getId(), 
destinationVdsId);
-                    
Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer,
-                            parameters,
-                            ExecutionHandler.createInternalJobContext());
+                    vmVdsMigrationList.add(new Pair<Guid, Guid>(vm.getId(), 
destinationVdsId));
                     /**
                      * Remove server from list
                      */
@@ -195,9 +199,10 @@
                 log.info("VdsLoadBalancer: No vms found to migrate on this 
server");
             }
         }
+        return vmVdsMigrationList;
     }
 
-    private void ProceedUnderUtilizedServers() {
+    private List<Pair<Guid, Guid>> ProceedUnderUtilizedServers() {
         List<Guid> underUtilizedServersIds = 
LinqUtils.foreach(getUnderUtilizedServers().values(),
                 new Function<VDS, Guid>() {
                     @Override
@@ -206,6 +211,7 @@
                     }
                 });
         Set<Guid> processed = new HashSet<Guid>();
+        List<Pair<Guid, Guid>> vmVdsMigrationList = new ArrayList<Pair<Guid, 
Guid>>();
         for (Guid vdsId : underUtilizedServersIds) {
             if (!processed.contains(vdsId)) {
                 VDS vds = getUnderUtilizedServers().get(vdsId);
@@ -251,11 +257,7 @@
                                 vds.getName());
                     } else {
                         Guid destinationVdsId = destinationVds.getId();
-                        MigrateVmToServerParameters parameters =
-                            new MigrateVmToServerParameters(false, vm.getId(), 
destinationVdsId);
-                        
Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer,
-                                parameters,
-                                ExecutionHandler.createInternalJobContext());
+                        vmVdsMigrationList.add(new Pair<Guid, 
Guid>(vm.getId(), destinationVdsId));
                         currentList.remove(destinationVdsId);
                         log.infoFormat(
                                 "VdsLoadBalancer: Desktop {0} migrated from 
underutilized server {1} to server {2}",
@@ -273,6 +275,7 @@
                                                          // passed vm on it
             }
         }
+        return vmVdsMigrationList;
     }
 
     private java.util.List<VM> getMigrableVmsRunningOnVds(Guid vdsId) {
@@ -293,8 +296,8 @@
             @Override
             public boolean eval(VDS p) {
                 return (p.getVdsGroupId().equals(vm.getVdsGroupId())
-                        && RunVmCommandBase.hasMemoryToRunVM(p, vm)
-                        && RunVmCommandBase.hasCpuToRunVM(p, vm));
+                        && SlaValidator.getInstance().hasMemoryToRunVM(p, vm)
+                        && SlaValidator.getInstance().hasCpuToRunVM(p, vm));
             }
         });
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsSelector.java
similarity index 95%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsSelector.java
index 79dc83d..ccaae49 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsSelector.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -135,7 +135,6 @@
             VDS target_vds = 
DbFacade.getInstance().getVdsDao().get(getDestinationVdsId());
             log.infoFormat("Checking for a specific VDS only - id:{0}, 
name:{1}, host_name(ip):{2}",
                     getDestinationVdsId(), target_vds.getName(), 
target_vds.getHostName());
-            VmHandler.UpdateVmGuestAgentVersion(getVm());
             result = getVdsToRunOn(Arrays.asList(target_vds), isMigrate);
         }
         return result;
@@ -183,17 +182,15 @@
         for (VDS curVds : vdss) {
             noVDSs = false;
 
-            ValidationResult result = validateHostIsReadyToRun(curVds, sb, 
isMigrate);
-            if (result.isValid()) {
+            VdcBllMessages result = validateHostIsReadyToRun(curVds, sb, 
isMigrate);
+            if (result == null) {
                 return true;
             } else {
-                if (messageToReturn.getValue() < 
result.getMessage().getValue()) {
-                    messageToReturn = result.getMessage();
-                    /**
-                     * save version of current vds for later use
-                     */
-                    vdsVersion = curVds.getVersion();
-                }
+                messageToReturn = result;
+                /**
+                 * save version of current vds for later use
+                 */
+                vdsVersion = curVds.getVersion();
             }
         }
 
@@ -208,7 +205,6 @@
              * action message
              */
             if (messageToReturn == 
VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_VERSION && vdsVersion != null) {
-                VmHandler.UpdateVmGuestAgentVersion(getVm());
                 messages.add("$toolsVersion " + getVm().getPartialVersion());
                 messages.add("$serverVersion " + vdsVersion.getRpmName());
 
@@ -325,18 +321,18 @@
         }
     });
 
-    private ValidationResult validateHostIsReadyToRun(final VDS vds, 
StringBuilder sb, boolean isMigrate) {
+    private VdcBllMessages validateHostIsReadyToRun(final VDS vds, 
StringBuilder sb, boolean isMigrate) {
         // buffer the mismatches as we go
         sb.append(" VDS ").append(vds.getName()).append(" 
").append(vds.getId()).append(" ");
 
         for(HostValidator validator : this.hostValidators) {
             VdcBllMessages result = validator.validate(vds, sb, isMigrate);
             if(result != null) {
-                return new ValidationResult(result);
+                return result;
             }
         }
 
-        return ValidationResult.VALID;
+        return null;
     }
 
     /**
@@ -431,7 +427,7 @@
         StringBuilder sb = new StringBuilder();
         final List<VDS> readyToRun = new ArrayList<VDS>();
         for (VDS curVds : vdss) {
-            if (validateHostIsReadyToRun(curVds, sb, isMigrate) == 
ValidationResult.VALID) {
+            if (validateHostIsReadyToRun(curVds, sb, isMigrate) == null) {
                 readyToRun.add(curVds);
             }
         }
@@ -523,7 +519,7 @@
         VDS bestVDS = list.get(0);
         for (int i = 1; i < list.size(); i++) {
             VDS curVds = list.get(i);
-            if (comparer.IsBetter(bestVDS, curVds, getVm()))
+            if (comparer.isBetter(bestVDS, curVds, getVm()))
             // if (((bestVDS.physical_mem_mb - bestVDS.mem_commited) <
             // (curVds.physical_mem_mb - curVds.mem_commited)))
             {
@@ -533,7 +529,7 @@
         /**
          * add chosen vds to running vdss list.
          */
-        comparer.BestVdsProcedure(bestVDS);
+        comparer.bestVdsProcedure(bestVDS);
         getRunVdssList().add(bestVDS.getId());
         return bestVDS.getId();
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCountVdsLoadBalancingAlgorithm.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VmCountVdsLoadBalancingAlgorithm.java
similarity index 98%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCountVdsLoadBalancingAlgorithm.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VmCountVdsLoadBalancingAlgorithm.java
index adeb99c..8e69ec2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCountVdsLoadBalancingAlgorithm.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VmCountVdsLoadBalancingAlgorithm.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.bll.scheduling;
 
 import java.util.Collections;
 import java.util.Comparator;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
index afd891b..e62f70b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
@@ -12,8 +12,8 @@
 import org.ovirt.engine.core.bll.ImagesHandler;
 import org.ovirt.engine.core.bll.IsoDomainListSyncronizer;
 import org.ovirt.engine.core.bll.ValidationResult;
-import org.ovirt.engine.core.bll.VdsSelector;
 import org.ovirt.engine.core.bll.interfaces.BackendInternal;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
 import org.ovirt.engine.core.common.VdcActionUtils;
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
index e16a91a..d4b3885 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
@@ -28,6 +28,7 @@
 import org.mockito.runners.MockitoJUnitRunner;
 import org.mockito.stubbing.Answer;
 import org.ovirt.engine.core.bll.interfaces.BackendInternal;
+import org.ovirt.engine.core.bll.scheduling.VdsSelector;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.validator.RunVmValidator;
 import org.ovirt.engine.core.common.action.RunVmParams;


-- 
To view, visit http://gerrit.ovirt.org/15816
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icac8f7bc8a696455134bb90ffc17afd420e18dd4
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Laszlo Hornyak <[email protected]>
Gerrit-Reviewer: Gilad Chaplik <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to