2 * Copyright (c) 2013, 2015 Red Hat, Inc. and others. All rights reserved.
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
9 package org.opendaylight.ovsdb.openstack.netvirt.impl;
11 import com.google.common.base.Preconditions;
13 import java.util.List;
15 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronNetwork;
16 import org.opendaylight.ovsdb.openstack.netvirt.translator.NeutronPort;
17 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronNetworkCRUD;
18 import org.opendaylight.ovsdb.openstack.netvirt.translator.crud.INeutronPortCRUD;
19 import org.opendaylight.ovsdb.openstack.netvirt.ConfigInterface;
20 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
21 import org.opendaylight.ovsdb.openstack.netvirt.api.Southbound;
22 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
23 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
24 import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
27 import org.osgi.framework.ServiceReference;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 public class TenantNetworkManagerImpl implements ConfigInterface, TenantNetworkManager {
32 private static final Logger LOG = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
33 private INeutronNetworkCRUD neutronNetworkCache;
34 private INeutronPortCRUD neutronPortCache;
35 private VlanConfigurationCache vlanConfigurationCache;
36 private Southbound southbound;
37 private volatile NeutronL3Adapter neutronL3Adapter;
40 public int getInternalVlan(Node node, String networkId) {
41 Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
49 public void reclaimInternalVlan(Node node, NeutronNetwork network) {
50 int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
52 LOG.debug("Unable to get an internalVlan for Network {}", network);
55 LOG.debug("Removed Vlan {} on {}", vlan);
59 public void programInternalVlan(Node node, OvsdbTerminationPointAugmentation tp, NeutronNetwork network) {
60 int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
61 LOG.debug("Programming Vlan {} on {}", vlan, tp);
63 LOG.debug("Unable to get an internalVlan for Network {}", network);
67 southbound.addVlanToTp(vlan);
71 public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
72 String networkId = this.getNetworkId(segmentationId);
73 if (networkId == null) {
74 LOG.debug("Tenant Network not found with Segmenation-id {}", segmentationId);
79 // Make sure to get fresh list of termination points, and not use the ones provided in node param!
80 List<OvsdbTerminationPointAugmentation> ports = southbound.readTerminationPointAugmentations(node);
82 for (OvsdbTerminationPointAugmentation port : ports) {
83 String ifaceId = southbound.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
84 if (ifaceId != null && isInterfacePresentInTenantNetwork(ifaceId, networkId)) {
85 LOG.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
86 networkId, segmentationId, node, port);
90 } catch (Exception e) {
91 LOG.error("Error while trying to determine if network is present on node", e);
95 LOG.debug("Tenant Network {} with Segmenation-id {} is NOT present in Node {}",
96 networkId, segmentationId, node);
102 public String getNetworkId(String segmentationId) {
103 Preconditions.checkNotNull(neutronNetworkCache);
104 List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
105 for (NeutronNetwork network : networks) {
106 if (network.getProviderSegmentationID() != null &&
107 network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) {
108 return network.getNetworkUUID();
111 for (String networkUuid : neutronL3Adapter.getNetworkCleanupCache().keySet()) {
112 NeutronNetwork network = neutronL3Adapter.getNetworkFromCleanupCache(networkUuid);
113 if (network.getProviderSegmentationID() != null &&
114 network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) {
115 return network.getNetworkUUID();
122 public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
123 Preconditions.checkNotNull(neutronNetworkCache);
124 Preconditions.checkNotNull(neutronPortCache);
125 NeutronNetwork neutronNetwork = null;
127 LOG.debug("getTenantNetwork for {}", terminationPointAugmentation);
128 String neutronPortId = southbound.getInterfaceExternalIdsValue(terminationPointAugmentation,
129 Constants.EXTERNAL_ID_INTERFACE_ID);
130 if (neutronPortId != null) {
131 NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
132 if ( null == neutronPort) {
133 LOG.debug("neutronPort is null, checking the clean up cache.");
134 neutronPort = neutronL3Adapter.getPortFromCleanupCache(neutronPortId);
136 if (neutronPort != null) {
137 neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
138 if (null == neutronNetwork) {
139 neutronNetwork = neutronL3Adapter.getNetworkFromCleanupCache(neutronPort.getNetworkUUID());
141 if (neutronNetwork != null) {
142 LOG.debug("mapped to {}", neutronNetwork);
144 LOG.debug("getTenantNetwork: did not find neutronNetwork in cache from neutronPort {}",
148 LOG.info("getTenantNetwork did not find neutronPort {} from termination point {}",
149 neutronPortId, terminationPointAugmentation.getName());
152 LOG.debug("getTenantNetwork: did not find {} in external_ids", Constants.EXTERNAL_ID_INTERFACE_ID);
154 return neutronNetwork;
158 public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
159 Preconditions.checkNotNull(neutronPortCache);
160 NeutronPort neutronPort = null;
162 LOG.trace("getTenantPort for {}", terminationPointAugmentation.getName());
163 String neutronPortId = southbound.getInterfaceExternalIdsValue(terminationPointAugmentation,
164 Constants.EXTERNAL_ID_INTERFACE_ID);
165 if (neutronPortId != null) {
166 neutronPort = neutronPortCache.getPort(neutronPortId);
167 if (null == neutronPort) {
168 LOG.debug("neutronPort is null checking the clean up cache.");
169 neutronPort = neutronL3Adapter.getPortFromCleanupCache(neutronPortId);
172 if (neutronPort != null) {
173 LOG.debug("mapped to {}", neutronPort);
175 LOG.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName());
182 public int networkCreated (Node node, String networkId) {
183 return vlanConfigurationCache.assignInternalVlan(node, networkId);
187 public void networkDeleted(String id) {
188 //ToDo: Delete? This method does nothing since container support was dropped...
191 private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
192 NeutronPort neutronPort = neutronPortCache.getPort(portId);
193 if (null == neutronPort) {
194 LOG.debug("neutronPort is null checking the clean up cache.");
195 neutronPort = neutronL3Adapter.getPortFromCleanupCache(portId);
197 return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);
201 public void setDependencies(ServiceReference serviceReference) {
202 vlanConfigurationCache =
203 (VlanConfigurationCache) ServiceHelper.getGlobalInstance(VlanConfigurationCache.class, this);
205 (Southbound) ServiceHelper.getGlobalInstance(Southbound.class, this);
207 (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
211 public void setDependencies(Object impl) {
212 if (impl instanceof INeutronNetworkCRUD) {
213 neutronNetworkCache = (INeutronNetworkCRUD)impl;
214 } else if (impl instanceof INeutronPortCRUD) {
215 neutronPortCache = (INeutronPortCRUD)impl;