package org.ovirt.engine.core.bll.network; import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import javax.inject.Inject; import javax.inject.Singleton; import org.ovirt.engine.core.bll.common.predicates.NicIsPluggedPredicate; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao; @Singleton public class FindActiveVmsUsingNetwork { @Inject private VmDao vmDao; @Inject private VmNetworkInterfaceDao vmNetworkInterfaceDao; private List<VM> findActiveVmsUsingNetworks(Guid vdsId, Collection<String> networks) { if (networks.isEmpty()) { return Collections.emptyList(); } List<VM> runningVms = vmDao.getAllRunningForVds(vdsId); List<VM> vms = new ArrayList<>(); for (VM vm : runningVms) { List<VmNetworkInterface> vmInterfaces = vmNetworkInterfaceDao.getAllForVm(vm.getId()); for (VmNetworkInterface vmNic : vmInterfaces) { boolean vmHasNetworkAttachedToPluggedNic = NicIsPluggedPredicate.getInstance().test(vmNic) && vmNic.getNetworkName() != null && networks.contains(vmNic.getNetworkName()); if (vmHasNetworkAttachedToPluggedNic) { vms.add(vm); break; } } } return vms; } /** * Finds active VMs which actively uses a network from a given networks list * * @param vdsId * The host id on which VMs are running * @param networkNames * the networks to check if used * @return A list of VM names which uses the networks */ public List<String> findNamesOfActiveVmsUsingNetworks(Guid vdsId, Collection<String> networkNames) { return findActiveVmsUsingNetworks(vdsId, networkNames).stream().map(VM::getName).collect(toList()); } public List<String> findNamesOfActiveVmsUsingNetworks(Guid vdsId, String ... networkNames) { return findNamesOfActiveVmsUsingNetworks(vdsId, Arrays.asList(networkNames)); } }