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.lib.notation.OvsdbSet;
17 import org.opendaylight.ovsdb.lib.notation.Row;
18 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
19 import org.opendaylight.ovsdb.openstack.netvirt.api.MdsalConsumer;
20 import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
21 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConfigurationService;
22 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConnectionService;
23 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
24 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
25 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
26 import org.opendaylight.ovsdb.schema.openvswitch.Port;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
29 import com.google.common.base.Preconditions;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
33 import java.util.List;
36 public class TenantNetworkManagerImpl implements TenantNetworkManager {
37 static final Logger logger = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
39 // The implementation for each of these services is resolved by the OSGi Service Manager
40 private volatile OvsdbConfigurationService ovsdbConfigurationService;
41 private volatile OvsdbConnectionService connectionService;
42 private volatile MdsalConsumer mdsalConsumer;
43 private volatile INeutronNetworkCRUD neutronNetworkCache;
44 private volatile INeutronPortCRUD neutronPortCache;
45 private volatile VlanConfigurationCache vlanConfigurationCache;
47 public TenantNetworkManagerImpl() {
51 public int getInternalVlan(Node node, String networkId) {
52 Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
53 if (vlan == null) return 0;
58 public void reclaimInternalVlan(Node node, String portUUID, NeutronNetwork network) {
59 int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
61 logger.debug("Unable to get an internalVlan for Network {}", network);
64 logger.debug("Removed Vlan {} on {}", vlan, portUUID);
68 public void programInternalVlan(Node node, String portUUID, NeutronNetwork network) {
69 /* TODO SB_MIGRATION */
70 Preconditions.checkNotNull(ovsdbConfigurationService);
72 int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
73 logger.debug("Programming Vlan {} on {}", vlan, portUUID);
75 logger.debug("Unable to get an internalVlan for Network {}", network);
79 Port port = ovsdbConfigurationService.createTypedRow(node, Port.class);
80 OvsdbSet<Long> tags = new OvsdbSet<>();
81 tags.add((long) vlan);
83 ovsdbConfigurationService.updateRow(node, port.getSchema().getName(), null, portUUID, port.getRow());
87 public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
88 /* TODO SB_MIGRATION */
89 Preconditions.checkNotNull(ovsdbConfigurationService);
91 String networkId = this.getNetworkId(segmentationId);
92 if (networkId == null) {
93 logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
98 /* TODO SB_MIGRATION this code was already commented out
99 // Vlan Tag based identification
100 Map<String, Row> portTable = ovsdbConfigService.getRows(node, Port.NAME.getName());
101 if (portTable == null) {
102 logger.debug("Port table is null for Node {} ", node);
106 for (Row row : portTable.values()) {
107 Port port = (Port)row;
108 Set<BigInteger> tags = port.getTag();
109 if (tags.contains(internalVlan)) {
110 logger.debug("Tenant Network {} with Segmenation-id {} is present in Node {} / Port {}",
111 networkId, segmentationId, node, port);
115 */ //TODO SB_MIGRATION this code was already commented out
116 // External-id based more accurate VM Location identification
117 Map<String, Row> ifTable = ovsdbConfigurationService.getRows(node, ovsdbConfigurationService.getTableName(node, Interface.class));
118 if (ifTable == null) {
119 logger.debug("Interface table is null for Node {} ", node);
123 for (Row row : ifTable.values()) {
124 Interface intf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row);
125 Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
126 if (externalIds != null && externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID) != null) {
127 if (this.isInterfacePresentInTenantNetwork(externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID), networkId)) {
128 logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
129 networkId, segmentationId, node, intf);
135 } catch (Exception e) {
136 logger.error("Error while trying to determine if network is present on node", e);
140 logger.debug("Tenant Network {} with Segmenation-id {} is NOT present in Node {}",
141 networkId, segmentationId, node);
147 public String getNetworkId(String segmentationId) {
148 List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
149 for (NeutronNetwork network : networks) {
150 if (network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) return network.getNetworkUUID();
156 public NeutronNetwork getTenantNetwork(Interface intf) {
157 logger.trace("getTenantNetwork for {}", intf);
158 if (intf == null) return null;
159 Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
160 logger.trace("externalIds {}", externalIds);
161 if (externalIds == null) return null;
162 String neutronPortId = externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID);
163 if (neutronPortId == null) return null;
164 NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
165 logger.trace("neutronPort {}", neutronPort);
166 if (neutronPort == null) return null;
167 NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
168 logger.debug("{} mapped to {}", intf, neutronNetwork);
169 return neutronNetwork;
173 public int networkCreated (Node node, String networkId) {
174 return vlanConfigurationCache.assignInternalVlan(node, networkId);
178 public void networkDeleted(String id) {
179 //ToDo: Delete? This method does nothing how we dropped container support...
182 private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
183 NeutronPort neutronPort = neutronPortCache.getPort(portId);
184 return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);