// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.network.ovs; import com.cloud.network.Network; import com.cloud.network.Networks; import com.cloud.network.dao.NetworkDao; import com.cloud.network.vpc.VpcManager; import com.cloud.utils.component.ManagerBase; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.NicVO; import com.cloud.vm.Nic; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; import org.springframework.stereotype.Component; @Component public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetworkTopologyGuru { @Inject UserVmDao _userVmDao; @Inject DomainRouterDao _routerDao; @Inject VpcManager _vpcMgr; @Inject VMInstanceDao _vmInstanceDao; @Inject NicDao _nicDao; @Inject NetworkDao _networkDao; /** * get the list of hypervisor hosts on which VM's belonging to a network currently spans */ public List<Long> getNetworkSpanedHosts(long networkId) { List<Long> hostIds = new ArrayList<Long>(); // Find active VMs with a NIC on the target network List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId, VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown, VirtualMachine.State.Migrating); // Find routers for the network List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId); List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>(); if (vms != null) { ins.addAll(vms); } if (routers.size() != 0) { ins.addAll(routers); } for (VMInstanceVO v : ins) { Long rh = v.getHostId(); if (rh == null) { continue; } if (!hostIds.contains(rh)) { hostIds.add(rh); } } return hostIds; } /** * get the list of hypervisor hosts on which VM's belonging to a VPC currently spans */ @Override public List<Long> getVpcSpannedHosts(long vpcId) { List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId); List<Long> vpcHostIds = new ArrayList<>(); for (Network vpcNetwork : vpcNetworks) { List<Long> networkHostIds = getNetworkSpanedHosts(vpcNetwork.getId()); if (networkHostIds != null && !networkHostIds.isEmpty()) { for (Long hostId : networkHostIds) { if (!vpcHostIds.contains(hostId)) { vpcHostIds.add(hostId); } } } } return vpcHostIds; } /** * get the list of VPC id's of the vpc's for which one or more VM's from the VPC are running on the host */ @Override public List<Long> getVpcOnHost(long hostId) { List<Long> vpcIds = new ArrayList<>(); List<VMInstanceVO> vmInstances = _vmInstanceDao.listByHostId(hostId); for (VMInstanceVO instance : vmInstances) { List<NicVO> nics = _nicDao.listByVmId(instance.getId()); for (Nic nic: nics) { Network network = _networkDao.findById(nic.getNetworkId()); if (network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) { if (!vpcIds.contains(network.getVpcId())) { vpcIds.add(network.getVpcId()); } } } } return vpcIds; } /** * get the list of all active Vm id's in a network */ @Override public List<Long> getAllActiveVmsInNetwork(long networkId) { List <Long> vmIds = new ArrayList<>(); List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId, VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown, VirtualMachine.State.Migrating); // Find routers for the network List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId); if (vms != null) { for (UserVmVO vm : vms) { vmIds.add(vm.getId()); } } if (routers.size() != 0) { for (DomainRouterVO router: routers) { vmIds.add(router.getId()); } } return vmIds; } /** * get the list of all active Vm id's in the VPC for all ther tiers */ @Override public List<Long> getAllActiveVmsInVpc(long vpcId) { Set<Long> vmIdsSet = new HashSet<>(); List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId); for (Network network : vpcNetworks) { List<Long> networkVmIds = getAllActiveVmsInNetwork(network.getId()); if (networkVmIds != null && !networkVmIds.isEmpty()) { vmIdsSet.addAll(networkVmIds); } } List<Long> vmIds = new ArrayList<>(); vmIds.addAll(vmIdsSet); return vmIds; } /** * get the list of all Vm id's in the VPC for all the tiers that are running on the host */ @Override public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId) { Set<Long> vmIdsSet = new HashSet<>(); List<? extends Network> vpcNetworks = _vpcMgr.getVpcNetworks(vpcId); for (Network network : vpcNetworks) { List<Long> networkVmIds = getActiveVmsInNetworkOnHost(network.getId(), hostId, false); if (networkVmIds != null && !networkVmIds.isEmpty()) { vmIdsSet.addAll(networkVmIds); } } List<Long> vmIds = new ArrayList<>(); vmIds.addAll(vmIdsSet); return vmIds; } /** * get the list of all Vm id's in the network that are running on the host */ @Override public List<Long> getActiveVmsInNetworkOnHost(long networkId, long hostId, boolean includeVr) { List <Long> vmIds = new ArrayList<>(); List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId, VirtualMachine.State.Running, VirtualMachine.State.Migrating); // Find routers for the network List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId); if (vms != null) { for (UserVmVO vm : vms) { if (vm.getHostId() == hostId) vmIds.add(vm.getId()); } } if (routers.size() != 0 && includeVr) { for (DomainRouterVO router: routers) { if (router.getHostId() == hostId) vmIds.add(router.getId()); } } return vmIds; } /** * get the list of all Vpc id's in which, a VM has a nic in the network that is part of VPC */ @Override public List<Long> getVpcIdsVmIsPartOf(long vmId) { List<Long> vpcIds = new ArrayList<>(); List<NicVO> nics = _nicDao.listByVmId(vmId); if (nics == null) return null; for (Nic nic: nics) { Network network = _networkDao.findById(nic.getNetworkId()); if (network != null && network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) { if (!vpcIds.contains(network.getVpcId())) { vpcIds.add(network.getVpcId()); } } } return vpcIds; } }