mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Externalize config to set min memory/cpu with division by overprovisi… (#4722)
Co-authored-by: Daniel Augusto Veronezi Salvador <daniel@scclouds.com.br> Co-authored-by: dahn <daan.hoogland@gmail.com>
This commit is contained in:
		
							parent
							
								
									f1c83a0b05
								
							
						
					
					
						commit
						6531ee5871
					
				| @ -171,6 +171,7 @@ import com.cloud.host.Status; | ||||
| import com.cloud.host.dao.HostDao; | ||||
| import com.cloud.hypervisor.Hypervisor.HypervisorType; | ||||
| import com.cloud.hypervisor.HypervisorGuru; | ||||
| import com.cloud.hypervisor.HypervisorGuruBase; | ||||
| import com.cloud.hypervisor.HypervisorGuruManager; | ||||
| import com.cloud.network.Network; | ||||
| import com.cloud.network.NetworkModel; | ||||
| @ -4659,34 +4660,43 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private VMInstanceVO orchestrateReConfigureVm(final String vmUuid, final ServiceOffering oldServiceOffering, final ServiceOffering newServiceOffering, | ||||
|                                                   final boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException { | ||||
|         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid); | ||||
|     private VMInstanceVO orchestrateReConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, ServiceOffering newServiceOffering, | ||||
|                                                   boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException { | ||||
|         VMInstanceVO vm = _vmDao.findByUuid(vmUuid); | ||||
|         upgradeVmDb(vm.getId(), newServiceOffering, oldServiceOffering); | ||||
| 
 | ||||
|         final HostVO hostVo = _hostDao.findById(vm.getHostId()); | ||||
|         final Float memoryOvercommitRatio = CapacityManager.MemOverprovisioningFactor.valueIn(hostVo.getClusterId()); | ||||
|         final Float cpuOvercommitRatio = CapacityManager.CpuOverprovisioningFactor.valueIn(hostVo.getClusterId()); | ||||
|         final long minMemory = (long)(newServiceOffering.getRamSize() / memoryOvercommitRatio); | ||||
|         final ScaleVmCommand reconfigureCmd = | ||||
|                 new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), (int)(newServiceOffering.getSpeed() / cpuOvercommitRatio), | ||||
|         HostVO hostVo = _hostDao.findById(vm.getHostId()); | ||||
| 
 | ||||
|         Long clustedId = hostVo.getClusterId(); | ||||
|         Float memoryOvercommitRatio = CapacityManager.MemOverprovisioningFactor.valueIn(clustedId); | ||||
|         Float cpuOvercommitRatio = CapacityManager.CpuOverprovisioningFactor.valueIn(clustedId); | ||||
|         boolean divideMemoryByOverprovisioning = HypervisorGuruBase.VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor.valueIn(clustedId); | ||||
|         boolean divideCpuByOverprovisioning = HypervisorGuruBase.VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor.valueIn(clustedId); | ||||
| 
 | ||||
|         int minMemory = (int)(newServiceOffering.getRamSize() / (divideMemoryByOverprovisioning ? memoryOvercommitRatio : 1)); | ||||
|         int minSpeed = (int)(newServiceOffering.getSpeed() / (divideCpuByOverprovisioning ? cpuOvercommitRatio : 1)); | ||||
| 
 | ||||
|         ScaleVmCommand scaleVmCommand = | ||||
|                 new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), minSpeed, | ||||
|                         newServiceOffering.getSpeed(), minMemory * 1024L * 1024L, newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse()); | ||||
| 
 | ||||
|         final Long dstHostId = vm.getHostId(); | ||||
|         Long dstHostId = vm.getHostId(); | ||||
| 
 | ||||
|         if (vm.getHypervisorType().equals(HypervisorType.VMware)) { | ||||
|             final HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); | ||||
|             Map<String, String> details = null; | ||||
|             details = hvGuru.getClusterSettings(vm.getId()); | ||||
|             reconfigureCmd.getVirtualMachine().setDetails(details); | ||||
|             HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); | ||||
|             Map<String, String> details = hvGuru.getClusterSettings(vm.getId()); | ||||
|             scaleVmCommand.getVirtualMachine().setDetails(details); | ||||
|         } | ||||
| 
 | ||||
|         final ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId()); | ||||
|         ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId()); | ||||
| 
 | ||||
|         work.setStep(Step.Prepare); | ||||
|         work.setResourceType(ItWorkVO.ResourceType.Host); | ||||
|         work.setResourceId(vm.getHostId()); | ||||
|         _workDao.persist(work); | ||||
| 
 | ||||
|         boolean success = false; | ||||
| 
 | ||||
|         try { | ||||
|             if (reconfiguringOnExistingHost) { | ||||
|                 vm.setServiceOfferingId(oldServiceOffering.getId()); | ||||
| @ -4695,17 +4705,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac | ||||
|                 _capacityMgr.allocateVmCapacity(vm, false); // lock the new capacity | ||||
|             } | ||||
| 
 | ||||
|             final Answer reconfigureAnswer = _agentMgr.send(vm.getHostId(), reconfigureCmd); | ||||
|             if (reconfigureAnswer == null || !reconfigureAnswer.getResult()) { | ||||
|                 s_logger.error("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails())); | ||||
|                 throw new CloudRuntimeException("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails())); | ||||
|             Answer scaleVmAnswer = _agentMgr.send(vm.getHostId(), scaleVmCommand); | ||||
|             if (scaleVmAnswer == null || !scaleVmAnswer.getResult()) { | ||||
|                 String msg = String.format("Unable to scale %s due to [%s].", vm.toString(), (scaleVmAnswer == null ? "" : scaleVmAnswer.getDetails())); | ||||
|                 s_logger.error(msg); | ||||
|                 throw new CloudRuntimeException(msg); | ||||
|             } | ||||
|             if (vm.getType().equals(VirtualMachine.Type.User)) { | ||||
|                 _userVmMgr.generateUsageEvent(vm, vm.isDisplayVm(), EventTypes.EVENT_VM_DYNAMIC_SCALE); | ||||
|             } | ||||
|             success = true; | ||||
|         } catch (final OperationTimedoutException e) { | ||||
|             throw new AgentUnavailableException("Operation timed out on reconfiguring " + vm, dstHostId); | ||||
|         } catch (OperationTimedoutException e) { | ||||
|             throw new AgentUnavailableException(String.format("Unable to scale %s due to [%s].", vm.toString(), e.getMessage()), dstHostId, e); | ||||
|         } catch (final AgentUnavailableException e) { | ||||
|             throw e; | ||||
|         } finally { | ||||
|  | ||||
| @ -34,6 +34,8 @@ import com.cloud.agent.api.to.DiskTO; | ||||
| import com.cloud.agent.api.to.NicTO; | ||||
| import com.cloud.agent.api.to.VirtualMachineTO; | ||||
| import com.cloud.gpu.GPU; | ||||
| import com.cloud.host.HostVO; | ||||
| import com.cloud.host.dao.HostDao; | ||||
| import com.cloud.network.Networks.BroadcastDomainType; | ||||
| import com.cloud.network.dao.NetworkDao; | ||||
| import com.cloud.network.dao.NetworkDetailVO; | ||||
| @ -49,7 +51,6 @@ import com.cloud.service.dao.ServiceOfferingDetailsDao; | ||||
| import com.cloud.storage.StoragePool; | ||||
| import com.cloud.storage.Volume; | ||||
| import com.cloud.utils.Pair; | ||||
| import com.cloud.utils.StringUtils; | ||||
| import com.cloud.utils.component.AdapterBase; | ||||
| import com.cloud.vm.NicProfile; | ||||
| import com.cloud.vm.NicVO; | ||||
| @ -61,8 +62,11 @@ import com.cloud.vm.dao.NicDao; | ||||
| import com.cloud.vm.dao.NicSecondaryIpDao; | ||||
| import com.cloud.vm.dao.UserVmDetailsDao; | ||||
| import com.cloud.vm.dao.VMInstanceDao; | ||||
| import org.apache.cloudstack.framework.config.ConfigKey; | ||||
| import org.apache.cloudstack.framework.config.Configurable; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| 
 | ||||
| public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru { | ||||
| public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru, Configurable { | ||||
|     public static final Logger s_logger = Logger.getLogger(HypervisorGuruBase.class); | ||||
| 
 | ||||
|     @Inject | ||||
| @ -85,6 +89,14 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis | ||||
|     private ServiceOfferingDao _serviceOfferingDao; | ||||
|     @Inject | ||||
|     private NetworkDetailsDao networkDetailsDao; | ||||
|     @Inject | ||||
|     private HostDao hostDao; | ||||
| 
 | ||||
|     public static ConfigKey<Boolean> VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.min.memory.equals.memory.divided.by.mem.overprovisioning.factor", "true", | ||||
|             "If we set this to 'true', a minimum memory (memory/ mem.overprovisioning.factor) will be set to the VM, independent of using a scalable service offering or not.", true, ConfigKey.Scope.Cluster); | ||||
| 
 | ||||
|     public static ConfigKey<Boolean> VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.min.cpu.speed.equals.cpu.speed.divided.by.cpu.overprovisioning.factor", "true", | ||||
|             "If we set this to 'true', a minimum CPU speed (cpu speed/ cpu.overprovisioning.factor) will be set on the VM, independent of using a scalable service offering or not.", true, ConfigKey.Scope.Cluster); | ||||
| 
 | ||||
|     @Override | ||||
|     public NicTO toNicTO(NicProfile profile) { | ||||
| @ -167,8 +179,13 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis | ||||
|     protected VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile vmProfile) { | ||||
|         ServiceOffering offering = _serviceOfferingDao.findById(vmProfile.getId(), vmProfile.getServiceOfferingId()); | ||||
|         VirtualMachine vm = vmProfile.getVirtualMachine(); | ||||
|         Long minMemory = (long)(offering.getRamSize() / vmProfile.getMemoryOvercommitRatio()); | ||||
|         int minspeed = (int)(offering.getSpeed() / vmProfile.getCpuOvercommitRatio()); | ||||
|         HostVO host = hostDao.findById(vm.getHostId()); | ||||
| 
 | ||||
|         boolean divideMemoryByOverprovisioning = VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor.valueIn(host.getClusterId()); | ||||
|         boolean divideCpuByOverprovisioning = VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor.valueIn(host.getClusterId()); | ||||
| 
 | ||||
|         Long minMemory = (long)(offering.getRamSize() / (divideMemoryByOverprovisioning ? vmProfile.getMemoryOvercommitRatio() : 1)); | ||||
|         int minspeed = (int)(offering.getSpeed() / (divideCpuByOverprovisioning ? vmProfile.getCpuOvercommitRatio() : 1)); | ||||
|         int maxspeed = (offering.getSpeed()); | ||||
|         VirtualMachineTO to = new VirtualMachineTO(vm.getId(), vm.getInstanceName(), vm.getType(), offering.getCpu(), minspeed, maxspeed, minMemory * 1024l * 1024l, | ||||
|                 offering.getRamSize() * 1024l * 1024l, null, null, vm.isHaEnabled(), vm.limitCpuUse(), vm.getVncPassword()); | ||||
| @ -302,4 +319,15 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis | ||||
|     public List<Command> finalizeMigrate(VirtualMachine vm, Map<Volume, StoragePool> volumeToPool) { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|      @Override | ||||
|     public String getConfigComponentName() { | ||||
|         return HypervisorGuruBase.class.getSimpleName(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public ConfigKey<?>[] getConfigKeys() { | ||||
|         return new ConfigKey<?>[] {VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor, VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor }; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -30,7 +30,7 @@ | ||||
| 	  <property name="format" value="^[a-zA-Z][a-zA-Z0-9_]*$" /> | ||||
| 	</module> | ||||
| 	<module name="StaticVariableName"> | ||||
| 	  <property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*$"/> | ||||
| 	  <property name="format" value="^(s_)?[a-zA-Z][a-zA-Z0-9_]*$"/> | ||||
| 	</module> | ||||
| 	<module name="ConstantName"> | ||||
| 	  <property name="format" value="^[a-zA-Z][a-zA-Z0-9_]*$"/> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user