server: Fix NPE when on findHostsForMigration when no suitable hosts are found (#13138)

This commit is contained in:
Fabricio Duarte 2026-05-12 04:07:20 -03:00 committed by GitHub
parent e1521f139b
commit 5893ba5a8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 11 deletions

View File

@ -1707,16 +1707,15 @@ public class ManagementServerImpl extends MutualExclusiveIdsManagerBase implemen
if (CollectionUtils.isEmpty(suitableHosts)) {
logger.warn("No suitable hosts found.");
} else {
logger.debug("Hosts having capacity and are suitable for migration: {}", suitableHosts);
return suitableHosts;
}
logger.debug("Hosts having capacity and are suitable for migration: {}", suitableHosts);
// Only list hosts of the same architecture as the source Host in a multi-arch zone
if (!suitableHosts.isEmpty()) {
List<CPU.CPUArch> clusterArchs = ApiDBUtils.listZoneClustersArchs(vm.getDataCenterId());
if (CollectionUtils.isNotEmpty(clusterArchs) && clusterArchs.size() > 1) {
suitableHosts = suitableHosts.stream().filter(h -> h.getArch() == srcHost.getArch()).collect(Collectors.toList());
}
List<CPU.CPUArch> clusterArchs = ApiDBUtils.listZoneClustersArchs(vm.getDataCenterId());
if (CollectionUtils.isNotEmpty(clusterArchs) && clusterArchs.size() > 1) {
suitableHosts = suitableHosts.stream().filter(h -> h.getArch() == srcHost.getArch()).collect(Collectors.toList());
}
return suitableHosts;

View File

@ -23,6 +23,10 @@ import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeploymentPlanner;
import com.cloud.deploy.DeploymentPlanningManager;
import com.cloud.vm.VirtualMachineProfile;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@ -181,6 +185,24 @@ public class ManagementServerImplTest {
@Mock
HostAllocator hostAllocator;
@Mock
VirtualMachine virtualMachineMock;
@Mock
VirtualMachineProfile virtualMachineProfileMock;
@Mock
DataCenterDeployment dataCenterDeploymentMock;
@Mock
DeploymentPlanner.ExcludeList excludeListMock;
@Mock
Host hostMock;
@Mock
DeploymentPlanningManager deploymentPlanningManagerMock;
private AutoCloseable closeable;
private MockedStatic<ApiDBUtils> apiDBUtilsMock;
@ -1053,10 +1075,19 @@ public class ManagementServerImplTest {
@Test
public void testGetExternalVmConsole() {
VirtualMachine virtualMachine = Mockito.mock(VirtualMachine.class);
Host host = Mockito.mock(Host.class);
Mockito.when(extensionManager.getInstanceConsole(virtualMachine, host)).thenReturn(Mockito.mock(com.cloud.agent.api.Answer.class));
Assert.assertNotNull(spy.getExternalVmConsole(virtualMachine, host));
Mockito.verify(extensionManager).getInstanceConsole(virtualMachine, host);
Mockito.when(extensionManager.getInstanceConsole(virtualMachineMock, host)).thenReturn(Mockito.mock(com.cloud.agent.api.Answer.class));
Assert.assertNotNull(spy.getExternalVmConsole(virtualMachineMock, host));
Mockito.verify(extensionManager).getInstanceConsole(virtualMachineMock, host);
}
@Test
public void getCapableSuitableHostsTestHostArchIsNotFilteredWhenNoSuitableHostsAreFound() {
List<Host> compatibleHosts = List.of(hostMock);
Mockito.doReturn(null).when(hostAllocator).allocateTo(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyList(), Mockito.anyInt(), Mockito.anyBoolean());
spy.getCapableSuitableHosts(virtualMachineMock, virtualMachineProfileMock, dataCenterDeploymentMock, compatibleHosts, excludeListMock, hostMock);
apiDBUtilsMock.verify(() -> ApiDBUtils.listZoneClustersArchs(Mockito.anyLong()), Mockito.never());
}
}