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 <abhishek.mrt22@gmail.com>
This commit is contained in:
Abhishek Kumar 2022-02-03 10:27:05 +05:30 committed by GitHub
parent 62b806ac13
commit 638779ca37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 13 deletions

View File

@ -162,4 +162,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType hypervisorType); void updateSystemVmTemplateId(long templateId, Hypervisor.HypervisorType hypervisorType);
List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId);
} }

View File

@ -28,12 +28,12 @@ import java.util.Map;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.hypervisor.Hypervisor;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.server.ResourceTag.ResourceObjectType;
import com.cloud.tags.dao.ResourceTagDao; import com.cloud.tags.dao.ResourceTagDao;
import com.cloud.utils.DateUtil; import com.cloud.utils.DateUtil;
@ -961,6 +961,23 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
} catch (Throwable e) { } catch (Throwable e) {
throw new CloudRuntimeException("Caught: " + sql, e); throw new CloudRuntimeException("Caught: " + sql, e);
} }
}
@Override
public List<VMInstanceVO> listByHostOrLastHostOrHostPod(long hostId, long podId) {
SearchBuilder<VMInstanceVO> 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<VMInstanceVO> sc = sb.create();
sc.setParameters("hostId", String.valueOf(hostId));
sc.setParameters("lastHostId", String.valueOf(hostId));
sc.setParameters("podId", String.valueOf(podId));
return listBy(sc);
} }
} }

View File

@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
@ -363,18 +364,8 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
} }
private List<String> getHostManagedVms(Host host) { private List<String> getHostManagedVms(Host host) {
List<String> managedVms = new ArrayList<>(); List<VMInstanceVO> instances = vmDao.listByHostOrLastHostOrHostPod(host.getId(), host.getPodId());
List<VMInstanceVO> instances = vmDao.listByHostId(host.getId()); List<String> managedVms = instances.stream().map(VMInstanceVO::getInstanceName).collect(Collectors.toList());
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());
}
return managedVms; return managedVms;
} }