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 org.opendaylight.neutron.spi.INeutronNetworkCRUD;
13 import org.opendaylight.neutron.spi.INeutronPortCRUD;
14 import org.opendaylight.neutron.spi.NeutronNetwork;
15 import org.opendaylight.neutron.spi.NeutronPort;
16 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
17 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
18 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
22 import java.util.List;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
26 public class TenantNetworkManagerImpl implements TenantNetworkManager {
27 static final Logger logger = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
29 // The implementation for each of these services is resolved by the OSGi Service Manager
30 private volatile INeutronNetworkCRUD neutronNetworkCache;
31 private volatile INeutronPortCRUD neutronPortCache;
32 private volatile VlanConfigurationCache vlanConfigurationCache;
35 logger.info(">>>>>> init {}", this.getClass());
39 public int getInternalVlan(Node node, String networkId) {
40 Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
41 if (vlan == null) return 0;
46 public void reclaimInternalVlan(Node node, NeutronNetwork network) {
47 int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
49 logger.debug("Unable to get an internalVlan for Network {}", network);
52 logger.debug("Removed Vlan {} on {}", vlan);
56 public void programInternalVlan(Node node, OvsdbTerminationPointAugmentation tp, NeutronNetwork network) {
57 int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
58 logger.debug("Programming Vlan {} on {}", vlan, tp);
60 logger.debug("Unable to get an internalVlan for Network {}", network);
64 MdsalUtils.addVlanToTp(vlan);
68 public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
69 String networkId = this.getNetworkId(segmentationId);
70 if (networkId == null) {
71 logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
76 List<OvsdbTerminationPointAugmentation> ports = MdsalUtils.getPorts(node);
77 for (OvsdbTerminationPointAugmentation port : ports) {
78 String ifaceId = MdsalUtils.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
79 if (ifaceId != null && isInterfacePresentInTenantNetwork(ifaceId, networkId)) {
80 logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
81 networkId, segmentationId, node, port);
85 } catch (Exception e) {
86 logger.error("Error while trying to determine if network is present on node", e);
90 logger.debug("Tenant Network {} with Segmenation-id {} is NOT present in Node {}",
91 networkId, segmentationId, node);
97 public String getNetworkId(String segmentationId) {
98 List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
99 for (NeutronNetwork network : networks) {
100 if (network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) return network.getNetworkUUID();
106 public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
107 NeutronNetwork neutronNetwork = null;
108 logger.trace("getTenantNetwork for {}", terminationPointAugmentation.getName());
109 String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
110 Constants.EXTERNAL_ID_INTERFACE_ID);
111 if (neutronPortId != null) {
112 NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
113 if (neutronPort != null) {
114 neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
115 if (neutronNetwork != null) {
116 logger.debug("mapped to {}", neutronNetwork);
120 if (neutronNetwork != null) {
121 logger.debug("mapped to {}", neutronNetwork);
123 logger.warn("getTenantPort did not find network for {}", terminationPointAugmentation.getName());
125 return neutronNetwork;
129 public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
130 NeutronPort neutronPort = null;
131 logger.trace("getTenantPort for {}", terminationPointAugmentation.getName());
132 String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
133 Constants.EXTERNAL_ID_INTERFACE_ID);
134 if (neutronPortId != null) {
135 neutronPort = neutronPortCache.getPort(neutronPortId);
137 if (neutronPort != null) {
138 logger.debug("mapped to {}", neutronPort);
140 logger.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName());
147 public int networkCreated (Node node, String networkId) {
148 return vlanConfigurationCache.assignInternalVlan(node, networkId);
152 public void networkDeleted(String id) {
153 //ToDo: Delete? This method does nothing since container support was dropped...
156 private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
157 NeutronPort neutronPort = neutronPortCache.getPort(portId);
158 return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);