Skip to content

Commit 6531ee5

Browse files
GutoVeroneziDaniel Augusto Veronezi SalvadorDaanHoogland
authored
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>
1 parent f1c83a0 commit 6531ee5

3 files changed

Lines changed: 66 additions & 27 deletions

File tree

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@
171171
import com.cloud.host.dao.HostDao;
172172
import com.cloud.hypervisor.Hypervisor.HypervisorType;
173173
import com.cloud.hypervisor.HypervisorGuru;
174+
import com.cloud.hypervisor.HypervisorGuruBase;
174175
import com.cloud.hypervisor.HypervisorGuruManager;
175176
import com.cloud.network.Network;
176177
import com.cloud.network.NetworkModel;
@@ -4659,34 +4660,43 @@ public VMInstanceVO reConfigureVm(final String vmUuid, final ServiceOffering old
46594660
}
46604661
}
46614662

4662-
private VMInstanceVO orchestrateReConfigureVm(final String vmUuid, final ServiceOffering oldServiceOffering, final ServiceOffering newServiceOffering,
4663-
final boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException {
4664-
final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
4663+
private VMInstanceVO orchestrateReConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, ServiceOffering newServiceOffering,
4664+
boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException {
4665+
VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
46654666
upgradeVmDb(vm.getId(), newServiceOffering, oldServiceOffering);
46664667

4667-
final HostVO hostVo = _hostDao.findById(vm.getHostId());
4668-
final Float memoryOvercommitRatio = CapacityManager.MemOverprovisioningFactor.valueIn(hostVo.getClusterId());
4669-
final Float cpuOvercommitRatio = CapacityManager.CpuOverprovisioningFactor.valueIn(hostVo.getClusterId());
4670-
final long minMemory = (long)(newServiceOffering.getRamSize() / memoryOvercommitRatio);
4671-
final ScaleVmCommand reconfigureCmd =
4672-
new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), (int)(newServiceOffering.getSpeed() / cpuOvercommitRatio),
4668+
HostVO hostVo = _hostDao.findById(vm.getHostId());
4669+
4670+
Long clustedId = hostVo.getClusterId();
4671+
Float memoryOvercommitRatio = CapacityManager.MemOverprovisioningFactor.valueIn(clustedId);
4672+
Float cpuOvercommitRatio = CapacityManager.CpuOverprovisioningFactor.valueIn(clustedId);
4673+
boolean divideMemoryByOverprovisioning = HypervisorGuruBase.VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor.valueIn(clustedId);
4674+
boolean divideCpuByOverprovisioning = HypervisorGuruBase.VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor.valueIn(clustedId);
4675+
4676+
int minMemory = (int)(newServiceOffering.getRamSize() / (divideMemoryByOverprovisioning ? memoryOvercommitRatio : 1));
4677+
int minSpeed = (int)(newServiceOffering.getSpeed() / (divideCpuByOverprovisioning ? cpuOvercommitRatio : 1));
4678+
4679+
ScaleVmCommand scaleVmCommand =
4680+
new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), minSpeed,
46734681
newServiceOffering.getSpeed(), minMemory * 1024L * 1024L, newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse());
46744682

4675-
final Long dstHostId = vm.getHostId();
4676-
if(vm.getHypervisorType().equals(HypervisorType.VMware)) {
4677-
final HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
4678-
Map<String, String> details = null;
4679-
details = hvGuru.getClusterSettings(vm.getId());
4680-
reconfigureCmd.getVirtualMachine().setDetails(details);
4683+
Long dstHostId = vm.getHostId();
4684+
4685+
if (vm.getHypervisorType().equals(HypervisorType.VMware)) {
4686+
HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
4687+
Map<String, String> details = hvGuru.getClusterSettings(vm.getId());
4688+
scaleVmCommand.getVirtualMachine().setDetails(details);
46814689
}
46824690

4683-
final ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId());
4691+
ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId());
46844692

46854693
work.setStep(Step.Prepare);
46864694
work.setResourceType(ItWorkVO.ResourceType.Host);
46874695
work.setResourceId(vm.getHostId());
46884696
_workDao.persist(work);
4697+
46894698
boolean success = false;
4699+
46904700
try {
46914701
if (reconfiguringOnExistingHost) {
46924702
vm.setServiceOfferingId(oldServiceOffering.getId());
@@ -4695,17 +4705,18 @@ private VMInstanceVO orchestrateReConfigureVm(final String vmUuid, final Service
46954705
_capacityMgr.allocateVmCapacity(vm, false); // lock the new capacity
46964706
}
46974707

4698-
final Answer reconfigureAnswer = _agentMgr.send(vm.getHostId(), reconfigureCmd);
4699-
if (reconfigureAnswer == null || !reconfigureAnswer.getResult()) {
4700-
s_logger.error("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails()));
4701-
throw new CloudRuntimeException("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails()));
4708+
Answer scaleVmAnswer = _agentMgr.send(vm.getHostId(), scaleVmCommand);
4709+
if (scaleVmAnswer == null || !scaleVmAnswer.getResult()) {
4710+
String msg = String.format("Unable to scale %s due to [%s].", vm.toString(), (scaleVmAnswer == null ? "" : scaleVmAnswer.getDetails()));
4711+
s_logger.error(msg);
4712+
throw new CloudRuntimeException(msg);
47024713
}
47034714
if (vm.getType().equals(VirtualMachine.Type.User)) {
47044715
_userVmMgr.generateUsageEvent(vm, vm.isDisplayVm(), EventTypes.EVENT_VM_DYNAMIC_SCALE);
47054716
}
47064717
success = true;
4707-
} catch (final OperationTimedoutException e) {
4708-
throw new AgentUnavailableException("Operation timed out on reconfiguring " + vm, dstHostId);
4718+
} catch (OperationTimedoutException e) {
4719+
throw new AgentUnavailableException(String.format("Unable to scale %s due to [%s].", vm.toString(), e.getMessage()), dstHostId, e);
47094720
} catch (final AgentUnavailableException e) {
47104721
throw e;
47114722
} finally {

server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import com.cloud.agent.api.to.NicTO;
3535
import com.cloud.agent.api.to.VirtualMachineTO;
3636
import com.cloud.gpu.GPU;
37+
import com.cloud.host.HostVO;
38+
import com.cloud.host.dao.HostDao;
3739
import com.cloud.network.Networks.BroadcastDomainType;
3840
import com.cloud.network.dao.NetworkDao;
3941
import com.cloud.network.dao.NetworkDetailVO;
@@ -49,7 +51,6 @@
4951
import com.cloud.storage.StoragePool;
5052
import com.cloud.storage.Volume;
5153
import com.cloud.utils.Pair;
52-
import com.cloud.utils.StringUtils;
5354
import com.cloud.utils.component.AdapterBase;
5455
import com.cloud.vm.NicProfile;
5556
import com.cloud.vm.NicVO;
@@ -61,8 +62,11 @@
6162
import com.cloud.vm.dao.NicSecondaryIpDao;
6263
import com.cloud.vm.dao.UserVmDetailsDao;
6364
import com.cloud.vm.dao.VMInstanceDao;
65+
import org.apache.cloudstack.framework.config.ConfigKey;
66+
import org.apache.cloudstack.framework.config.Configurable;
67+
import org.apache.commons.lang3.StringUtils;
6468

65-
public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru {
69+
public abstract class HypervisorGuruBase extends AdapterBase implements HypervisorGuru, Configurable {
6670
public static final Logger s_logger = Logger.getLogger(HypervisorGuruBase.class);
6771

6872
@Inject
@@ -85,6 +89,14 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
8589
private ServiceOfferingDao _serviceOfferingDao;
8690
@Inject
8791
private NetworkDetailsDao networkDetailsDao;
92+
@Inject
93+
private HostDao hostDao;
94+
95+
public static ConfigKey<Boolean> VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.min.memory.equals.memory.divided.by.mem.overprovisioning.factor", "true",
96+
"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);
97+
98+
public static ConfigKey<Boolean> VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.min.cpu.speed.equals.cpu.speed.divided.by.cpu.overprovisioning.factor", "true",
99+
"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);
88100

89101
@Override
90102
public NicTO toNicTO(NicProfile profile) {
@@ -167,8 +179,13 @@ protected void addServiceOfferingExtraConfiguration(ServiceOffering offering, Vi
167179
protected VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile vmProfile) {
168180
ServiceOffering offering = _serviceOfferingDao.findById(vmProfile.getId(), vmProfile.getServiceOfferingId());
169181
VirtualMachine vm = vmProfile.getVirtualMachine();
170-
Long minMemory = (long)(offering.getRamSize() / vmProfile.getMemoryOvercommitRatio());
171-
int minspeed = (int)(offering.getSpeed() / vmProfile.getCpuOvercommitRatio());
182+
HostVO host = hostDao.findById(vm.getHostId());
183+
184+
boolean divideMemoryByOverprovisioning = VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor.valueIn(host.getClusterId());
185+
boolean divideCpuByOverprovisioning = VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor.valueIn(host.getClusterId());
186+
187+
Long minMemory = (long)(offering.getRamSize() / (divideMemoryByOverprovisioning ? vmProfile.getMemoryOvercommitRatio() : 1));
188+
int minspeed = (int)(offering.getSpeed() / (divideCpuByOverprovisioning ? vmProfile.getCpuOvercommitRatio() : 1));
172189
int maxspeed = (offering.getSpeed());
173190
VirtualMachineTO to = new VirtualMachineTO(vm.getId(), vm.getInstanceName(), vm.getType(), offering.getCpu(), minspeed, maxspeed, minMemory * 1024l * 1024l,
174191
offering.getRamSize() * 1024l * 1024l, null, null, vm.isHaEnabled(), vm.limitCpuUse(), vm.getVncPassword());
@@ -302,4 +319,15 @@ public boolean attachRestoredVolumeToVirtualMachine(long zoneId, String location
302319
public List<Command> finalizeMigrate(VirtualMachine vm, Map<Volume, StoragePool> volumeToPool) {
303320
return null;
304321
}
322+
323+
@Override
324+
public String getConfigComponentName() {
325+
return HypervisorGuruBase.class.getSimpleName();
326+
}
327+
328+
@Override
329+
public ConfigKey<?>[] getConfigKeys() {
330+
return new ConfigKey<?>[] {VmMinMemoryEqualsMemoryDividedByMemOverprovisioningFactor, VmMinCpuSpeedEqualsCpuSpeedDividedByCpuOverprovisioningFactor };
331+
}
332+
305333
}

tools/checkstyle/src/main/resources/cloud-style.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<property name="format" value="^[a-zA-Z][a-zA-Z0-9_]*$" />
3131
</module>
3232
<module name="StaticVariableName">
33-
<property name="format" value="^(s_)?[a-z][a-zA-Z0-9]*$"/>
33+
<property name="format" value="^(s_)?[a-zA-Z][a-zA-Z0-9_]*$"/>
3434
</module>
3535
<module name="ConstantName">
3636
<property name="format" value="^[a-zA-Z][a-zA-Z0-9_]*$"/>

0 commit comments

Comments
 (0)