// 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 _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 profile = new VirtualMachineProfileImpl(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; } }