diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDao.java index 0bbcb37ea0a..4db07c0dcac 100755 --- a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDao.java @@ -162,4 +162,5 @@ public interface VMInstanceDao extends GenericDao, StateDao< void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType hypervisorType); + List listByHostOrLastHostOrHostPod(long hostId, long podId); } diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java index 7ceff5eb595..5701d7e3989 100755 --- a/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -28,12 +28,12 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; -import com.cloud.hypervisor.Hypervisor; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.utils.DateUtil; @@ -961,6 +961,23 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem } catch (Throwable e) { throw new CloudRuntimeException("Caught: " + sql, e); } + } + @Override + public List listByHostOrLastHostOrHostPod(long hostId, long podId) { + SearchBuilder sb = createSearchBuilder(); + sb.or().op("hostId", sb.entity().getHostId(), Op.EQ); + sb.or("lastHostId", sb.entity().getLastHostId(), Op.EQ); + sb.and().op("hostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL); + sb.and("lastHostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL); + sb.and("podId", sb.entity().getPodIdToDeployIn(), Op.EQ); + sb.cp(); + sb.cp(); + sb.done(); + SearchCriteria sc = sb.create(); + sc.setParameters("hostId", String.valueOf(hostId)); + sc.setParameters("lastHostId", String.valueOf(hostId)); + sc.setParameters("podId", String.valueOf(podId)); + return listBy(sc); } } diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index bf9ed7fd65c..10a7ca74dcf 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; @@ -363,18 +364,8 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { } private List getHostManagedVms(Host host) { - List managedVms = new ArrayList<>(); - List instances = vmDao.listByHostId(host.getId()); - for (VMInstanceVO instance : instances) { - managedVms.add(instance.getInstanceName()); - } - instances = vmDao.listByLastHostIdAndStates(host.getId(), - VirtualMachine.State.Stopped, VirtualMachine.State.Destroyed, - VirtualMachine.State.Expunging, VirtualMachine.State.Error, - VirtualMachine.State.Unknown, VirtualMachine.State.Shutdown); - for (VMInstanceVO instance : instances) { - managedVms.add(instance.getInstanceName()); - } + List instances = vmDao.listByHostOrLastHostOrHostPod(host.getId(), host.getPodId()); + List managedVms = instances.stream().map(VMInstanceVO::getInstanceName).collect(Collectors.toList()); return managedVms; }