Skip to content

Commit 0a693a2

Browse files
committed
lookup in cluster for host
1 parent f118a9f commit 0a693a2

File tree

2 files changed

+12
-42
lines changed

2 files changed

+12
-42
lines changed

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2052,18 +2052,12 @@ void persistDomainForKVM(VMInstanceVO vm) {
20522052
String vmName = vm.getName();
20532053
UnmanageInstanceCommand unmanageInstanceCommand;
20542054
if (State.Stopped.equals(vm.getState())) {
2055-
Pair<Long, Long> clusterAndHostId = findClusterAndHostIdForVm(vm.getLastHostId());
2055+
Pair<Long, Long> clusterAndHostId = findClusterAndHostIdForVm(vm, false);
20562056
hostId = clusterAndHostId.second();
20572057
if (hostId == null) {
2058-
logger.debug("No previous host found for Instance: {}. " +
2059-
"Searching for any available hosts in Zone with ID: {}.", vmName, vm.getDataCenterId());
2060-
List <HostVO> availableHosts = _hostDao.listByDataCenterIdAndHypervisorType(vm.getDataCenterId(), HypervisorType.KVM);
2061-
if (availableHosts.isEmpty()) {
2062-
String errorMsg = "No available host to persist domainXML for Instance: " + vmName;
2063-
logger.debug(errorMsg);
2064-
throw new CloudRuntimeException(errorMsg);
2065-
}
2066-
hostId = availableHosts.get(0).getId();
2058+
String errorMsg = "No available host to persist domain XML for Instance: " + vmName;
2059+
logger.debug(errorMsg);
2060+
throw new CloudRuntimeException(errorMsg);
20672061
}
20682062
unmanageInstanceCommand = new UnmanageInstanceCommand(prepVmSpecForUnmanageCmd(vm.getId(), hostId)); // reconstruct vmSpec for stopped instance
20692063
} else {
@@ -2073,7 +2067,7 @@ void persistDomainForKVM(VMInstanceVO vm) {
20732067
try {
20742068
Answer answer = _agentMgr.send(hostId, unmanageInstanceCommand);
20752069
if (!answer.getResult()) {
2076-
String errorMsg = "Failed to persist domainXML for instance: " + vmName;
2070+
String errorMsg = "Failed to persist domain XML for instance: " + vmName;
20772071
logger.debug(errorMsg);
20782072
throw new CloudRuntimeException(errorMsg);
20792073
}
@@ -6273,8 +6267,9 @@ public Pair<Long, Long> findClusterAndHostIdForVm(VirtualMachine vm, boolean ski
62736267
host = host == null ? _hostDao.findById(hostId) : host;
62746268
if (host != null) {
62756269
clusterId = host.getClusterId();
6270+
return new Pair<>(clusterId, hostId);
62766271
}
6277-
return new Pair<>(clusterId, hostId);
6272+
return findClusterAndHostIdForVmFromVolumes(vm.getId());
62786273
}
62796274

62806275
private Pair<Long, Long> findClusterAndHostIdForVm(VirtualMachine vm) {

engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,13 +1765,12 @@ public void testPersistDomainForKvmForRunningVmSuccess() throws AgentUnavailable
17651765
@Test
17661766
public void testPersistDomainForKvmForStoppedVmSuccess() throws AgentUnavailableException, OperationTimedoutException {
17671767
when(vmInstanceMock.getState()).thenReturn(VirtualMachine.State.Stopped);
1768-
when(vmInstanceMock.getLastHostId()).thenReturn(1L);
17691768
VirtualMachineTO vmTO = new VirtualMachineTO() {};
17701769
vmTO.setName(vmName);
17711770
doReturn(vmTO).when(virtualMachineManagerImpl).prepVmSpecForUnmanageCmd(vmInstanceVoMockId, 1L);
17721771
UnmanageInstanceAnswer successAnswer = new UnmanageInstanceAnswer(null, true, "success");
17731772
when(agentManagerMock.send(anyLong(), any(UnmanageInstanceCommand.class))).thenReturn(successAnswer);
1774-
when(virtualMachineManagerImpl.findClusterAndHostIdForVm(vmInstanceVoMockId)).thenReturn(new Pair<>(1L, 1L));
1773+
when(virtualMachineManagerImpl.findClusterAndHostIdForVm(vmInstanceMock, false)).thenReturn(new Pair<>(clusterMockId, hostMockId));
17751774
virtualMachineManagerImpl.persistDomainForKVM(vmInstanceMock);
17761775
ArgumentCaptor<Long> hostIdCaptor = ArgumentCaptor.forClass(Long.class);
17771776
ArgumentCaptor<UnmanageInstanceCommand> commandCaptor = ArgumentCaptor.forClass(UnmanageInstanceCommand.class);
@@ -1786,37 +1785,13 @@ public void testPersistDomainForKvmForStoppedVmSuccess() throws AgentUnavailable
17861785

17871786

17881787
@Test
1789-
public void testPersistDomainForKvmForStoppedVmHostRemoved() throws AgentUnavailableException, OperationTimedoutException {
1788+
public void testPersistDomainForKvmForStoppedVmNoHost() {
17901789
when(vmInstanceMock.getState()).thenReturn(VirtualMachine.State.Stopped);
1791-
when(vmInstanceMock.getLastHostId()).thenReturn(1L);
1792-
when(vmInstanceMock.getDataCenterId()).thenReturn(zoneMockId);
1793-
VirtualMachineTO vmTO = new VirtualMachineTO() {};
1794-
vmTO.setName(vmName);
1795-
doReturn(vmTO).when(virtualMachineManagerImpl).prepVmSpecForUnmanageCmd(vmInstanceVoMockId, 1L);
1796-
UnmanageInstanceAnswer successAnswer = new UnmanageInstanceAnswer(null, true, "success");
1797-
when(agentManagerMock.send(anyLong(), any(UnmanageInstanceCommand.class))).thenReturn(successAnswer);
1798-
when(virtualMachineManagerImpl.findClusterAndHostIdForVm(vmInstanceVoMockId)).thenReturn(new Pair<>(clusterMockId, null));
1799-
when(hostDaoMock.listByDataCenterIdAndHypervisorType(zoneMockId, HypervisorType.KVM)).thenReturn(List.of(hostMock));
1800-
virtualMachineManagerImpl.persistDomainForKVM(vmInstanceMock);
1801-
ArgumentCaptor<Long> hostIdCaptor = ArgumentCaptor.forClass(Long.class);
1802-
ArgumentCaptor<UnmanageInstanceCommand> commandCaptor = ArgumentCaptor.forClass(UnmanageInstanceCommand.class);
1803-
verify(agentManagerMock).send(hostIdCaptor.capture(), commandCaptor.capture());
1804-
assertEquals(1L, hostIdCaptor.getValue().longValue());
1805-
UnmanageInstanceCommand sentCommand = commandCaptor.getValue();
1806-
assertNotNull(sentCommand.getVm());
1807-
assertEquals(vmTO, sentCommand.getVm());
1808-
assertEquals(vmName, sentCommand.getInstanceName());
1809-
verify(virtualMachineManagerImpl).prepVmSpecForUnmanageCmd(vmInstanceVoMockId, 1L);
1810-
}
1811-
1812-
@Test
1813-
public void testPersistDomainForKvmForStoppedVmNoHost() throws AgentUnavailableException, OperationTimedoutException {
1814-
when(vmInstanceMock.getState()).thenReturn(VirtualMachine.State.Stopped);
1815-
when(vmInstanceMock.getLastHostId()).thenReturn(1L);
18161790
VirtualMachineTO vmTO = new VirtualMachineTO() {};
18171791
vmTO.setName(vmName);
1792+
when(virtualMachineManagerImpl.findClusterAndHostIdForVm(vmInstanceMock, false)).thenReturn(new Pair<>(clusterMockId, null));
18181793
CloudRuntimeException exception = assertThrows(CloudRuntimeException.class, () -> virtualMachineManagerImpl.persistDomainForKVM(vmInstanceMock));
1819-
assertEquals("No available host to persist domainXML for Instance: " + vmName, exception.getMessage());
1794+
assertEquals("No available host to persist domain XML for Instance: " + vmName, exception.getMessage());
18201795
}
18211796

18221797
@Test
@@ -1826,7 +1801,7 @@ public void testPersistDomainForKvmForRunningVmAgentFailure() throws AgentUnavai
18261801
UnmanageInstanceAnswer failureAnswer = new UnmanageInstanceAnswer(null, false, "failure");
18271802
when(agentManagerMock.send(anyLong(), any(UnmanageInstanceCommand.class))).thenReturn(failureAnswer);
18281803
CloudRuntimeException exception = assertThrows(CloudRuntimeException.class, () -> virtualMachineManagerImpl.persistDomainForKVM(vmInstanceMock));
1829-
assertEquals("Failed to persist domainXML for instance: " + vmName, exception.getMessage());
1804+
assertEquals("Failed to persist domain XML for instance: " + vmName, exception.getMessage());
18301805
}
18311806

18321807
@Test

0 commit comments

Comments
 (0)