This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d4f67a  server: NPE occured when dynamic scaling tried on VM and as 
part of this when VM tries to migrate if current host does not have capacity. 
(#3998)
0d4f67a is described below

commit 0d4f67ad8c3e7c3a7cc7e067b7b20c227be7ff0c
Author: harikrishna-patnala <[email protected]>
AuthorDate: Thu Jun 18 09:19:19 2020 +0530

    server: NPE occured when dynamic scaling tried on VM and as part of this 
when VM tries to migrate if current host does not have capacity. (#3998)
    
    Repro Steps:
    1. Create a VM on host1
    2. Make host1 capacity full by deploying multiple VMs
    3. Try Dynamic scaling on VM on host1
    4. NPE occurs when MS tries to find host to migrate the VM and then scale.
    
    Root cause: VM profile is not initiated properly with serviceoffering 
before planning for deployment
    
    Solution: Iniate VM profile with serviceoffering and also make sure custom 
compute parameters are handled
---
 .../api/src/main/java/com/cloud/vm/VirtualMachineManager.java  |  2 +-
 .../src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java  | 10 +++++++---
 .../test/java/com/cloud/vm/VirtualMachineManagerImplTest.java  |  2 +-
 server/src/main/java/com/cloud/vm/UserVmManagerImpl.java       |  2 +-
 4 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java 
b/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
index 3b9358a..e3afbf4 100644
--- a/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
@@ -207,7 +207,7 @@ public interface VirtualMachineManager extends Manager {
     VirtualMachine reConfigureVm(String vmUuid, ServiceOffering 
oldServiceOffering, ServiceOffering newServiceOffering, Map<String, String> 
customParameters, boolean sameHost) throws ResourceUnavailableException, 
ConcurrentOperationException,
             InsufficientServerCapacityException;
 
-    void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, 
DeploymentPlanner.ExcludeList excludeHostList) throws 
InsufficientCapacityException,
+    void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, Map<String, 
String> customParameters, DeploymentPlanner.ExcludeList excludeHostList) throws 
InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException;
 
     void migrateForScale(String vmUuid, long srcHostId, DeployDestination 
dest, Long newSvcOfferingId) throws ResourceUnavailableException, 
ConcurrentOperationException;
diff --git 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
index 20750b3..5ccb80d 100755
--- 
a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ 
b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -3869,15 +3869,19 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
     }
 
     @Override
-    public void findHostAndMigrate(final String vmUuid, final Long 
newSvcOfferingId, final ExcludeList excludes) throws 
InsufficientCapacityException, ConcurrentOperationException,
+    public void findHostAndMigrate(final String vmUuid, final Long 
newSvcOfferingId, final Map<String, String> customParameters, final ExcludeList 
excludes) throws InsufficientCapacityException, ConcurrentOperationException,
     ResourceUnavailableException {
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
             throw new CloudRuntimeException("Unable to find " + vmUuid);
         }
-
-        final VirtualMachineProfile profile = new 
VirtualMachineProfileImpl(vm);
+        ServiceOfferingVO newServiceOffering = 
_offeringDao.findById(newSvcOfferingId);
+        if (newServiceOffering.isDynamic()) {
+            newServiceOffering.setDynamicFlag(true);
+            newServiceOffering = 
_offeringDao.getComputeOffering(newServiceOffering, customParameters);
+        }
+        final VirtualMachineProfile profile = new 
VirtualMachineProfileImpl(vm, null, newServiceOffering, null, null);
 
         final Long srcHostId = vm.getHostId();
         final Long oldSvcOfferingId = vm.getServiceOfferingId();
diff --git 
a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
 
b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
index 0e7579e..1725a41 100644
--- 
a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ 
b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -150,7 +150,7 @@ public class VirtualMachineManagerImplTest {
         when(vmInstanceDaoMock.findById(anyLong())).thenReturn(vmInstanceMock);
         
when(vmInstanceDaoMock.findByUuid(any(String.class))).thenReturn(vmInstanceMock);
         DeploymentPlanner.ExcludeList excludeHostList = new 
DeploymentPlanner.ExcludeList();
-        virtualMachineManagerImpl.findHostAndMigrate(vmInstanceMock.getUuid(), 
2l, excludeHostList);
+        virtualMachineManagerImpl.findHostAndMigrate(vmInstanceMock.getUuid(), 
2l, null, excludeHostList);
     }
 
     @Test
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index da493e7..60e82e3 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -1859,7 +1859,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
 
                     // #2 migrate the vm if host doesn't have capacity or is 
in avoid set
                     if (!existingHostHasCapacity) {
-                        _itMgr.findHostAndMigrate(vmInstance.getUuid(), 
newServiceOfferingId, excludes);
+                        _itMgr.findHostAndMigrate(vmInstance.getUuid(), 
newServiceOfferingId, customParameters, excludes);
                     }
 
                     // #3 scale the vm now

Reply via email to