server: fix on changeServiceForVirtualMachine when updating read/write rate (#4491)

When changing the service offering of a VM the disk_offering_id is not
updated in volumes DB table and VM could not start

Fixes #4125
This commit is contained in:
slavkap 2021-01-27 15:57:34 +02:00 committed by GitHub
parent b84a675de9
commit 4a779deab2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1035,6 +1035,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
// Check that the specified service offering ID is valid
_itMgr.checkIfCanUpgrade(vmInstance, newServiceOffering);
resizeRootVolumeOfVmWithNewOffering(vmInstance, newServiceOffering);
_itMgr.upgradeVmDb(vmId, newServiceOffering, currentServiceOffering);
// Increment or decrement CPU and Memory count accordingly.
@ -1139,19 +1141,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
// Check that the specified service offering ID is valid
_itMgr.checkIfCanUpgrade(vmInstance, newServiceOffering);
DiskOfferingVO newROOTDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId());
List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId());
for (final VolumeVO rootVolumeOfVm : vols) {
rootVolumeOfVm.setDiskOfferingId(newROOTDiskOffering.getId());
_volsDao.update(rootVolumeOfVm.getId(), rootVolumeOfVm);
ResizeVolumeCmd resizeVolumeCmd = new ResizeVolumeCmd(rootVolumeOfVm.getId(), newROOTDiskOffering.getMinIops(), newROOTDiskOffering.getMaxIops());
_volumeService.resizeVolume(resizeVolumeCmd);
}
resizeRootVolumeOfVmWithNewOffering(vmInstance, newServiceOffering);
// Check if the new service offering can be applied to vm instance
ServiceOffering newSvcOffering = _offeringDao.findById(svcOffId);
@ -1177,6 +1167,23 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
private void resizeRootVolumeOfVmWithNewOffering(VMInstanceVO vmInstance, ServiceOfferingVO newServiceOffering)
throws ResourceAllocationException {
DiskOfferingVO newROOTDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId());
List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId());
for (final VolumeVO rootVolumeOfVm : vols) {
rootVolumeOfVm.setDiskOfferingId(newROOTDiskOffering.getId());
ResizeVolumeCmd resizeVolumeCmd = new ResizeVolumeCmd(rootVolumeOfVm.getId(), newROOTDiskOffering.getMinIops(), newROOTDiskOffering.getMaxIops());
_volumeService.resizeVolume(resizeVolumeCmd);
_volsDao.update(rootVolumeOfVm.getId(), rootVolumeOfVm);
}
}
@Override
@ActionEvent(eventType = EventTypes.EVENT_NIC_CREATE, eventDescription = "Creating Nic", async = true)
public UserVm addNicToVirtualMachine(AddNicToVMCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, CloudRuntimeException {