Adding VirtualMachineManagerImplTest
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index c845830..a6d0b1b 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -2670,8 +2670,7 @@
Long srcHostId = vm.getHostId();
Long oldSvcOfferingId = vm.getServiceOfferingId();
if (srcHostId == null) {
- s_logger.debug("Unable to scale the vm because it doesn't have a host id: " + vm);
- return vm;
+ throw new CloudRuntimeException("Unable to scale the vm because it doesn't have a host id");
}
Host host = _hostDao.findById(srcHostId);
DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), null, null, null);
@@ -2908,24 +2907,21 @@
vm.setServiceOfferingId(newServiceofferingId);
_capacityMgr.allocateVmCapacity(vm, false); // lock the new capacity
}
- //vm.setNewSvcOfferingId(newServiceOffering.getId()); // Capacity update should be delta (new - old) offering
- //changeState(vm, Event.ReconfiguringRequested, dstHostId, work, Step.Reconfiguring);
Answer reconfigureAnswer = _agentMgr.send(vm.getHostId(), reconfigureCmd);
- if (!reconfigureAnswer.getResult()) {
- s_logger.error("Unable to reconfigure due to " + reconfigureAnswer.getDetails());
- return null;
+ if (reconfigureAnswer == null || !reconfigureAnswer.getResult()) {
+ s_logger.error("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails()));
+ throw new CloudRuntimeException("Unable to scale vm due to " + (reconfigureAnswer == null ? "" : reconfigureAnswer.getDetails()));
}
- //changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Done);
success = true;
} catch (OperationTimedoutException e) {
throw new AgentUnavailableException("Operation timed out on reconfiguring " + vm, dstHostId);
} catch (AgentUnavailableException e) {
throw e;
} finally{
- work.setStep(Step.Done);
- _workDao.update(work.getId(), work);
+ // work.setStep(Step.Done);
+ //_workDao.update(work.getId(), work);
if(!success){
_capacityMgr.releaseVmCapacity(vm, false, false, vm.getHostId()); // release the new capacity
vm.setServiceOfferingId(oldServiceOffering.getId());
diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
new file mode 100644
index 0000000..322f051
--- /dev/null
+++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -0,0 +1,208 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.vm;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ScaleVmAnswer;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.capacity.CapacityManager;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeManager;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.user.*;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
+import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
+import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
+import org.junit.Test;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import static org.mockito.Mockito.*;
+
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+public class VirtualMachineManagerImplTest {
+
+
+ @Spy VirtualMachineManagerImpl _vmMgr = new VirtualMachineManagerImpl();
+ @Mock
+ VolumeManager _storageMgr;
+ @Mock
+ Account _account;
+ @Mock
+ AccountManager _accountMgr;
+ @Mock
+ ConfigurationManager _configMgr;
+ @Mock
+ CapacityManager _capacityMgr;
+ @Mock
+ AgentManager _agentMgr;
+ @Mock
+ AccountDao _accountDao;
+ @Mock
+ ConfigurationDao _configDao;
+ @Mock
+ HostDao _hostDao;
+ @Mock
+ UserDao _userDao;
+ @Mock
+ UserVmDao _vmDao;
+ @Mock
+ ItWorkDao _workDao;
+ @Mock
+ VMInstanceDao _vmInstanceDao;
+ @Mock
+ VMTemplateDao _templateDao;
+ @Mock
+ VolumeDao _volsDao;
+ @Mock
+ RestoreVMCmd _restoreVMCmd;
+ @Mock
+ AccountVO _accountMock;
+ @Mock
+ UserVO _userMock;
+ @Mock
+ UserVmVO _vmMock;
+ @Mock
+ VMInstanceVO _vmInstance;
+ @Mock
+ HostVO _host;
+ @Mock
+ VMTemplateVO _templateMock;
+ @Mock
+ VolumeVO _volumeMock;
+ @Mock
+ List<VolumeVO> _rootVols;
+ @Mock
+ ItWorkVO _work;
+ @Before
+ public void setup(){
+ MockitoAnnotations.initMocks(this);
+
+ _vmMgr._templateDao = _templateDao;
+ _vmMgr._volsDao = _volsDao;
+ _vmMgr.volumeMgr = _storageMgr;
+ _vmMgr._accountDao = _accountDao;
+ _vmMgr._userDao = _userDao;
+ _vmMgr._accountMgr = _accountMgr;
+ _vmMgr._configMgr = _configMgr;
+ _vmMgr._capacityMgr = _capacityMgr;
+ _vmMgr._hostDao = _hostDao;
+ _vmMgr._nodeId = 1L;
+ _vmMgr._workDao = _workDao;
+ _vmMgr._agentMgr = _agentMgr;
+
+ when(_vmMock.getId()).thenReturn(314l);
+ when(_vmInstance.getId()).thenReturn(1L);
+ when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
+ when(_vmInstance.getInstanceName()).thenReturn("myVm");
+ when(_vmInstance.getHostId()).thenReturn(2L);
+ when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
+ when(_host.getId()).thenReturn(1L);
+ when(_hostDao.findById(anyLong())).thenReturn(null);
+ when(_configMgr.getServiceOffering(anyLong())).thenReturn(getSvcoffering(512));
+ when(_workDao.persist(_work)).thenReturn(_work);
+ when(_workDao.update("1", _work)).thenReturn(true);
+ when(_work.getId()).thenReturn("1");
+ doNothing().when(_work).setStep(ItWorkVO.Step.Done);
+ //doNothing().when(_volsDao).detachVolume(anyLong());
+ //when(_work.setStep(ItWorkVO.Step.Done)).thenReturn("1");
+
+ }
+
+
+ @Test(expected=CloudRuntimeException.class)
+ public void testScaleVM1() throws Exception {
+
+
+ DeployDestination dest = new DeployDestination(null, null, null, _host);
+ long l = 1L;
+
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ _vmMgr.migrateForScale(_vmInstance, l, dest, l);
+
+ }
+
+ @Test (expected=CloudRuntimeException.class)
+ public void testScaleVM2() throws Exception {
+
+ DeployDestination dest = new DeployDestination(null, null, null, _host);
+ long l = 1L;
+
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ ServiceOfferingVO newServiceOffering = getSvcoffering(512);
+ ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(),
+ newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
+ Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details");
+ when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null);
+ _vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false);
+
+ }
+
+ @Test (expected=CloudRuntimeException.class)
+ public void testScaleVM3() throws Exception {
+
+ /*VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
+
+ Long srcHostId = vm.getHostId();
+ Long oldSvcOfferingId = vm.getServiceOfferingId();
+ if (srcHostId == null) {
+ throw new CloudRuntimeException("Unable to scale the vm because it doesn't have a host id");
+ }*/
+
+ when(_vmInstance.getHostId()).thenReturn(null);
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ _vmMgr.findHostAndMigrate(VirtualMachine.Type.User, _vmInstance, 2l);
+
+ }
+
+
+ private ServiceOfferingVO getSvcoffering(int ramSize){
+
+ long id = 4L;
+ String name = "name";
+ String displayText = "displayText";
+ int cpu = 1;
+ //int ramSize = 256;
+ int speed = 128;
+
+ boolean ha = false;
+ boolean useLocalStorage = false;
+
+ ServiceOfferingVO serviceOffering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, ha, displayText, useLocalStorage, false, null, false, null, false);
+ return serviceOffering;
+ }
+
+
+}