From 638779ca37d1917aa16c8045b99076dddc20618e Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 3 Feb 2022 10:27:05 +0530 Subject: [PATCH] vm-import: fix unmanaged instance listing (#5400) * vm-import: fix unmanaged instance listing When the host and last host ID is not set for the VM, it may appear in the list of unmanaged instances. This changes fixes the behaviour by filtering unmanaged instances list for host for following three criteria: - host is set as host_id for the VM - host is set as the last_host_id for the VM - pod of the host is set as the pod_id for the VM and both host_id and last_host_id is NULL * use SearchBuilder to fix query condition * add paranthesis Signed-off-by: Abhishek Kumar --- .../java/com/cloud/vm/dao/VMInstanceDao.java | 1 + .../com/cloud/vm/dao/VMInstanceDaoImpl.java | 19 ++++++++++++++++++- .../vm/UnmanagedVMsManagerImpl.java | 15 +++------------ 3 files changed, 22 insertions(+), 13 deletions(-) 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; }