2 * Copyright (C) 2013 Red Hat, Inc. and others...
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 * Authors : Madhu Venugopal, Brent Salisbury, Dave Tucker
10 package org.opendaylight.ovsdb.openstack.netvirt.impl;
12 import com.google.common.base.Preconditions;
13 import java.util.List;
14 import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
15 import org.opendaylight.neutron.spi.INeutronPortCRUD;
16 import org.opendaylight.neutron.spi.NeutronNetwork;
17 import org.opendaylight.neutron.spi.NeutronPort;
18 import org.opendaylight.ovsdb.openstack.netvirt.ConfigInterface;
19 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
20 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
21 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
22 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
23 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
26 import org.osgi.framework.BundleContext;
27 import org.osgi.framework.ServiceReference;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 public class TenantNetworkManagerImpl implements ConfigInterface, TenantNetworkManager {
32 static final Logger logger = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
33 private INeutronNetworkCRUD neutronNetworkCache;
34 private INeutronPortCRUD neutronPortCache;
35 private VlanConfigurationCache vlanConfigurationCache;
36 private Southbound southbound;
39 public int getInternalVlan(Node node, String networkId) {
40 Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
48 public void reclaimInternalVlan(Node node, NeutronNetwork network) {
49 int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
51 logger.debug("Unable to get an internalVlan for Network {}", network);
54 logger.debug("Removed Vlan {} on {}", vlan);
58 public void programInternalVlan(Node node, OvsdbTerminationPointAugmentation tp, NeutronNetwork network) {
59 int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
60 logger.debug("Programming Vlan {} on {}", vlan, tp);
62 logger.debug("Unable to get an internalVlan for Network {}", network);
66 southbound.addVlanToTp(vlan);
70 public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
71 String networkId = this.getNetworkId(segmentationId);
72 if (networkId == null) {
73 logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
78 List<OvsdbTerminationPointAugmentation> ports = southbound.getTerminationPointsOfBridge(node);
79 for (OvsdbTerminationPointAugmentation port : ports) {
80 String ifaceId = southbound.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
81 if (ifaceId != null && isInterfacePresentInTenantNetwork(ifaceId, networkId)) {
82 logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
83 networkId, segmentationId, node, port);
87 } catch (Exception e) {
88 logger.error("Error while trying to determine if network is present on node", e);
92 logger.debug("Tenant Network {} with Segmenation-id {} is NOT present in Node {}",
93 networkId, segmentationId, node);
99 public String getNetworkId(String segmentationId) {
100 Preconditions.checkNotNull(neutronNetworkCache);
101 List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
102 for (NeutronNetwork network : networks) {
103 if (network.getProviderSegmentationID() != null &&
104 network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) {
105 return network.getNetworkUUID();
112 public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
113 Preconditions.checkNotNull(neutronNetworkCache);
114 Preconditions.checkNotNull(neutronPortCache);
115 NeutronNetwork neutronNetwork = null;
117 logger.debug("getTenantNetwork for {}", terminationPointAugmentation);
118 String neutronPortId = southbound.getInterfaceExternalIdsValue(terminationPointAugmentation,
119 Constants.EXTERNAL_ID_INTERFACE_ID);
120 if (neutronPortId != null) {
121 NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
122 if (neutronPort != null) {
123 neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
124 if (neutronNetwork != null) {
125 logger.debug("mapped to {}", neutronNetwork);
127 logger.debug("getTenantNetwork: did not find neutronNetwork in cache from neutronPort {}",
131 logger.info("getTenantNetwork did not find neutronPort {} from termination point {}",
132 neutronPortId, terminationPointAugmentation.getName());
135 logger.debug("getTenantNetwork: did not find {} in external_ids", Constants.EXTERNAL_ID_INTERFACE_ID);
137 return neutronNetwork;
141 public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
142 Preconditions.checkNotNull(neutronPortCache);
143 NeutronPort neutronPort = null;
145 logger.trace("getTenantPort for {}", terminationPointAugmentation.getName());
146 String neutronPortId = southbound.getInterfaceExternalIdsValue(terminationPointAugmentation,
147 Constants.EXTERNAL_ID_INTERFACE_ID);
148 if (neutronPortId != null) {
149 neutronPort = neutronPortCache.getPort(neutronPortId);
151 if (neutronPort != null) {
152 logger.debug("mapped to {}", neutronPort);
154 logger.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName());
161 public int networkCreated (Node node, String networkId) {
162 return vlanConfigurationCache.assignInternalVlan(node, networkId);
166 public void networkDeleted(String id) {
167 //ToDo: Delete? This method does nothing since container support was dropped...
170 private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
171 NeutronPort neutronPort = neutronPortCache.getPort(portId);
172 return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);
176 public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
177 vlanConfigurationCache =
178 (VlanConfigurationCache) ServiceHelper.getGlobalInstance(VlanConfigurationCache.class, this);
180 (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
184 public void setDependencies(Object impl) {
185 if (impl instanceof INeutronNetworkCRUD) {
186 neutronNetworkCache = (INeutronNetworkCRUD)impl;
187 } else if (impl instanceof INeutronPortCRUD) {
188 neutronPortCache = (INeutronPortCRUD)impl;