blob: c8500665a7c36da27b81af18b4a11d27fc1ec2df [file] [log] [blame]
// 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;
}
}