package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.action.RunVmParams; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.queries.GetAllVmPoolsAttachedToUserParameters; import org.ovirt.engine.core.common.queries.GetUserVmsByUserIdAndGroupsParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class RunVmOnDedicatedVdsCommand<T extends RunVmParams> extends RunVmCommand<T> { public RunVmOnDedicatedVdsCommand(T runVmParams) { super(runVmParams); getVdsSelector().setCheckDestinationFirst(false); } @Override protected VDS getDestinationVds() { if (_destinationVds == null) { if (getParameters().getDestinationVdsId() != null) { VDS powerclient = DbFacade.getInstance().getVdsDAO().get(getParameters().getDestinationVdsId()); if (powerclient != null && powerclient.getvds_type() == VDSType.PowerClient) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientLogDetection)) { log.infoFormat("VdcBLL::RunVmCommand - Powerclient id= {0}, name = {1} evaluated", powerclient.getvds_id(), powerclient.getvds_name()); } _destinationVds = powerclient; } else { if (Config.<Boolean> GetValue(ConfigValues.PowerClientLogDetection)) { log.infoFormat("VdcBLL::RunVmCommand - Powerclient id= {0} could not been evaluated", getParameters().getDestinationVdsId()); } } } } return _destinationVds; } @Override protected void HandleMemoryAdjustments() { if (getDestinationVds() != null) { AutoMemoryAdjust(getDestinationVds(), getVm()); } } protected void AutoMemoryAdjust(VDS vds, VM vm) { if (!Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemory)) { return; } int memory = -1; if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryBaseOnAvailableMemory)) { if (vds.getmem_available() != null) { memory = vds.getmem_available().intValue(); } } else { if (vds.getphysical_mem_mb() != null) { memory = vds.getphysical_mem_mb(); } } if (memory == -1) { log.errorFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - {0} memory is null, Auto Adjust Memory", Config .<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryBaseOnAvailableMemory) ? "available" : "physical"); return; } if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - Basing on VDS {0} - {1}MB", Config .<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryBaseOnAvailableMemory) ? "available" : "physical", memory); } memory = memory - Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemoryGeneralReserve); if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - After reducing general reserve {0} - {1}MB", Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemoryGeneralReserve), memory); } if (Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerSessionReserve) != 0) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat( "VdcBll.RunVmCommand.AutoMemoryAdjust - Checking Spice per session reserve of {0}MB per session", Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerSessionReserve)); } log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - Checking number of VMs and Pools"); if (getParameters().getRequestingUser() == null) { log.errorFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - PowerClientAutoAdjustMemorySpicePerSessionReserve requested, but RunVmParameters.RequestingUser is null"); } else { VdcQueryReturnValue returnValueVMs = Backend.getInstance().runInternalQuery( VdcQueryType.GetUserVmsByUserIdAndGroups, new GetUserVmsByUserIdAndGroupsParameters(getParameters().getRequestingUser().getUserId())); List<VM> vmList = returnValueVMs == null ? new java.util.ArrayList<VM>() : (List) returnValueVMs .getReturnValue(); VdcQueryReturnValue returnValuePools = Backend.getInstance().runInternalQuery( VdcQueryType.GetAllVmPoolsAttachedToUser, new GetAllVmPoolsAttachedToUserParameters(getParameters().getRequestingUser().getUserId())); List<vm_pools> vmPools = (returnValuePools != null) ? (List) returnValuePools.getReturnValue() : new java.util.ArrayList<vm_pools>(); // foreach (VM vm in vmList) // if (vm.DynamicData.guest_cur_user_id.HasValue) // { // log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - VM: {0}, current user: {1}, requesting user: {2}", // vm.vm_name, vm.DynamicData.guest_cur_user_id, // RunVmParameters.RequestingUSer); // if // (vm.DynamicData.guest_cur_user_id.Value.Equals(RunVmParameters.RequestingUSer.UserName)) // vmList.Remove(vm); // } memory = memory - ((vmList.size() + vmPools.size()) * Config .<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerSessionReserve)); if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - Reducing {0}MB for {1} VMs and {2} Pools", Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerSessionReserve), vmList.size(), vmPools.size()); } } } if (Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerMonitorReserve) != 0) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat( "VdcBll.RunVmCommand.AutoMemoryAdjust - Reducing Spice per monitor reserve of {0}MB per monitor. {1} monitors", Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerMonitorReserve), vm.getnum_of_monitors()); } memory = memory - (vm.getnum_of_monitors() * Config .<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemorySpicePerMonitorReserve)); } int maxMemory = Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemoryMaxMemory); if (memory > maxMemory) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - VM memory fixed to max allowed memory: {0}", maxMemory); } memory = maxMemory; } int modulus = Config.<Integer> GetValue(ConfigValues.PowerClientAutoAdjustMemoryModulus); int modulusMemory = (memory / modulus) * modulus; if (modulusMemory != memory) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - VM memory adjusted to modulus {0}: {1}", modulus, modulusMemory); } memory = modulusMemory; } if (memory < vm.getStaticData().getmem_size_mb()) { if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat( "VdcBll.RunVmCommand.AutoMemoryAdjust - VM memory adjusted to oriignal value as the result was lower than predefined value: {0}", vm.getStaticData().getmem_size_mb()); } memory = vm.getStaticData().getmem_size_mb(); } if (Config.<Boolean> GetValue(ConfigValues.PowerClientAutoAdjustMemoryLog)) { log.infoFormat("VdcBll.RunVmCommand.AutoMemoryAdjust - VM memory will be: {0}", memory); } vm.getStaticData().setmem_size_mb(memory); } private static LogCompat log = LogFactoryCompat.getLog(RunVmOnDedicatedVdsCommand.class); }