Skip to content

Commit 9df6dec

Browse files
committed
allow change only one parameter during live scale
1 parent 88f64de commit 9df6dec

2 files changed

Lines changed: 116 additions & 2 deletions

File tree

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
399399
@Inject
400400
private VMTemplateZoneDao _templateZoneDao;
401401
@Inject
402-
private TemplateDataStoreDao _templateStoreDao;
402+
protected TemplateDataStoreDao _templateStoreDao;
403403
@Inject
404404
private DomainDao _domainDao;
405405
@Inject
@@ -1226,6 +1226,39 @@ public UserVm upgradeVirtualMachine(UpgradeVMCmd cmd) throws ResourceAllocationE
12261226
return userVm;
12271227
}
12281228

1229+
/**
1230+
Updates the instance details map with the current values of the instance for the CPU speed, memory, and CPU number if they have not been specified.
1231+
@param details Map containing the instance details.
1232+
@param vmInstance The virtual machine instance.
1233+
@param newServiceOfferingId The ID of the new service offering.
1234+
*/
1235+
1236+
protected void updateInstanceDetails (Map<String, String> details, VirtualMachine vmInstance, Long newServiceOfferingId) {
1237+
ServiceOfferingVO currentServiceOffering = serviceOfferingDao.findByIdIncludingRemoved(vmInstance.getId(), vmInstance.getServiceOfferingId());
1238+
ServiceOfferingVO newServiceOffering = serviceOfferingDao.findById(newServiceOfferingId);
1239+
updateInstanceDetailsWithCurrentValue(newServiceOffering.getSpeed(), details, VmDetailConstants.CPU_SPEED, currentServiceOffering.getSpeed());
1240+
updateInstanceDetailsWithCurrentValue(newServiceOffering.getRamSize(), details, VmDetailConstants.MEMORY, currentServiceOffering.getRamSize());
1241+
updateInstanceDetailsWithCurrentValue(newServiceOffering.getCpu(), details, VmDetailConstants.CPU_NUMBER, currentServiceOffering.getCpu());
1242+
}
1243+
1244+
/**
1245+
* Updates a specific instance detail with the current instance value if the new value is null.
1246+
*
1247+
* @param newValue the new value to be set
1248+
* @param details a map of instance details
1249+
* @param detailsConstant the name of the detail constant to be updated
1250+
* @param currentValue the current value of the detail constant
1251+
*/
1252+
1253+
protected void updateInstanceDetailsWithCurrentValue(Integer newValue, Map<String, String> details, String detailsConstant, Integer currentValue) {
1254+
if (newValue == null && details.get(detailsConstant) == null) {
1255+
String currentValueString = String.valueOf(currentValue);
1256+
s_logger.debug(String.format("[%s] was not specified, keeping the current value: [%s].", detailsConstant, currentValueString));
1257+
details.put(detailsConstant, currentValueString);
1258+
}
1259+
}
1260+
1261+
12291262
private void validateOfferingMaxResource(ServiceOfferingVO offering) {
12301263
Integer maxCPUCores = ConfigurationManagerImpl.VM_SERVICE_OFFERING_MAX_CPU_CORES.value() == 0 ? Integer.MAX_VALUE: ConfigurationManagerImpl.VM_SERVICE_OFFERING_MAX_CPU_CORES.value();
12311264
if (offering.getCpu() > maxCPUCores) {
@@ -1891,7 +1924,12 @@ public UserVm upgradeVirtualMachine(ScaleVMCmd cmd) throws ResourceUnavailableEx
18911924
}
18921925
CallContext.current().setEventDetails("Vm Id: " + vm.getUuid());
18931926

1894-
boolean result = upgradeVirtualMachine(vmId, newServiceOfferingId, cmd.getDetails());
1927+
// boolean result = upgradeVirtualMachine(vmId, newServiceOfferingId, cmd.getDetails());
1928+
Map<String, String> cmdDetails = cmd.getDetails();
1929+
1930+
updateInstanceDetails(cmdDetails, vm, newServiceOfferingId);
1931+
1932+
boolean result = upgradeVirtualMachine(vmId, newServiceOfferingId, cmdDetails);
18951933
if (result) {
18961934
UserVmVO vmInstance = _vmDao.findById(vmId);
18971935
if (vmInstance.getState().equals(State.Stopped)) {

server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ public class UserVmManagerImplTest {
245245
@Mock
246246
ServiceOfferingJoinDao serviceOfferingJoinDao;
247247

248+
@Mock
249+
private VMInstanceVO vmInstanceMock;
250+
248251
private static final long vmId = 1l;
249252
private static final long zoneId = 2L;
250253
private static final long accountId = 3L;
@@ -255,6 +258,8 @@ public class UserVmManagerImplTest {
255258

256259
private Map<String, String> customParameters = new HashMap<>();
257260

261+
String[] detailsConstants = {VmDetailConstants.MEMORY, VmDetailConstants.CPU_NUMBER, VmDetailConstants.CPU_SPEED};
262+
258263
private DiskOfferingVO smallerDisdkOffering = prepareDiskOffering(5l * GiB_TO_BYTES, 1l, 1L, 2L);
259264
private DiskOfferingVO largerDisdkOffering = prepareDiskOffering(10l * GiB_TO_BYTES, 2l, 10L, 20L);
260265

@@ -271,6 +276,10 @@ public void beforeTest() {
271276
CallContext.register(callerUser, callerAccount);
272277

273278
customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, "123");
279+
customParameters.put(VmDetailConstants.MEMORY, "2048");
280+
customParameters.put(VmDetailConstants.CPU_NUMBER, "4");
281+
customParameters.put(VmDetailConstants.CPU_SPEED, "1000");
282+
274283
lenient().doNothing().when(resourceLimitMgr).incrementResourceCount(anyLong(), any(Resource.ResourceType.class));
275284
lenient().doNothing().when(resourceLimitMgr).decrementResourceCount(anyLong(), any(Resource.ResourceType.class), anyLong());
276285

@@ -1221,4 +1230,71 @@ public void testSetVmRequiredFieldsForImportFromLastHost() {
12211230
Mockito.verify(userVmVoMock).setLastHostId(2L);
12221231
Mockito.verify(userVmVoMock).setState(VirtualMachine.State.Running);
12231232
}
1233+
1234+
@Test
1235+
public void updateInstanceDetailsWithCurrentValueTestDetailsConstantIsNotNullDoNothing() {
1236+
int currentValue = 123;
1237+
1238+
for (String detailsConstant : detailsConstants) {
1239+
userVmManagerImpl.updateInstanceDetailsWithCurrentValue(null, customParameters, detailsConstant, currentValue);
1240+
}
1241+
1242+
Assert.assertEquals(customParameters.get(VmDetailConstants.MEMORY), "2048");
1243+
Assert.assertEquals(customParameters.get(VmDetailConstants.CPU_NUMBER), "4");
1244+
Assert.assertEquals(customParameters.get(VmDetailConstants.CPU_SPEED), "1000");
1245+
}
1246+
1247+
@Test
1248+
public void updateInstanceDetailsWithCurrentValueTestNewValueIsNotNullDoNothing() {
1249+
Map<String, String> details = new HashMap<>();
1250+
int currentValue = 123;
1251+
1252+
for (String detailsConstant : detailsConstants) {
1253+
userVmManagerImpl.updateInstanceDetailsWithCurrentValue(321, details, detailsConstant, currentValue);
1254+
}
1255+
1256+
Assert.assertNull(details.get(VmDetailConstants.MEMORY));
1257+
Assert.assertNull(details.get(VmDetailConstants.CPU_NUMBER));
1258+
Assert.assertNull(details.get(VmDetailConstants.CPU_SPEED));
1259+
}
1260+
1261+
@Test
1262+
public void updateInstanceDetailsWithCurrentValueTestBothValuesAreNullKeepCurrentValue() {
1263+
Map<String, String> details = new HashMap<>();
1264+
int currentValue = 123;
1265+
1266+
for (String detailsConstant : detailsConstants) {
1267+
userVmManagerImpl.updateInstanceDetailsWithCurrentValue(null, details, detailsConstant, currentValue);
1268+
}
1269+
1270+
Assert.assertEquals(details.get(VmDetailConstants.MEMORY), String.valueOf(currentValue));
1271+
Assert.assertEquals(details.get(VmDetailConstants.CPU_NUMBER), String.valueOf(currentValue));
1272+
Assert.assertEquals(details.get(VmDetailConstants.CPU_SPEED),String.valueOf(currentValue));
1273+
}
1274+
1275+
@Test
1276+
public void updateInstanceDetailsWithCurrentValueTestNeitherValueIsNullDoNothing() {
1277+
int currentValue = 123;
1278+
1279+
for (String detailsConstant : detailsConstants) {
1280+
userVmManagerImpl.updateInstanceDetailsWithCurrentValue(321, customParameters, detailsConstant, currentValue);
1281+
}
1282+
1283+
Assert.assertEquals(customParameters.get(VmDetailConstants.MEMORY), "2048");
1284+
Assert.assertEquals(customParameters.get(VmDetailConstants.CPU_NUMBER), "4");
1285+
Assert.assertEquals(customParameters.get(VmDetailConstants.CPU_SPEED),"1000");
1286+
}
1287+
1288+
@Test
1289+
public void updateInstanceDetailsTestAllConstantsAreUpdated() {
1290+
Mockito.doReturn(serviceOffering).when(_serviceOfferingDao).findById(Mockito.anyLong());
1291+
Mockito.doReturn(1L).when(vmInstanceMock).getId();
1292+
Mockito.doReturn(1L).when(vmInstanceMock).getServiceOfferingId();
1293+
Mockito.doReturn(serviceOffering).when(_serviceOfferingDao).findByIdIncludingRemoved(Mockito.anyLong(), Mockito.anyLong());
1294+
userVmManagerImpl.updateInstanceDetails(null, vmInstanceMock, 0l);
1295+
1296+
Mockito.verify(userVmManagerImpl).updateInstanceDetailsWithCurrentValue(Mockito.any(), Mockito.any(), Mockito.eq(VmDetailConstants.CPU_SPEED), Mockito.any());
1297+
Mockito.verify(userVmManagerImpl).updateInstanceDetailsWithCurrentValue(Mockito.any(), Mockito.any(), Mockito.eq(VmDetailConstants.MEMORY), Mockito.any());
1298+
Mockito.verify(userVmManagerImpl).updateInstanceDetailsWithCurrentValue(Mockito.any(), Mockito.any(), Mockito.eq(VmDetailConstants.CPU_NUMBER), Mockito.any());
1299+
}
12241300
}

0 commit comments

Comments
 (0)