|
91 | 91 | import org.apache.cloudstack.backup.dao.BackupScheduleDao; |
92 | 92 | import org.apache.cloudstack.context.CallContext; |
93 | 93 | import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; |
| 94 | +import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao; |
94 | 95 | import org.apache.cloudstack.resourcelimit.Reserver; |
95 | 96 | import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
96 | 97 | import org.apache.cloudstack.engine.subsystem.api.storage.Scope; |
|
152 | 153 | import com.cloud.network.dao.PhysicalNetworkVO; |
153 | 154 | import com.cloud.network.element.UserDataServiceProvider; |
154 | 155 | import com.cloud.network.guru.NetworkGuru; |
| 156 | +import com.cloud.network.router.VpcVirtualNetworkApplianceManager; |
155 | 157 | import com.cloud.network.rules.FirewallRuleVO; |
156 | 158 | import com.cloud.network.rules.PortForwardingRule; |
157 | 159 | import com.cloud.network.rules.dao.PortForwardingRulesDao; |
|
205 | 207 | import com.cloud.utils.exception.ExceptionProxyObject; |
206 | 208 | import com.cloud.utils.fsm.NoTransitionException; |
207 | 209 | import com.cloud.vm.dao.NicDao; |
| 210 | +import com.cloud.vm.dao.DomainRouterDao; |
208 | 211 | import com.cloud.vm.dao.UserVmDao; |
209 | 212 | import com.cloud.vm.dao.VMInstanceDetailsDao; |
210 | 213 | import com.cloud.vm.snapshot.VMSnapshotVO; |
@@ -461,6 +464,15 @@ public class UserVmManagerImplTest { |
461 | 464 | @Mock |
462 | 465 | private BackupScheduleDao backupScheduleDao; |
463 | 466 |
|
| 467 | + @Mock |
| 468 | + private VMNetworkMapDao _vmNetworkMapDao; |
| 469 | + |
| 470 | + @Mock |
| 471 | + private DomainRouterDao _routerDao; |
| 472 | + |
| 473 | + @Mock |
| 474 | + private VpcVirtualNetworkApplianceManager _virtualNetAppliance; |
| 475 | + |
464 | 476 | MockedStatic<UnmanagedVMsManager> unmanagedVMsManagerMockedStatic; |
465 | 477 |
|
466 | 478 | @Mock |
@@ -4363,6 +4375,167 @@ public void testTransitionExpungingToErrorHandlesNoTransitionException() throws |
4363 | 4375 | method.invoke(userVmManagerImpl, vmId); |
4364 | 4376 | } |
4365 | 4377 |
|
| 4378 | + @Test |
| 4379 | + public void testBuildRebootParamsIfNeededFalseReturnsNull() { |
| 4380 | + Object params = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "buildRebootParamsIfNeeded", false); |
| 4381 | + Assert.assertNull(params); |
| 4382 | + } |
| 4383 | + |
| 4384 | + @Test |
| 4385 | + public void testBuildRebootParamsIfNeededTrueAddsBootIntoSetup() { |
| 4386 | + @SuppressWarnings("unchecked") |
| 4387 | + Map<VirtualMachineProfile.Param, Object> params = |
| 4388 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "buildRebootParamsIfNeeded", true); |
| 4389 | + |
| 4390 | + assertNotNull(params); |
| 4391 | + assertEquals(1, params.size()); |
| 4392 | + assertEquals(Boolean.TRUE, params.get(VirtualMachineProfile.Param.BootIntoSetup)); |
| 4393 | + } |
| 4394 | + |
| 4395 | + @Test |
| 4396 | + public void testStartRoutersIfNeededBasicZoneSkipsRouterOperations() throws Exception { |
| 4397 | + UserVmVO vm = mock(UserVmVO.class); |
| 4398 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4399 | + |
| 4400 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4401 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4402 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Basic); |
| 4403 | + |
| 4404 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4405 | + |
| 4406 | + verify(_vmNetworkMapDao, never()).getNetworks(anyLong()); |
| 4407 | + verify(_virtualNetAppliance, never()).startRouter(anyLong(), anyBoolean()); |
| 4408 | + } |
| 4409 | + |
| 4410 | + @Test |
| 4411 | + public void testStartRoutersIfNeededAdvancedZoneWithoutNetworksStartsNothing() throws Exception { |
| 4412 | + UserVmVO vm = mock(UserVmVO.class); |
| 4413 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4414 | + |
| 4415 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4416 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4417 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4418 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Collections.emptyList()); |
| 4419 | + |
| 4420 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4421 | + |
| 4422 | + verify(_vmNetworkMapDao).getNetworks(vmId); |
| 4423 | + verify(_routerDao, never()).listStopped(anyLong()); |
| 4424 | + verify(_virtualNetAppliance, never()).startRouter(anyLong(), anyBoolean()); |
| 4425 | + } |
| 4426 | + |
| 4427 | + @Test |
| 4428 | + public void testStartRoutersIfNeededAdvancedZoneStartsAllStoppedRouters() throws Exception { |
| 4429 | + UserVmVO vm = mock(UserVmVO.class); |
| 4430 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4431 | + |
| 4432 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4433 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4434 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4435 | + |
| 4436 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Arrays.asList(100L, 200L)); |
| 4437 | + |
| 4438 | + DomainRouterVO router1 = mock(DomainRouterVO.class); |
| 4439 | + DomainRouterVO router2 = mock(DomainRouterVO.class); |
| 4440 | + DomainRouterVO router3 = mock(DomainRouterVO.class); |
| 4441 | + when(router1.getId()).thenReturn(1000L); |
| 4442 | + when(router2.getId()).thenReturn(1001L); |
| 4443 | + when(router3.getId()).thenReturn(2000L); |
| 4444 | + |
| 4445 | + when(_routerDao.listStopped(100L)).thenReturn(Arrays.asList(router1, router2)); |
| 4446 | + when(_routerDao.listStopped(200L)).thenReturn(Collections.singletonList(router3)); |
| 4447 | + |
| 4448 | + ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId); |
| 4449 | + |
| 4450 | + verify(_virtualNetAppliance).startRouter(1000L, true); |
| 4451 | + verify(_virtualNetAppliance).startRouter(1001L, true); |
| 4452 | + verify(_virtualNetAppliance).startRouter(2000L, true); |
| 4453 | + } |
| 4454 | + |
| 4455 | + @Test |
| 4456 | + public void testStartRoutersIfNeededPropagatesRouterStartException() throws Exception { |
| 4457 | + UserVmVO vm = mock(UserVmVO.class); |
| 4458 | + when(vm.getDataCenterId()).thenReturn(zoneId); |
| 4459 | + |
| 4460 | + DataCenterVO dc = mock(DataCenterVO.class); |
| 4461 | + when(_dcDao.findById(zoneId)).thenReturn(dc); |
| 4462 | + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); |
| 4463 | + when(_vmNetworkMapDao.getNetworks(vmId)).thenReturn(Collections.singletonList(100L)); |
| 4464 | + |
| 4465 | + DomainRouterVO router = mock(DomainRouterVO.class); |
| 4466 | + when(router.getId()).thenReturn(1000L); |
| 4467 | + when(_routerDao.listStopped(100L)).thenReturn(Collections.singletonList(router)); |
| 4468 | + doThrow(new CloudRuntimeException("router start failed")).when(_virtualNetAppliance).startRouter(1000L, true); |
| 4469 | + |
| 4470 | + assertThrows(CloudRuntimeException.class, |
| 4471 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "startRoutersIfNeeded", vm, vmId)); |
| 4472 | + } |
| 4473 | + |
| 4474 | + @Test |
| 4475 | + public void testHandleForcedRebootThrowsWhenHostNotFound() { |
| 4476 | + UserVmVO vm = mock(UserVmVO.class); |
| 4477 | + when(vm.getHostId()).thenReturn(42L); |
| 4478 | + |
| 4479 | + when(hostDao.findById(42L)).thenReturn(null); |
| 4480 | + |
| 4481 | + assertThrows(CloudRuntimeException.class, |
| 4482 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false)); |
| 4483 | + } |
| 4484 | + |
| 4485 | + @Test |
| 4486 | + public void testHandleForcedRebootThrowsWhenHostNotUsable() { |
| 4487 | + UserVmVO vm = mock(UserVmVO.class); |
| 4488 | + when(vm.getHostId()).thenReturn(42L); |
| 4489 | + |
| 4490 | + HostVO host = mock(HostVO.class); |
| 4491 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4492 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4493 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Down); |
| 4494 | + |
| 4495 | + assertThrows(CloudRuntimeException.class, |
| 4496 | + () -> ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false)); |
| 4497 | + } |
| 4498 | + |
| 4499 | + @Test |
| 4500 | + public void testHandleForcedRebootReturnsNullWhenStopFails() { |
| 4501 | + UserVmVO vm = mock(UserVmVO.class); |
| 4502 | + when(vm.getId()).thenReturn(vmId); |
| 4503 | + when(vm.getHostId()).thenReturn(42L); |
| 4504 | + |
| 4505 | + HostVO host = mock(HostVO.class); |
| 4506 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4507 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4508 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Up); |
| 4509 | + |
| 4510 | + doReturn(null).when(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4511 | + |
| 4512 | + Object result = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, false); |
| 4513 | + Assert.assertNull(result); |
| 4514 | + } |
| 4515 | + |
| 4516 | + @Test |
| 4517 | + public void testHandleForcedRebootSuccessWithEnterSetup() throws Exception { |
| 4518 | + UserVmVO vm = mock(UserVmVO.class); |
| 4519 | + when(vm.getId()).thenReturn(vmId); |
| 4520 | + when(vm.getHostId()).thenReturn(42L); |
| 4521 | + |
| 4522 | + HostVO host = mock(HostVO.class); |
| 4523 | + when(hostDao.findById(42L)).thenReturn(host); |
| 4524 | + when(host.getResourceState()).thenReturn(com.cloud.resource.ResourceState.Enabled); |
| 4525 | + when(host.getStatus()).thenReturn(com.cloud.host.Status.Up); |
| 4526 | + |
| 4527 | + UserVmVO stoppedVm = mock(UserVmVO.class); |
| 4528 | + doReturn(stoppedVm).when(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4529 | + |
| 4530 | + Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startedVm = new Pair<>(userVmVoMock, new HashMap<>()); |
| 4531 | + doReturn(startedVm).when(userVmManagerImpl).startVirtualMachine(eq(vmId), isNull(), isNull(), eq(42L), anyMap(), isNull(), eq(false)); |
| 4532 | + |
| 4533 | + UserVm result = ReflectionTestUtils.invokeMethod(userVmManagerImpl, "handleForcedReboot", vm, true); |
| 4534 | + |
| 4535 | + assertEquals(userVmVoMock, result); |
| 4536 | + verify(userVmManagerImpl).stopVirtualMachine(vmId, false); |
| 4537 | + } |
| 4538 | + |
4366 | 4539 | private ServiceOfferingVO getMockedServiceOffering(boolean custom, boolean customSpeed) { |
4367 | 4540 | ServiceOfferingVO serviceOffering = mock(ServiceOfferingVO.class); |
4368 | 4541 | when(serviceOffering.getUuid()).thenReturn("offering-uuid"); |
|
0 commit comments