diff --git a/engine/components-api/src/com/cloud/capacity/CapacityManager.java b/engine/components-api/src/com/cloud/capacity/CapacityManager.java index 979c6f7f5ed..5483d091529 100755 --- a/engine/components-api/src/com/cloud/capacity/CapacityManager.java +++ b/engine/components-api/src/com/cloud/capacity/CapacityManager.java @@ -75,4 +75,13 @@ public interface CapacityManager { * @return true if the count of host's running VMs >= hypervisor limit */ boolean checkIfHostReachMaxGuestLimit(Host host); + + /** + * Check if specified host has capability to support cpu cores and speed freq + * @param hostId the host to be checked + * @param cpuNum cpu number to check + * @param cpuSpeed cpu Speed to check + * @return true if the count of host's running VMs >= hypervisor limit + */ + boolean checkIfHostHasCpuCapability(long hostId, Integer cpuNum, Integer cpuSpeed); } diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java index 07cd40fbc87..e52916f95c5 100755 --- a/server/src/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java @@ -362,6 +362,28 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, } } + @Override + public boolean checkIfHostHasCpuCapability(long hostId, Integer cpuNum, Integer cpuSpeed){ + + // Check host can support the Cpu Number and Speed. + Host host = _hostDao.findById(hostId); + boolean isCpuNumGood = host.getCpus().intValue() >= cpuNum; + boolean isCpuSpeedGood = host.getSpeed().intValue() >= cpuSpeed; + if(isCpuNumGood && isCpuSpeedGood){ + if (s_logger.isDebugEnabled()) { + s_logger.debug("Host: " + hostId + " has cpu capability (cpu:" +host.getCpus()+ ", speed:" + host.getSpeed() + + ") to support requested CPU: " + cpuNum + " and requested speed: " + cpuSpeed); + } + return true; + }else{ + if (s_logger.isDebugEnabled()) { + s_logger.debug("Host: " + hostId + " doesn't have cpu capability (cpu:" +host.getCpus()+ ", speed:" + host.getSpeed() + + ") to support requested CPU: " + cpuNum + " and requested speed: " + cpuSpeed); + } + return false; + } + } + @Override public boolean checkIfHostHasCapacity(long hostId, Integer cpu, long ram, boolean checkFromReservedCapacity, float cpuOvercommitRatio, float memoryOvercommitRatio, boolean considerReservedCapacity) { boolean hasCapacity = false; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 85c5bc1a9f6..32db6f0aa21 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -3433,9 +3433,9 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V } protected boolean sendCommandsToRouter(final VirtualRouter router, Commands cmds) throws AgentUnavailableException { - if(!checkRouterVersion(router)){ + /*if(!checkRouterVersion(router)){ throw new CloudRuntimeException("Router requires upgrade. Unable to send command to router:" + router.getId()); - } + } */ Answer[] answers = null; try { answers = _agentMgr.send(router.getHostId(), cmds); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index d630fd515e6..5264c716e6d 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1371,7 +1371,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // #1 Check existing host has capacity if( !excludes.shouldAvoid(ApiDBUtils.findHostById(vmInstance.getHostId())) ){ - existingHostHasCapacity = _capacityMgr.checkIfHostHasCapacity(vmInstance.getHostId(), newServiceOffering.getSpeed() - currentServiceOffering.getSpeed(), + existingHostHasCapacity = _capacityMgr.checkIfHostHasCpuCapability(vmInstance.getHostId(), newCpu, newSpeed) + && _capacityMgr.checkIfHostHasCapacity(vmInstance.getHostId(), newServiceOffering.getSpeed() - currentServiceOffering.getSpeed(), (newServiceOffering.getRamSize() - currentServiceOffering.getRamSize()) * 1024L * 1024L, false, ApiDBUtils.getCpuOverprovisioningFactor(), 1f, false); // TO DO fill it with mem. excludes.addHost(vmInstance.getHostId()); }