Skip to content

Commit bf3addd

Browse files
committed
Fix NPE when on findHostsForMigration when no suitable hosts are found
1 parent 72b99a3 commit bf3addd

2 files changed

Lines changed: 41 additions & 11 deletions

File tree

server/src/main/java/com/cloud/server/ManagementServerImpl.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,16 +1707,15 @@ protected List<Host> getCapableSuitableHosts(
17071707

17081708
if (CollectionUtils.isEmpty(suitableHosts)) {
17091709
logger.warn("No suitable hosts found.");
1710-
} else {
1711-
logger.debug("Hosts having capacity and are suitable for migration: {}", suitableHosts);
1710+
return suitableHosts;
17121711
}
17131712

1713+
logger.debug("Hosts having capacity and are suitable for migration: {}", suitableHosts);
1714+
17141715
// Only list hosts of the same architecture as the source Host in a multi-arch zone
1715-
if (!suitableHosts.isEmpty()) {
1716-
List<CPU.CPUArch> clusterArchs = ApiDBUtils.listZoneClustersArchs(vm.getDataCenterId());
1717-
if (CollectionUtils.isNotEmpty(clusterArchs) && clusterArchs.size() > 1) {
1718-
suitableHosts = suitableHosts.stream().filter(h -> h.getArch() == srcHost.getArch()).collect(Collectors.toList());
1719-
}
1716+
List<CPU.CPUArch> clusterArchs = ApiDBUtils.listZoneClustersArchs(vm.getDataCenterId());
1717+
if (CollectionUtils.isNotEmpty(clusterArchs) && clusterArchs.size() > 1) {
1718+
suitableHosts = suitableHosts.stream().filter(h -> h.getArch() == srcHost.getArch()).collect(Collectors.toList());
17201719
}
17211720

17221721
return suitableHosts;

server/src/test/java/com/cloud/server/ManagementServerImplTest.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
import static org.mockito.Mockito.mock;
2424
import static org.mockito.Mockito.when;
2525

26+
import com.cloud.deploy.DataCenterDeployment;
27+
import com.cloud.deploy.DeploymentPlanner;
28+
import com.cloud.deploy.DeploymentPlanningManager;
29+
import com.cloud.vm.VirtualMachineProfile;
2630
import org.junit.After;
2731
import org.junit.Assert;
2832
import org.junit.Before;
@@ -181,6 +185,24 @@ public class ManagementServerImplTest {
181185
@Mock
182186
HostAllocator hostAllocator;
183187

188+
@Mock
189+
VirtualMachine virtualMachineMock;
190+
191+
@Mock
192+
VirtualMachineProfile virtualMachineProfileMock;
193+
194+
@Mock
195+
DataCenterDeployment dataCenterDeploymentMock;
196+
197+
@Mock
198+
DeploymentPlanner.ExcludeList excludeListMock;
199+
200+
@Mock
201+
Host hostMock;
202+
203+
@Mock
204+
DeploymentPlanningManager deploymentPlanningManagerMock;
205+
184206
private AutoCloseable closeable;
185207
private MockedStatic<ApiDBUtils> apiDBUtilsMock;
186208

@@ -1053,10 +1075,19 @@ public void testListGuestOSCategoriesByCriteria_FilterById() {
10531075

10541076
@Test
10551077
public void testGetExternalVmConsole() {
1056-
VirtualMachine virtualMachine = Mockito.mock(VirtualMachine.class);
10571078
Host host = Mockito.mock(Host.class);
1058-
Mockito.when(extensionManager.getInstanceConsole(virtualMachine, host)).thenReturn(Mockito.mock(com.cloud.agent.api.Answer.class));
1059-
Assert.assertNotNull(spy.getExternalVmConsole(virtualMachine, host));
1060-
Mockito.verify(extensionManager).getInstanceConsole(virtualMachine, host);
1079+
Mockito.when(extensionManager.getInstanceConsole(virtualMachineMock, host)).thenReturn(Mockito.mock(com.cloud.agent.api.Answer.class));
1080+
Assert.assertNotNull(spy.getExternalVmConsole(virtualMachineMock, host));
1081+
Mockito.verify(extensionManager).getInstanceConsole(virtualMachineMock, host);
1082+
}
1083+
1084+
@Test
1085+
public void getCapableSuitableHostsTestHostArchIsNotFilteredWhenNoSuitableHostsAreFound() {
1086+
List<Host> compatibleHosts = List.of(hostMock);
1087+
Mockito.doReturn(null).when(hostAllocator).allocateTo(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyList(), Mockito.anyInt(), Mockito.anyBoolean());
1088+
1089+
spy.getCapableSuitableHosts(virtualMachineMock, virtualMachineProfileMock, dataCenterDeploymentMock, compatibleHosts, excludeListMock, hostMock);
1090+
1091+
apiDBUtilsMock.verify(() -> ApiDBUtils.listZoneClustersArchs(Mockito.anyLong()), Mockito.never());
10611092
}
10621093
}

0 commit comments

Comments
 (0)