package org.ovirt.engine.core.bll; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.ovirt.engine.core.bll.context.EngineContext; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.comparators.VmsComparerByDiskSize; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; public class GetVmsByStorageDomainQuery<P extends IdQueryParameters> extends QueriesCommandBase<P> { @Inject private VmDao vmDao; public GetVmsByStorageDomainQuery(P parameters) { super(parameters); } public GetVmsByStorageDomainQuery(P parameters, EngineContext engineContext) { super(parameters, engineContext); } @Override protected void executeQueryCommand() { Guid domainId = getParameters().getId(); List<VM> vms = getAllVMsForStorageDomain(domainId); // get all disks and snapshots VdcQueryReturnValue queryReturnValue = getAllDisksByStorageDomain(domainId); if (queryReturnValue.getSucceeded()) { List<DiskImage> disksOfDomain = queryReturnValue.getReturnValue(); Map<String, VM> vmNameToVMMap = new HashMap<>(); for (VM vm : vms) { vmNameToVMMap.put(vm.getName(), vm); } for (DiskImage disk : disksOfDomain) { List<String> vmNames = disk.getVmNames(); if (vmNames == null) { continue; } for (String vmName : vmNames) { VM vm = vmNameToVMMap.get(vmName); if (vm != null) { vm.getDiskMap().put(disk.getId(), disk); vm.getDiskList().add(disk); } } } Collections.sort(vms, Collections.reverseOrder(new VmsComparerByDiskSize())); getQueryReturnValue().setReturnValue(vms); } else { log.error("Failed to retrieve disks by storage domain id '{}': {}", domainId, queryReturnValue.getExceptionString()); getQueryReturnValue().setSucceeded(false); getQueryReturnValue().setExceptionString(queryReturnValue.getExceptionString()); } } protected VdcQueryReturnValue getAllDisksByStorageDomain(Guid domainId) { return runInternalQuery(VdcQueryType.GetAllDisksByStorageDomainId, new IdQueryParameters(domainId)); } protected List<VM> getAllVMsForStorageDomain(Guid domainId) { return vmDao.getAllForStorageDomain(domainId); } }