Skip to content

Commit 638779c

Browse files
authored
vm-import: fix unmanaged instance listing (apache#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 <abhishek.mrt22@gmail.com>
1 parent 62b806a commit 638779c

3 files changed

Lines changed: 22 additions & 13 deletions

File tree

engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
162162

163163
void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType hypervisorType);
164164

165+
List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId);
165166
}

engine/schema/src/main/java/com/cloud/vm/dao/VMInstanceDaoImpl.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
import javax.annotation.PostConstruct;
2929
import javax.inject.Inject;
3030

31-
import com.cloud.hypervisor.Hypervisor;
3231
import org.apache.log4j.Logger;
3332
import org.springframework.stereotype.Component;
3433

3534
import com.cloud.host.HostVO;
3635
import com.cloud.host.dao.HostDao;
36+
import com.cloud.hypervisor.Hypervisor;
3737
import com.cloud.server.ResourceTag.ResourceObjectType;
3838
import com.cloud.tags.dao.ResourceTagDao;
3939
import com.cloud.utils.DateUtil;
@@ -961,6 +961,23 @@ public void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType
961961
} catch (Throwable e) {
962962
throw new CloudRuntimeException("Caught: " + sql, e);
963963
}
964+
}
964965

966+
@Override
967+
public List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId) {
968+
SearchBuilder<VMInstanceVO> sb = createSearchBuilder();
969+
sb.or().op("hostId", sb.entity().getHostId(), Op.EQ);
970+
sb.or("lastHostId", sb.entity().getLastHostId(), Op.EQ);
971+
sb.and().op("hostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL);
972+
sb.and("lastHostIdNull", sb.entity().getHostId(), SearchCriteria.Op.NULL);
973+
sb.and("podId", sb.entity().getPodIdToDeployIn(), Op.EQ);
974+
sb.cp();
975+
sb.cp();
976+
sb.done();
977+
SearchCriteria<VMInstanceVO> sc = sb.create();
978+
sc.setParameters("hostId", String.valueOf(hostId));
979+
sc.setParameters("lastHostId", String.valueOf(hostId));
980+
sc.setParameters("podId", String.valueOf(podId));
981+
return listBy(sc);
965982
}
966983
}

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.Map;
2424
import java.util.Set;
25+
import java.util.stream.Collectors;
2526

2627
import javax.inject.Inject;
2728

@@ -363,18 +364,8 @@ private List<String> getAdditionalNameFilters(Cluster cluster) {
363364
}
364365

365366
private List<String> getHostManagedVms(Host host) {
366-
List<String> managedVms = new ArrayList<>();
367-
List<VMInstanceVO> instances = vmDao.listByHostId(host.getId());
368-
for (VMInstanceVO instance : instances) {
369-
managedVms.add(instance.getInstanceName());
370-
}
371-
instances = vmDao.listByLastHostIdAndStates(host.getId(),
372-
VirtualMachine.State.Stopped, VirtualMachine.State.Destroyed,
373-
VirtualMachine.State.Expunging, VirtualMachine.State.Error,
374-
VirtualMachine.State.Unknown, VirtualMachine.State.Shutdown);
375-
for (VMInstanceVO instance : instances) {
376-
managedVms.add(instance.getInstanceName());
377-
}
367+
List<VMInstanceVO> instances = vmDao.listByHostOrLastHostOrHostPod(host.getId(), host.getPodId());
368+
List<String> managedVms = instances.stream().map(VMInstanceVO::getInstanceName).collect(Collectors.toList());
378369
return managedVms;
379370
}
380371

0 commit comments

Comments
 (0)