|
85 | 85 | import org.apache.cloudstack.backup.dao.BackupScheduleDao; |
86 | 86 | import org.apache.cloudstack.context.CallContext; |
87 | 87 | import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; |
| 88 | +import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao; |
88 | 89 | import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
89 | 90 | import org.apache.cloudstack.engine.subsystem.api.storage.Scope; |
90 | 91 | import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; |
|
147 | 148 | import com.cloud.network.dao.PhysicalNetworkDao; |
148 | 149 | import com.cloud.network.dao.PhysicalNetworkVO; |
149 | 150 | import com.cloud.network.guru.NetworkGuru; |
| 151 | +import com.cloud.network.router.VpcVirtualNetworkApplianceManager; |
150 | 152 | import com.cloud.network.rules.FirewallRuleVO; |
151 | 153 | import com.cloud.network.rules.PortForwardingRule; |
152 | 154 | import com.cloud.network.rules.dao.PortForwardingRulesDao; |
|
196 | 198 | import com.cloud.utils.exception.CloudRuntimeException; |
197 | 199 | import com.cloud.utils.exception.ExceptionProxyObject; |
198 | 200 | import com.cloud.vm.dao.NicDao; |
| 201 | +import com.cloud.vm.dao.DomainRouterDao; |
199 | 202 | import com.cloud.vm.dao.UserVmDao; |
200 | 203 | import com.cloud.vm.dao.VMInstanceDetailsDao; |
201 | 204 | import com.cloud.vm.snapshot.VMSnapshotVO; |
@@ -446,6 +449,15 @@ public class UserVmManagerImplTest { |
446 | 449 | @Mock |
447 | 450 | private BackupScheduleDao backupScheduleDao; |
448 | 451 |
|
| 452 | + @Mock |
| 453 | + private VMNetworkMapDao _vmNetworkMapDao; |
| 454 | + |
| 455 | + @Mock |
| 456 | + private DomainRouterDao _routerDao; |
| 457 | + |
| 458 | + @Mock |
| 459 | + private VpcVirtualNetworkApplianceManager _virtualNetAppliance; |
| 460 | + |
449 | 461 | MockedStatic<UnmanagedVMsManager> unmanagedVMsManagerMockedStatic; |
450 | 462 |
|
451 | 463 | private static final long vmId = 1L; |
@@ -4232,4 +4244,165 @@ public void testTransitionExpungingToErrorHandlesNoTransitionException() throws |
4232 | 4244 | method.setAccessible(true); |
4233 | 4245 | method.invoke(userVmManagerImpl, vmId); |
4234 | 4246 | } |
| 4247 | + |
| 4248 | + @Test |
| 4249 | + public void testBuildRebootParamsIfNeededFalseReturnsNull() { |
| 4250 | + Object params = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "buildRebootParamsIfNeeded", false); |
| 4251 | + Assert.assertNull(params); |
| 4252 | + } |
| 4253 | + |
| 4254 | + @Test |
| 4255 | + public void testBuildRebootParamsIfNeededTrueAddsBootIntoSetup() { |
| 4256 | + @SuppressWarnings("unchecked") |
| 4257 | + Map<VirtualMachineProfile.Param, Object> params = |
| 4258 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "buildRebootParamsIfNeeded", true); |
| 4259 | + |
| 4260 | + assertNotNull(params); |
| 4261 | + assertEquals(1, params.size()); |
| 4262 | + assertEquals(Boolean.TRUE, params.get(VirtualMachineProfile.Param.BootIntoSetup)); |
| 4263 | + } |
| 4264 | + |
| 4265 | + @Test |
| 4266 | + public void testStartRoutersIfNeededBasicZoneSkipsRouterOperations() throws Exception { |
| 4267 | + UserVmVO vm = mock(UserVmVO.class); |
| 4268 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4269 | + |
| 4270 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4271 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4272 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Basic); |
| 4273 | + |
| 4274 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4275 | + |
| 4276 | + verify(_vmNetworkMapDao, never()).getNetworks(anyLong()); |
| 4277 | + verify(_virtualNetAppliance, never()).startRouter(anyLong(), anyBoolean()); |
| 4278 | + } |
| 4279 | + |
| 4280 | + @Test |
| 4281 | + public void testStartRoutersIfNeededAdvancedZoneWithoutNetworksStartsNothing() throws Exception { |
| 4282 | + UserVmVO vm = mock(UserVmVO.class); |
| 4283 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4284 | + |
| 4285 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4286 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4287 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4288 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Collections.emptyList()); |
| 4289 | + |
| 4290 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4291 | + |
| 4292 | + verify(_vmNetworkMapDao).getNetworks(vmId); |
| 4293 | + verify(_routerDao, never()).listStopped(anyLong()); |
| 4294 | + verify(_virtualNetAppliance, never()).startRouter(anyLong(), anyBoolean()); |
| 4295 | + } |
| 4296 | + |
| 4297 | + @Test |
| 4298 | + public void testStartRoutersIfNeededAdvancedZoneStartsAllStoppedRouters() throws Exception { |
| 4299 | + UserVmVO vm = mock(UserVmVO.class); |
| 4300 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4301 | + |
| 4302 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4303 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4304 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4305 | + |
| 4306 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Arrays.asList(100L, 200L)); |
| 4307 | + |
| 4308 | + DomainRouterVO router1 = mock(DomainRouterVO.class); |
| 4309 | + DomainRouterVO router2 = mock(DomainRouterVO.class); |
| 4310 | + DomainRouterVO router3 = mock(DomainRouterVO.class); |
| 4311 | + when(router1.getId()).thenReturn(1000L); |
| 4312 | + when(router2.getId()).thenReturn(1001L); |
| 4313 | + when(router3.getId()).thenReturn(2000L); |
| 4314 | + |
| 4315 | + when(_routerDao.listStopped(100L)).thenReturn(Arrays.asList(router1, router2)); |
| 4316 | + when(_routerDao.listStopped(200L)).thenReturn(Collections.singletonList(router3)); |
| 4317 | + |
| 4318 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4319 | + |
| 4320 | + verify(_virtualNetAppliance).startRouter(1000L, true); |
| 4321 | + verify(_virtualNetAppliance).startRouter(1001L, true); |
| 4322 | + verify(_virtualNetAppliance).startRouter(2000L, true); |
| 4323 | + } |
| 4324 | + |
| 4325 | + @Test |
| 4326 | + public void testStartRoutersIfNeededPropagatesRouterStartException() throws Exception { |
| 4327 | + UserVmVO vm = mock(UserVmVO.class); |
| 4328 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4329 | + |
| 4330 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4331 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4332 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4333 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Collections.singletonList(100L)); |
| 4334 | + |
| 4335 | + DomainRouterVO router = mock(DomainRouterVO.class); |
| 4336 | + when(router.getId()).thenReturn(1000L); |
| 4337 | + when(_routerDao.listStopped(100L)).thenReturn(Collections.singletonList(router)); |
| 4338 | + doThrow(new CloudRuntimeException("router start failed")).when(_virtualNetAppliance).startRouter(1000L, true); |
| 4339 | + |
| 4340 | + assertThrows(CloudRuntimeException.class, |
| 4341 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId)); |
| 4342 | + } |
| 4343 | + |
| 4344 | + @Test |
| 4345 | + public void testHandleForcedRebootThrowsWhenHostNotFound() { |
| 4346 | + UserVmVO vm = mock(UserVmVO.class); |
| 4347 | + when(vm.getHostId()).thenReturn(42L); |
| 4348 | + |
| 4349 | + when(hostDao.findById(42L)).thenReturn(null); |
| 4350 | + |
| 4351 | + assertThrows(CloudRuntimeException.class, |
| 4352 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false)); |
| 4353 | + } |
| 4354 | + |
| 4355 | + @Test |
| 4356 | + public void testHandleForcedRebootThrowsWhenHostNotUsable() { |
| 4357 | + UserVmVO vm = mock(UserVmVO.class); |
| 4358 | + when(vm.getHostId()).thenReturn(42L); |
| 4359 | + |
| 4360 | + HostVO host = mock(HostVO.class); |
| 4361 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4362 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4363 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Down); |
| 4364 | + |
| 4365 | + assertThrows(CloudRuntimeException.class, |
| 4366 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false)); |
| 4367 | + } |
| 4368 | + |
| 4369 | + @Test |
| 4370 | + public void testHandleForcedRebootReturnsNullWhenStopFails() { |
| 4371 | + UserVmVO vm = mock(UserVmVO.class); |
| 4372 | + when(vm.getId()).thenReturn(vmId); |
| 4373 | + when(vm.getHostId()).thenReturn(42L); |
| 4374 | + |
| 4375 | + HostVO host = mock(HostVO.class); |
| 4376 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4377 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4378 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Up); |
| 4379 | + |
| 4380 | + doReturn(null).when(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4381 | + |
| 4382 | + Object result = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false); |
| 4383 | + Assert.assertNull(result); |
| 4384 | + } |
| 4385 | + |
| 4386 | + @Test |
| 4387 | + public void testHandleForcedRebootSuccessWithEnterSetup() throws Exception { |
| 4388 | + UserVmVO vm = mock(UserVmVO.class); |
| 4389 | + when(vm.getId()).thenReturn(vmId); |
| 4390 | + when(vm.getHostId()).thenReturn(42L); |
| 4391 | + |
| 4392 | + HostVO host = mock(HostVO.class); |
| 4393 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4394 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4395 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Up); |
| 4396 | + |
| 4397 | + UserVmVO stoppedVm = mock(UserVmVO.class); |
| 4398 | + doReturn(stoppedVm).when(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4399 | + |
| 4400 | + Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startedVm = new Pair<>(userVmVoMock, new HashMap<>()); |
| 4401 | + doReturn(startedVm).when(userVmManagerImpl).startVirtualMachine(eq(vmId), isNull(), isNull(), eq(42L), anyMap(), isNull(), eq(false)); |
| 4402 | + |
| 4403 | + UserVm result = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, true); |
| 4404 | + |
| 4405 | + assertEquals(userVmVoMock, result); |
| 4406 | + verify(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4407 | + } |
4235 | 4408 | } |
0 commit comments