From 6f20a8ee72645d30413b7b7d83f5130f233b0308 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 28 Jan 2022 14:39:25 +0530 Subject: [PATCH 1/3] 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 Signed-off-by: Abhishek Kumar --- .../main/java/com/cloud/vm/dao/VMInstanceDao.java | 1 + .../java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 14 +++++++++++++- .../cloudstack/vm/UnmanagedVMsManagerImpl.java | 15 +++------------ 3 files changed, 17 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 0bbcb37ea0a2..4db07c0dcac4 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 7ceff5eb5953..f2d75aa6ea0c 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 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,18 @@ public void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType } catch (Throwable e) { throw new CloudRuntimeException("Caught: " + sql, e); } + } + @Override + public List listByHostOrLastHostOrHostPod(long hostId, long podId) { + SearchCriteria sc = createSearchCriteria(); + sc.addOr("hostId", SearchCriteria.Op.EQ, hostId); + sc.addOr("lastHostId", SearchCriteria.Op.EQ, hostId); + SearchCriteria podSc = createSearchCriteria(); + podSc.addAnd("hostId", Op.NULL); + podSc.addAnd("lastHostId", Op.NULL); + podSc.addAnd("podIdToDeployIn", SearchCriteria.Op.EQ, podId); + sc.addOr("pod", SearchCriteria.Op.SC, podSc); + 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 bf9ed7fd65c2..10a7ca74dcfc 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.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; @@ -363,18 +364,8 @@ private List getAdditionalNameFilters(Cluster cluster) { } 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; } From c23168bc02e278ec653ebb260f7c6c4c8c913d1b Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 31 Jan 2022 10:41:27 +0530 Subject: [PATCH 2/3] use SearchBuilder to fix query condition Signed-off-by: Abhishek Kumar --- .../com/cloud/vm/dao/VMInstanceDaoImpl.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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 f2d75aa6ea0c..3585f4d782e3 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 @@ -965,14 +965,18 @@ public void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType @Override public List listByHostOrLastHostOrHostPod(long hostId, long podId) { - SearchCriteria sc = createSearchCriteria(); - sc.addOr("hostId", SearchCriteria.Op.EQ, hostId); - sc.addOr("lastHostId", SearchCriteria.Op.EQ, hostId); - SearchCriteria podSc = createSearchCriteria(); - podSc.addAnd("hostId", Op.NULL); - podSc.addAnd("lastHostId", Op.NULL); - podSc.addAnd("podIdToDeployIn", SearchCriteria.Op.EQ, podId); - sc.addOr("pod", SearchCriteria.Op.SC, podSc); + SearchBuilder sb = createSearchBuilder(); + sb.or("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.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); } } From 84ff334f383d7add0154c6410a48aab0d3252ebf Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 31 Jan 2022 15:10:01 +0530 Subject: [PATCH 3/3] add paranthesis Signed-off-by: Abhishek Kumar --- .../src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 3585f4d782e3..5701d7e39890 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 @@ -966,12 +966,13 @@ public void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType @Override public List listByHostOrLastHostOrHostPod(long hostId, long podId) { SearchBuilder sb = createSearchBuilder(); - sb.or("hostId", sb.entity().getHostId(), Op.EQ); + 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));