mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-2502: Scalevm and over provisioning should respect each other
During Scale up of VM, memory/cpu calculations should consider the memory/cpu overprovisioning factors which are set per cluster. CLOUDSTACK-2939: CPU limit is not getting set for vm after scaleup to a service offering which have cpu cap enabled Signed-off-by: Abhinandan Prateek <aprateek@apache.org>
This commit is contained in:
parent
b72c79b370
commit
b83b8eb838
@ -23,7 +23,8 @@ public class ScaleVmCommand extends Command {
|
|||||||
VirtualMachineTO vm;
|
VirtualMachineTO vm;
|
||||||
String vmName;
|
String vmName;
|
||||||
int cpus;
|
int cpus;
|
||||||
Integer speed;
|
Integer minSpeed;
|
||||||
|
Integer maxSpeed;
|
||||||
long minRam;
|
long minRam;
|
||||||
long maxRam;
|
long maxRam;
|
||||||
|
|
||||||
@ -40,14 +41,15 @@ public class ScaleVmCommand extends Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ScaleVmCommand(String vmName, int cpus,
|
public ScaleVmCommand(String vmName, int cpus,
|
||||||
Integer speed, long minRam, long maxRam, boolean limitCpuUse) {
|
Integer minSpeed, Integer maxSpeed, long minRam, long maxRam, boolean limitCpuUse) {
|
||||||
super();
|
super();
|
||||||
this.vmName = vmName;
|
this.vmName = vmName;
|
||||||
this.cpus = cpus;
|
this.cpus = cpus;
|
||||||
this.speed = speed;
|
this.minSpeed = minSpeed;
|
||||||
|
this.maxSpeed = maxSpeed;
|
||||||
this.minRam = minRam;
|
this.minRam = minRam;
|
||||||
this.maxRam = maxRam;
|
this.maxRam = maxRam;
|
||||||
this.vm = new VirtualMachineTO(1L, vmName, null, cpus, speed, minRam, maxRam, null, null, false, false, null);
|
this.vm = new VirtualMachineTO(1L, vmName, null, cpus, minSpeed, maxSpeed, minRam, maxRam, null, null, false, limitCpuUse, null);
|
||||||
/*vm.setName(vmName);
|
/*vm.setName(vmName);
|
||||||
vm.setCpus(cpus);
|
vm.setCpus(cpus);
|
||||||
vm.setRam(minRam, maxRam);*/
|
vm.setRam(minRam, maxRam);*/
|
||||||
@ -57,14 +59,22 @@ public class ScaleVmCommand extends Command {
|
|||||||
this.cpus = cpus;
|
this.cpus = cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getSpeed() {
|
public Integer getMinSpeed() {
|
||||||
return speed;
|
return minSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSpeed(Integer speed) {
|
public void setMinSpeed(Integer minSpeed) {
|
||||||
this.speed = speed;
|
this.minSpeed = minSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getMaxSpeed() {
|
||||||
|
return minSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxSpeed(Integer maxSpeed) {
|
||||||
|
this.maxSpeed = maxSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
public long getMinRam() {
|
public long getMinRam() {
|
||||||
return minRam;
|
return minRam;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2330,9 +2330,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||||||
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
||||||
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
|
VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
|
||||||
VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
|
VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
|
||||||
int ramMb = (int) (vmSpec.getMinRam());
|
int ramMb = (int) (vmSpec.getMinRam()/(1024 * 1024));
|
||||||
|
|
||||||
VmwareHelper.setVmScaleUpConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getSpeed(), vmSpec.getSpeed(),(int) (vmSpec.getMaxRam()), ramMb, vmSpec.getLimitCpuUse());
|
VmwareHelper.setVmScaleUpConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getMaxSpeed(), vmSpec.getMinSpeed(),(int) (vmSpec.getMaxRam()/(1024 * 1024)), ramMb, vmSpec.getLimitCpuUse());
|
||||||
|
|
||||||
if(!vmMo.configureVm(vmConfigSpec)) {
|
if(!vmMo.configureVm(vmConfigSpec)) {
|
||||||
throw new Exception("Unable to execute ScaleVmCommand");
|
throw new Exception("Unable to execute ScaleVmCommand");
|
||||||
|
|||||||
@ -68,10 +68,11 @@ public class VmwareResourceTest {
|
|||||||
when(_resource.getHyperHost(context, null)).thenReturn(hyperHost);
|
when(_resource.getHyperHost(context, null)).thenReturn(hyperHost);
|
||||||
doReturn("i-2-3-VM").when(cmd).getVmName();
|
doReturn("i-2-3-VM").when(cmd).getVmName();
|
||||||
when(hyperHost.findVmOnHyperHost("i-2-3-VM")).thenReturn(vmMo);
|
when(hyperHost.findVmOnHyperHost("i-2-3-VM")).thenReturn(vmMo);
|
||||||
doReturn(1024L).when(vmSpec).getMinRam();
|
doReturn(536870912L).when(vmSpec).getMinRam();
|
||||||
doReturn(1).when(vmSpec).getCpus();
|
doReturn(1).when(vmSpec).getCpus();
|
||||||
doReturn(1000).when(vmSpec).getSpeed();
|
doReturn(1000).when(vmSpec).getMinSpeed();
|
||||||
doReturn(1024L).when(vmSpec).getMaxRam();
|
doReturn(1000).when(vmSpec).getMaxSpeed();
|
||||||
|
doReturn(536870912L).when(vmSpec).getMaxRam();
|
||||||
doReturn(false).when(vmSpec).getLimitCpuUse();
|
doReturn(false).when(vmSpec).getLimitCpuUse();
|
||||||
when(vmMo.configureVm(vmConfigSpec)).thenReturn(true);
|
when(vmMo.configureVm(vmConfigSpec)).thenReturn(true);
|
||||||
|
|
||||||
|
|||||||
@ -635,16 +635,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
|
|
||||||
Long staticMemoryMax = vm.getMemoryStaticMax(conn);
|
Long staticMemoryMax = vm.getMemoryStaticMax(conn);
|
||||||
Long staticMemoryMin = vm.getMemoryStaticMin(conn);
|
Long staticMemoryMin = vm.getMemoryStaticMin(conn);
|
||||||
Long newDynamicMemoryMin = vmSpec.getMinRam() * 1024 * 1024;
|
Long newDynamicMemoryMin = vmSpec.getMinRam();
|
||||||
Long newDynamicMemoryMax = vmSpec.getMaxRam() * 1024 * 1024;
|
Long newDynamicMemoryMax = vmSpec.getMaxRam();
|
||||||
if (staticMemoryMin > newDynamicMemoryMin || newDynamicMemoryMax > staticMemoryMax) {
|
if (staticMemoryMin > newDynamicMemoryMin || newDynamicMemoryMax > staticMemoryMax) {
|
||||||
throw new CloudRuntimeException("Cannot scale up the vm because of memory constraint violation: 0 <= memory-static-min <= memory-dynamic-min <= memory-dynamic-max <= memory-static-max ");
|
throw new CloudRuntimeException("Cannot scale up the vm because of memory constraint violation: 0 <= memory-static-min <= memory-dynamic-min <= memory-dynamic-max <= memory-static-max ");
|
||||||
}
|
}
|
||||||
|
|
||||||
vm.setMemoryDynamicRange(conn, vmSpec.getMinRam() * 1024 * 1024, vmSpec.getMaxRam() * 1024 * 1024);
|
vm.setMemoryDynamicRange(conn, newDynamicMemoryMin, newDynamicMemoryMax);
|
||||||
vm.setVCPUsNumberLive(conn, (long)vmSpec.getCpus());
|
vm.setVCPUsNumberLive(conn, (long)vmSpec.getCpus());
|
||||||
|
|
||||||
Integer speed = vmSpec.getSpeed();
|
Integer speed = vmSpec.getMinSpeed();
|
||||||
if (speed != null) {
|
if (speed != null) {
|
||||||
|
|
||||||
int cpuWeight = _maxWeight; //cpu_weight
|
int cpuWeight = _maxWeight; //cpu_weight
|
||||||
|
|||||||
@ -113,10 +113,14 @@ public class CitrixResourceBaseTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testScaleVMF2() throws Types.XenAPIException, XmlRpcException {
|
public void testScaleVMF2() throws Types.XenAPIException, XmlRpcException {
|
||||||
|
|
||||||
|
when(vm.getMemoryStaticMax(conn)).thenReturn(1073741824L);
|
||||||
|
when(vm.getMemoryStaticMin(conn)).thenReturn(268435456L);
|
||||||
|
doReturn(536870912L).when(vmSpec).getMinRam();
|
||||||
|
doReturn(536870912L).when(vmSpec).getMaxRam();
|
||||||
doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
|
doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
|
||||||
doReturn(1).when(vmSpec).getCpus();
|
doReturn(1).when(vmSpec).getCpus();
|
||||||
doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
|
doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
|
||||||
doReturn(500).when(vmSpec).getSpeed();
|
doReturn(500).when(vmSpec).getMinSpeed();
|
||||||
doReturn(false).when(vmSpec).getLimitCpuUse();
|
doReturn(false).when(vmSpec).getLimitCpuUse();
|
||||||
Map<String, String> args = (Map<String, String>)mock(HashMap.class);
|
Map<String, String> args = (Map<String, String>)mock(HashMap.class);
|
||||||
when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
|
when(host.callPlugin(conn, "vmops", "add_to_VCPUs_params_live", args)).thenReturn("Success");
|
||||||
@ -132,10 +136,14 @@ public class CitrixResourceBaseTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testScaleVMF3() throws Types.XenAPIException, XmlRpcException {
|
public void testScaleVMF3() throws Types.XenAPIException, XmlRpcException {
|
||||||
|
|
||||||
|
when(vm.getMemoryStaticMax(conn)).thenReturn(1073741824L);
|
||||||
|
when(vm.getMemoryStaticMin(conn)).thenReturn(268435456L);
|
||||||
|
doReturn(536870912L).when(vmSpec).getMinRam();
|
||||||
|
doReturn(536870912L).when(vmSpec).getMaxRam();
|
||||||
doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
|
doNothing().when(vm).setMemoryDynamicRange(conn, 536870912L, 536870912L);
|
||||||
doReturn(1).when(vmSpec).getCpus();
|
doReturn(1).when(vmSpec).getCpus();
|
||||||
doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
|
doNothing().when(vm).setVCPUsNumberLive(conn, 1L);
|
||||||
doReturn(500).when(vmSpec).getSpeed();
|
doReturn(500).when(vmSpec).getMinSpeed();
|
||||||
doReturn(true).when(vmSpec).getLimitCpuUse();
|
doReturn(true).when(vmSpec).getLimitCpuUse();
|
||||||
doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "100", "vmname", "i-2-3-VM");
|
doReturn(null).when(_resource).callHostPlugin(conn, "vmops", "add_to_VCPUs_params_live", "key", "cap", "value", "100", "vmname", "i-2-3-VM");
|
||||||
Map<String, String> args = (Map<String, String>)mock(HashMap.class);
|
Map<String, String> args = (Map<String, String>)mock(HashMap.class);
|
||||||
|
|||||||
@ -86,7 +86,7 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected <T extends VirtualMachine> VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile<T> vmProfile) {
|
protected <T extends VirtualMachine> VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile<T> vmProfile) {
|
||||||
|
|
||||||
ServiceOffering offering = vmProfile.getServiceOffering();
|
ServiceOffering offering = vmProfile.getServiceOffering();
|
||||||
VirtualMachine vm = vmProfile.getVirtualMachine();
|
VirtualMachine vm = vmProfile.getVirtualMachine();
|
||||||
|
|||||||
@ -129,6 +129,7 @@ import com.cloud.network.rules.RulesManager;
|
|||||||
import com.cloud.offering.ServiceOffering;
|
import com.cloud.offering.ServiceOffering;
|
||||||
import com.cloud.org.Cluster;
|
import com.cloud.org.Cluster;
|
||||||
import com.cloud.resource.ResourceManager;
|
import com.cloud.resource.ResourceManager;
|
||||||
|
import com.cloud.server.ConfigurationServer;
|
||||||
import com.cloud.service.ServiceOfferingVO;
|
import com.cloud.service.ServiceOfferingVO;
|
||||||
import com.cloud.service.dao.ServiceOfferingDao;
|
import com.cloud.service.dao.ServiceOfferingDao;
|
||||||
import com.cloud.storage.DiskOfferingVO;
|
import com.cloud.storage.DiskOfferingVO;
|
||||||
@ -256,6 +257,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
|||||||
protected RulesManager rulesMgr;
|
protected RulesManager rulesMgr;
|
||||||
@Inject
|
@Inject
|
||||||
protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
|
protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
|
||||||
|
@Inject
|
||||||
|
protected ConfigurationServer _configServer;
|
||||||
|
|
||||||
protected List<DeploymentPlanner> _planners;
|
protected List<DeploymentPlanner> _planners;
|
||||||
public List<DeploymentPlanner> getPlanners() {
|
public List<DeploymentPlanner> getPlanners() {
|
||||||
@ -3226,8 +3229,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
|||||||
|
|
||||||
long newServiceofferingId = vm.getServiceOfferingId();
|
long newServiceofferingId = vm.getServiceOfferingId();
|
||||||
ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceofferingId);
|
ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceofferingId);
|
||||||
|
HostVO hostVo = _hostDao.findById(vm.hostId);
|
||||||
|
Float memoryOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), hostVo.getClusterId()));
|
||||||
|
Float cpuOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), hostVo.getClusterId()));
|
||||||
|
long minMemory = (long) (newServiceOffering.getRamSize()/memoryOvercommitRatio);
|
||||||
ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(),
|
ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(),
|
||||||
newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
|
(int) (newServiceOffering.getSpeed()/cpuOvercommitRatio), newServiceOffering.getSpeed(), minMemory * 1024 * 1024, newServiceOffering.getRamSize() * 1024 * 1024, newServiceOffering.getLimitCpuUse());
|
||||||
|
|
||||||
Long dstHostId = vm.getHostId();
|
Long dstHostId = vm.getHostId();
|
||||||
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());
|
||||||
|
|||||||
@ -22,11 +22,13 @@ import com.cloud.agent.api.Answer;
|
|||||||
import com.cloud.agent.api.ScaleVmAnswer;
|
import com.cloud.agent.api.ScaleVmAnswer;
|
||||||
import com.cloud.agent.api.ScaleVmCommand;
|
import com.cloud.agent.api.ScaleVmCommand;
|
||||||
import com.cloud.capacity.CapacityManager;
|
import com.cloud.capacity.CapacityManager;
|
||||||
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.configuration.ConfigurationManager;
|
import com.cloud.configuration.ConfigurationManager;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.deploy.DeployDestination;
|
import com.cloud.deploy.DeployDestination;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
|
import com.cloud.server.ConfigurationServer;
|
||||||
import com.cloud.service.ServiceOfferingVO;
|
import com.cloud.service.ServiceOfferingVO;
|
||||||
import com.cloud.storage.VMTemplateVO;
|
import com.cloud.storage.VMTemplateVO;
|
||||||
import com.cloud.storage.VolumeManager;
|
import com.cloud.storage.VolumeManager;
|
||||||
@ -154,6 +156,10 @@ public class VirtualMachineManagerImplTest {
|
|||||||
List<VolumeVO> _rootVols;
|
List<VolumeVO> _rootVols;
|
||||||
@Mock
|
@Mock
|
||||||
ItWorkVO _work;
|
ItWorkVO _work;
|
||||||
|
@Mock
|
||||||
|
ConfigurationServer _configServer;
|
||||||
|
@Mock
|
||||||
|
HostVO hostVO;
|
||||||
|
|
||||||
@Mock ClusterDao _clusterDao;
|
@Mock ClusterDao _clusterDao;
|
||||||
@Mock HostPodDao _podDao;
|
@Mock HostPodDao _podDao;
|
||||||
@ -199,6 +205,7 @@ public class VirtualMachineManagerImplTest {
|
|||||||
_vmMgr._hvGuruMgr = _hvGuruMgr;
|
_vmMgr._hvGuruMgr = _hvGuruMgr;
|
||||||
_vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
|
_vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
|
||||||
_vmMgr._vmDao = _vmInstanceDao;
|
_vmMgr._vmDao = _vmInstanceDao;
|
||||||
|
_vmMgr._configServer = _configServer;
|
||||||
|
|
||||||
when(_vmMock.getId()).thenReturn(314l);
|
when(_vmMock.getId()).thenReturn(314l);
|
||||||
when(_vmInstance.getId()).thenReturn(1L);
|
when(_vmInstance.getId()).thenReturn(1L);
|
||||||
@ -239,8 +246,12 @@ public class VirtualMachineManagerImplTest {
|
|||||||
|
|
||||||
when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
|
when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
|
||||||
ServiceOfferingVO newServiceOffering = getSvcoffering(512);
|
ServiceOfferingVO newServiceOffering = getSvcoffering(512);
|
||||||
|
when(_hostDao.findById(_vmInstance.hostId)).thenReturn(hostVO);
|
||||||
|
doReturn(1L).when(hostVO).getClusterId();
|
||||||
|
when(_configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
|
||||||
|
when(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
|
||||||
ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(),
|
ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(),
|
||||||
newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
|
newServiceOffering.getSpeed(), newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
|
||||||
Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details");
|
Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details");
|
||||||
when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null);
|
when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null);
|
||||||
_vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false);
|
_vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user