Gilad Chaplik has uploaded a new change for review. Change subject: core: moving sla logic to sla package (6/X) ......................................................................
core: moving sla logic to sla package (6/X) + doing whats needed in oreder it to compile Change-Id: I6fdc1c0809dbd027e76646722c5e5366646e8acd Signed-off-by: Gilad Chaplik <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeVDComparer.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MemoryVdsComparer.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NonWaitingDelayer.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/VdsLoadBalancer.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCountVdsLoadBalancingAlgorithm.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java M backend/manager/modules/sla/pom.xml R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/EvenlyDistributeComparer.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/NoneComparer.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/PowerSaveComparer.java A backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/SlaStaticValidation.java A backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsComparer.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsCpuVdsLoadBalancingAlgorithm.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsFreeMemoryChecker.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsLoadBalancingAlgorithm.java R backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsSelector.java R backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/RunVmDelayer.java 22 files changed, 209 insertions(+), 192 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/13116/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeVDComparer.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeVDComparer.java index 8897e77..12cf95e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeVDComparer.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeVDComparer.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.businessentities.*; +import org.ovirt.engine.core.sla.VdsComparer; /** * This comparer chose Vds with less vms running regarding if vds will be 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/MemoryVdsComparer.java index 2d60f75..4a8d184 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/MemoryVdsComparer.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.businessentities.*; +import org.ovirt.engine.core.sla.VdsComparer; /** * This comparer chose Vds with more memory available as best 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 45ea7c4..e6007a9 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 @@ -23,6 +23,8 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogField; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields; +import org.ovirt.engine.core.sla.VdsFreeMemoryChecker; +import org.ovirt.engine.core.sla.VdsSelector; @CustomLogFields({ @CustomLogField("VdsDestination"), @CustomLogField("DueToMigrationError") }) public class MigrateVmCommand<T extends MigrateVmParameters> extends RunVmCommandBase<T> { @@ -82,6 +84,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; @@ -213,8 +216,13 @@ reasons.add(VdcBllMessages.ACTION_TYPE_FAILED_VDS_STATUS_ILLEGAL.name()); } - retValue = retValue && validate(new SnapshotsValidator().vmNotDuringSnapshot(vm.getId())) - && getVdsSelector().canFindVdsToRunOn(reasons, true); + retValue = retValue && validate(new SnapshotsValidator().vmNotDuringSnapshot(vm.getId())); + + boolean canFindVdsToRunOn = getVdsSelector().canFindVdsToRunOn(reasons, true); + if (!canFindVdsToRunOn && reasons.contains(VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_VERSION)) { + VmHandler.UpdateVmGuestAgentVersion(getVm()); + } + retValue &= canFindVdsToRunOn; } if (!retValue) { 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/NonWaitingDelayer.java index 8e600fc..66f43b4 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/NonWaitingDelayer.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.bll; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.RunVmDelayer; /** * This delayer should be used in cases when no throttling is desired e.g in the validation phase of commands. 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 1dc214d..4b6f21b 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 @@ -77,6 +77,8 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.job.ExecutionMessageDirector; +import org.ovirt.engine.core.sla.VdsFreeMemoryChecker; +import org.ovirt.engine.core.sla.VdsSelector; import org.ovirt.engine.core.utils.NetworkUtils; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; @@ -565,6 +567,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 bdfb32a..211fa19 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 @@ -24,7 +24,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; @@ -37,6 +36,8 @@ import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.sla.VdsSelector; +import org.ovirt.engine.core.utils.RunVmDelayer; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; @@ -49,7 +50,7 @@ public abstract class RunVmCommandBase<T extends VmOperationParameterBase> extends VmCommand<T> implements IVdsAsyncCommand, RunVmDelayer { - private static Log log = LogFactory.getLog(RunVmCommandBase.class); + public static Log log = LogFactory.getLog(RunVmCommandBase.class); protected static final HashMap<Guid, Integer> _vds_pending_vm_count = new HashMap<Guid, Integer>(); private VdsSelector privateVdsSelector; protected boolean _isRerun = false; @@ -87,61 +88,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 7cae7e5..0000000 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsComparer.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.ovirt.engine.core.bll; - -import org.ovirt.engine.core.compat.*; -import org.ovirt.engine.core.common.businessentities.*; - -/** - * 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/VdsLoadBalancer.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancer.java index b503908..f9078f2 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/VdsLoadBalancer.java @@ -3,13 +3,17 @@ import java.util.List; import java.util.concurrent.TimeUnit; +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.VDSGroup; 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.sla.VdsLoadBalancingAlgorithm; 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; @@ -40,7 +44,14 @@ group.gethigh_utilization(), group.getlow_utilization(), group.getcpu_over_commit_duration_minutes(), Config.<Integer> GetValue(ConfigValues.UtilizationThresholdInPercent)); - loadBalancingAlgorithm.LoadBalance(); + List<MigrateVmToServerParameters> parameterList = loadBalancingAlgorithm.LoadBalance(); + if (parameterList != null) { + for (MigrateVmToServerParameters parameters : parameterList) { + Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer, + parameters, + ExecutionHandler.createInternalJobContext()); + } + } } else { log.debugFormat("VdsLoadBalancer: Cluster {0} skipped because no selection algorithm selected.", group.getname()); 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/VmCountVdsLoadBalancingAlgorithm.java index adeb99c..7039b90 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/VmCountVdsLoadBalancingAlgorithm.java @@ -11,6 +11,8 @@ import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.sla.VdsLoadBalancingAlgorithm; +import org.ovirt.engine.core.sla.VdsSelector; import org.ovirt.engine.core.utils.linq.DefaultMapper; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; 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 38effeb..0f80520 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 @@ -28,6 +28,8 @@ import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogField; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields; import org.ovirt.engine.core.dao.VmPoolDAO; +import org.ovirt.engine.core.sla.VdsFreeMemoryChecker; +import org.ovirt.engine.core.sla.VdsSelector; import org.ovirt.engine.core.utils.vmproperties.VmPropertiesUtils; @CustomLogFields({ @CustomLogField("VmPoolName") }) 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 e60ac94..cf1bc60 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 @@ -60,6 +60,8 @@ import org.ovirt.engine.core.dao.StoragePoolDAO; import org.ovirt.engine.core.dao.VmDAO; import org.ovirt.engine.core.dao.VmDeviceDAO; +import org.ovirt.engine.core.sla.VdsFreeMemoryChecker; +import org.ovirt.engine.core.sla.VdsSelector; import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.core.utils.vmproperties.VmPropertiesUtils; diff --git a/backend/manager/modules/sla/pom.xml b/backend/manager/modules/sla/pom.xml index a596945..6946b69 100644 --- a/backend/manager/modules/sla/pom.xml +++ b/backend/manager/modules/sla/pom.xml @@ -25,6 +25,19 @@ <artifactId>common</artifactId> <version>${engine.version}</version> </dependency> + + <dependency> + <groupId>${engine.groupId}</groupId> + <artifactId>utils</artifactId> + <version>${engine.version}</version> + </dependency> + + <dependency> + <groupId>${engine.groupId}</groupId> + <artifactId>dal</artifactId> + <version>${engine.version}</version> + </dependency> + </dependencies> <build> diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/EvenlyDistributeComparer.java similarity index 97% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/EvenlyDistributeComparer.java index 48c9ed5..a64db2c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EvenlyDistributeComparer.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/EvenlyDistributeComparer.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; import org.ovirt.engine.core.common.businessentities.*; import org.ovirt.engine.core.common.config.Config; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/NoneComparer.java similarity index 63% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/NoneComparer.java index aeb94a6..97dcae1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NoneComparer.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/NoneComparer.java @@ -1,4 +1,5 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; + public 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/sla/src/main/java/org/ovirt/engine/core/sla/PowerSaveComparer.java similarity index 95% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PowerSaveComparer.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/PowerSaveComparer.java index 643cf49..5416b30 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/PowerSaveComparer.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/PowerSaveComparer.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; import org.ovirt.engine.core.common.businessentities.*; diff --git a/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/SlaStaticValidation.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/SlaStaticValidation.java new file mode 100644 index 0000000..22fb841 --- /dev/null +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/SlaStaticValidation.java @@ -0,0 +1,65 @@ +package org.ovirt.engine.core.sla; + +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 SlaStaticValidation { + public static Log log = LogFactory.getLog(SlaStaticValidation.class); + + /** + * 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; + } + +} diff --git a/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsComparer.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsComparer.java new file mode 100644 index 0000000..c6bd8f3 --- /dev/null +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsComparer.java @@ -0,0 +1,46 @@ +package org.ovirt.engine.core.sla; + +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); + } + } + + /** + * 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/sla/src/main/java/org/ovirt/engine/core/sla/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/sla/src/main/java/org/ovirt/engine/core/sla/VdsCpuVdsLoadBalancingAlgorithm.java index c7db4bf..5f6cb73 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsCpuVdsLoadBalancingAlgorithm.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsCpuVdsLoadBalancingAlgorithm.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; 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/sla/src/main/java/org/ovirt/engine/core/sla/VdsFreeMemoryChecker.java similarity index 82% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsFreeMemoryChecker.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsFreeMemoryChecker.java index 57ceca6..d848626 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsFreeMemoryChecker.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsFreeMemoryChecker.java @@ -1,10 +1,11 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.utils.log.LogFactory; +import org.ovirt.engine.core.utils.RunVmDelayer; public class VdsFreeMemoryChecker { @@ -18,7 +19,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 (!SlaStaticValidation.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 +36,7 @@ vds = DbFacade.getInstance().getVdsDao().get(vds.getId()); // check free memory on the updated host - return RunVmCommandBase.hasMemoryToRunVM(vds, vm); + return SlaStaticValidation.hasMemoryToRunVM(vds, vm); } return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsLoadBalancingAlgorithm.java similarity index 90% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsLoadBalancingAlgorithm.java index e149da8..65951f8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsLoadBalancingAlgorithm.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsLoadBalancingAlgorithm.java @@ -1,5 +1,6 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; @@ -7,9 +8,7 @@ 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; @@ -107,7 +106,9 @@ return new VdsCpuVdsLoadBalancingAlgorithm(group); } - public void LoadBalance() { + public List<MigrateVmToServerParameters> LoadBalance() { + List<MigrateVmToServerParameters> parameterList = new ArrayList<MigrateVmToServerParameters>(); + setAllRelevantVdss(DbFacade.getInstance().getVdsDao().getAllForVdsGroupWithoutMigrating(getVdsGroup().getId())); log.infoFormat("VdsLoadBalancer: number of relevant vdss (no migration, no pending): {0}.", getAllRelevantVdss().size()); @@ -116,12 +117,13 @@ InitUnderUtilizedList(); if (getOverUtilizedServers().size() != 0 && (getReadyToMigrationServers().size() != 0 || getUnderUtilizedServers().size() != 0)) { - ProceedOverUtilizedServers(); + parameterList.addAll(ProceedOverUtilizedServers()); } if (getUnderUtilizedServers().size() > 0 && (getReadyToMigrationServers().size() > 0 || getUnderUtilizedServers().size() > 1)) { - ProceedUnderUtilizedServers(); + parameterList.addAll(ProceedUnderUtilizedServers()); } + return parameterList; } protected abstract void InitOverUtilizedList(); @@ -130,7 +132,8 @@ protected abstract void InitUnderUtilizedList(); - private void ProceedOverUtilizedServers() { + private List<MigrateVmToServerParameters> ProceedOverUtilizedServers() { + List<MigrateVmToServerParameters> parameterList = new ArrayList<MigrateVmToServerParameters>(); List<Guid> overUtilizedServersIds = LinqUtils.foreach(getOverUtilizedServers().values(), new Function<VDS, Guid>() { @Override @@ -178,11 +181,7 @@ /** * Migrate vm from OverUtilezed server */ - MigrateVmToServerParameters parameters = - new MigrateVmToServerParameters(false, vm.getId(), destinationVdsId); - Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer, - parameters, - ExecutionHandler.createInternalJobContext()); + parameterList.add(new MigrateVmToServerParameters(false, vm.getId(), destinationVdsId)); /** * Remove server from list */ @@ -195,9 +194,11 @@ log.info("VdsLoadBalancer: No vms found to migrate on this server"); } } + return parameterList; } - private void ProceedUnderUtilizedServers() { + private List<MigrateVmToServerParameters> ProceedUnderUtilizedServers() { + List<MigrateVmToServerParameters> parameterList = new ArrayList<MigrateVmToServerParameters>(); List<Guid> underUtilizedServersIds = LinqUtils.foreach(getUnderUtilizedServers().values(), new Function<VDS, Guid>() { @Override @@ -251,11 +252,7 @@ vds.getName()); } else { Guid destinationVdsId = destinationVds.getId(); - MigrateVmToServerParameters parameters = - new MigrateVmToServerParameters(false, vm.getId(), destinationVdsId); - Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer, - parameters, - ExecutionHandler.createInternalJobContext()); + parameterList.add(new MigrateVmToServerParameters(false, vm.getId(), destinationVdsId)); currentList.remove(destinationVdsId); log.infoFormat( "VdsLoadBalancer: Desktop {0} migrated from underutilized server {1} to server {2}", @@ -273,6 +270,7 @@ // passed vm on it } } + return parameterList; } private java.util.List<VM> getMigrableVmsRunningOnVds(Guid vdsId) { @@ -293,8 +291,8 @@ @Override public boolean eval(VDS p) { return (p.getVdsGroupId().equals(vm.getVdsGroupId()) - && RunVmCommandBase.hasMemoryToRunVM(p, vm) - && RunVmCommandBase.hasCpuToRunVM(p, vm)); + && SlaStaticValidation.hasMemoryToRunVM(p, vm) + && SlaStaticValidation.hasCpuToRunVM(p, vm)); } }); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsSelector.java similarity index 91% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java rename to backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsSelector.java index 3971c85..1c30d3d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsSelector.java +++ b/backend/manager/modules/sla/src/main/java/org/ovirt/engine/core/sla/VdsSelector.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.sla; import java.util.ArrayList; import java.util.Arrays; @@ -24,9 +24,6 @@ import org.ovirt.engine.core.compat.RpmVersion; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.dao.network.InterfaceDao; -import org.ovirt.engine.core.dao.network.NetworkDao; -import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; @@ -132,7 +129,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(new ArrayList<VDS>(Arrays.asList(new VDS[] { target_vds })), isMigrate); } return result; @@ -181,12 +177,12 @@ 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(); + if (messageToReturn.getValue() < result.getValue()) { + messageToReturn = result; /** * save version of current vds for later use */ @@ -202,11 +198,9 @@ if (messages != null) { messages.add(messageToReturn.toString()); /** - * if error due to versions, add versions information to can do - * action message + * if error due to versions, add versions information to can do 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()); @@ -321,18 +315,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(" "); + VdcBllMessages result; for(HostValidator validator : this.hostValidators) { - VdcBllMessages result = validator.validate(vds, sb, isMigrate); - if(result != null) { - return new ValidationResult(result); + if ((result = validator.validate(vds, sb, isMigrate)) != null) { + return result; } } - return ValidationResult.VALID; + return null; } /** @@ -381,7 +375,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); } } @@ -407,8 +401,10 @@ * @return <code>true</code> if all required Networks are attached to a Host Nic, otherwise, <code>false</code>. */ private boolean areRequiredNetworksAvailable(VDS vds) { - final List<VdsNetworkInterface> allInterfacesForVds = getInterfaceDAO().getAllInterfacesForVds(vds.getId()); - final List<Network> clusterNetworks = getNetworkDAO().getAllForCluster(vds.getVdsGroupId()); + final List<VdsNetworkInterface> allInterfacesForVds = + DbFacade.getInstance().getInterfaceDao().getAllInterfacesForVds(vds.getId()); + final List<Network> clusterNetworks = + DbFacade.getInstance().getNetworkDao().getAllForCluster(vds.getVdsGroupId()); final Map<String, Network> networksByName = Entities.entitiesByName(clusterNetworks); boolean onlyRequiredNetworks = @@ -437,10 +433,6 @@ return true; } - private NetworkDao getNetworkDAO() { - return DbFacade.getInstance().getNetworkDao(); - } - private boolean networkRequiredOnVds(VmNetworkInterface vmIface, Map<String, Network> networksByName, boolean onlyRequiredNetworks) { @@ -451,14 +443,6 @@ networkRequiredOnVds = networksByName.get(vmIface.getNetworkName()).getCluster().isRequired(); } return networkRequiredOnVds; - } - - VmNetworkInterfaceDao getVmNetworkInterfaceDao() { - return DbFacade.getInstance().getVmNetworkInterfaceDao(); - } - - InterfaceDao getInterfaceDAO() { - return DbFacade.getInstance().getInterfaceDao(); } private Guid getBestVdsToRun(List<VDS> list) { @@ -483,10 +467,11 @@ private List<VmNetworkInterface> getVmNICs() { if (vmNICs == null) { - vmNICs = getVmNetworkInterfaceDao().getAllForVm(getVm().getId()); + vmNICs = DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(getVm().getId()); } return vmNICs; } private static final Log log = LogFactory.getLog(VdsSelector.class); + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/RunVmDelayer.java similarity index 93% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java rename to backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/RunVmDelayer.java index 884749b..996ed8d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmDelayer.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/RunVmDelayer.java @@ -1,4 +1,4 @@ -package org.ovirt.engine.core.bll; +package org.ovirt.engine.core.utils; import org.ovirt.engine.core.compat.Guid; -- To view, visit http://gerrit.ovirt.org/13116 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6fdc1c0809dbd027e76646722c5e5366646e8acd Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
