Merge "Reenable BridgeConfigurationManagerImplTest"
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / TenantNetworkManagerImpl.java
index 8f31f74440f40c0380464d3441fc7a055dc79fd6..2e701984f4976ee65c431b71f741b085e3bcdcd6 100644 (file)
  */
 package org.opendaylight.ovsdb.openstack.netvirt.impl;
 
-import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
-import org.opendaylight.controller.networkconfig.neutron.INeutronPortCRUD;
-import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
-import org.opendaylight.controller.networkconfig.neutron.NeutronPort;
-import org.opendaylight.controller.sal.core.Node;
-import org.opendaylight.ovsdb.lib.notation.OvsdbSet;
-import org.opendaylight.ovsdb.lib.notation.Row;
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.opendaylight.neutron.spi.INeutronNetworkCRUD;
+import org.opendaylight.neutron.spi.INeutronPortCRUD;
+import org.opendaylight.neutron.spi.NeutronNetwork;
+import org.opendaylight.neutron.spi.NeutronPort;
+import org.opendaylight.ovsdb.openstack.netvirt.ConfigInterface;
+import org.opendaylight.ovsdb.openstack.netvirt.MdsalUtils;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
-import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProviderManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.VlanConfigurationCache;
-import org.opendaylight.ovsdb.plugin.IConnectionServiceInternal;
-import org.opendaylight.ovsdb.plugin.OvsdbConfigService;
-import org.opendaylight.ovsdb.schema.openvswitch.Interface;
-import org.opendaylight.ovsdb.schema.openvswitch.Port;
-
-import com.google.common.base.Preconditions;
+import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.Map;
-
-public class TenantNetworkManagerImpl implements TenantNetworkManager {
+public class TenantNetworkManagerImpl implements ConfigInterface, TenantNetworkManager {
     static final Logger logger = LoggerFactory.getLogger(TenantNetworkManagerImpl.class);
-
-    // The implementation for each of these services is resolved by the OSGi Service Manager
-    private volatile NetworkingProviderManager networkingProviderManager;
-    private volatile OvsdbConfigService ovsdbConfigService;
-    private volatile IConnectionServiceInternal connectionService;
     private volatile INeutronNetworkCRUD neutronNetworkCache;
     private volatile INeutronPortCRUD neutronPortCache;
     private volatile VlanConfigurationCache vlanConfigurationCache;
 
-    public TenantNetworkManagerImpl() {
-    }
-
     @Override
     public int getInternalVlan(Node node, String networkId) {
         Integer vlan = vlanConfigurationCache.getInternalVlan(node, networkId);
-        if (vlan == null) return 0;
+        if (vlan == null) {
+            return 0;
+        }
         return vlan;
     }
 
     @Override
-    public void reclaimInternalVlan(Node node, String portUUID, NeutronNetwork network) {
+    public void reclaimInternalVlan(Node node, NeutronNetwork network) {
         int vlan = vlanConfigurationCache.reclaimInternalVlan(node, network.getID());
         if (vlan <= 0) {
-            logger.error("Unable to get an internalVlan for Network {}", network);
+            logger.debug("Unable to get an internalVlan for Network {}", network);
             return;
         }
-        logger.debug("Removed Vlan {} on {}", vlan, portUUID);
+        logger.debug("Removed Vlan {} on {}", vlan);
     }
 
     @Override
-    public void programInternalVlan(Node node, String portUUID, NeutronNetwork network) {
-        Preconditions.checkNotNull(ovsdbConfigService);
-
+    public void programInternalVlan(Node node, OvsdbTerminationPointAugmentation tp, NeutronNetwork network) {
         int vlan = vlanConfigurationCache.getInternalVlan(node, network.getID());
-        logger.debug("Programming Vlan {} on {}", vlan, portUUID);
+        logger.debug("Programming Vlan {} on {}", vlan, tp);
         if (vlan <= 0) {
-            logger.error("Unable to get an internalVlan for Network {}", network);
+            logger.debug("Unable to get an internalVlan for Network {}", network);
             return;
         }
 
-        Port port = ovsdbConfigService.createTypedRow(node, Port.class);
-        OvsdbSet<Long> tags = new OvsdbSet<>();
-        tags.add((long) vlan);
-        port.setTag(tags);
-        ovsdbConfigService.updateRow(node, port.getSchema().getName(), null, portUUID, port.getRow());
+        MdsalUtils.addVlanToTp(vlan);
     }
 
     @Override
     public boolean isTenantNetworkPresentInNode(Node node, String segmentationId) {
-        Preconditions.checkNotNull(ovsdbConfigService);
-
         String networkId = this.getNetworkId(segmentationId);
         if (networkId == null) {
             logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
             return false;
         }
-        if (networkingProviderManager.getProvider(node).hasPerTenantTunneling()) {
-            int internalVlan = vlanConfigurationCache.getInternalVlan(node, networkId);
-            if (internalVlan == 0) {
-                logger.debug("No InternalVlan provisioned for Tenant Network {}",networkId);
-                return false;
-            }
-        }
 
         try {
-            /*
-            // Vlan Tag based identification
-            Map<String, Row> portTable = ovsdbConfigService.getRows(node, Port.NAME.getName());
-            if (portTable == null) {
-                logger.debug("Port table is null for Node {} ", node);
-                return false;
-            }
-
-            for (Row row : portTable.values()) {
-                Port port = (Port)row;
-                Set<BigInteger> tags = port.getTag();
-                if (tags.contains(internalVlan)) {
-                    logger.debug("Tenant Network {} with Segmenation-id {} is present in Node {} / Port {}",
-                                  networkId, segmentationId, node, port);
+            List<OvsdbTerminationPointAugmentation> ports = MdsalUtils.getTerminationPointsOfBridge(node);
+            for (OvsdbTerminationPointAugmentation port : ports) {
+                String ifaceId = MdsalUtils.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
+                if (ifaceId != null && isInterfacePresentInTenantNetwork(ifaceId, networkId)) {
+                    logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
+                            networkId, segmentationId, node, port);
                     return true;
                 }
             }
-             */
-            // External-id based more accurate VM Location identification
-            Map<String, Row> ifTable = ovsdbConfigService.getRows(node, ovsdbConfigService.getTableName(node, Interface.class));
-            if (ifTable == null) {
-                logger.debug("Interface table is null for Node {} ", node);
-                return false;
-            }
-
-            for (Row row : ifTable.values()) {
-                Interface intf = ovsdbConfigService.getTypedRow(node, Interface.class, row);
-                Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
-                if (externalIds != null && externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID) != null) {
-                    if (this.isInterfacePresentInTenantNetwork(externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID), networkId)) {
-                        logger.debug("Tenant Network {} with Segmentation-id {} is present in Node {} / Interface {}",
-                                      networkId, segmentationId, node, intf);
-                        return true;
-                    }
-                }
-            }
-
         } catch (Exception e) {
             logger.error("Error while trying to determine if network is present on node", e);
             return false;
@@ -149,6 +96,7 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager {
 
     @Override
     public String getNetworkId(String segmentationId) {
+        Preconditions.checkNotNull(neutronNetworkCache);
         List <NeutronNetwork> networks = neutronNetworkCache.getAllNetworks();
         for (NeutronNetwork network : networks) {
             if (network.getProviderSegmentationID().equalsIgnoreCase(segmentationId)) return network.getNetworkUUID();
@@ -157,30 +105,55 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager {
     }
 
     @Override
-    public NeutronNetwork getTenantNetwork(Interface intf) {
-        logger.trace("getTenantNetwork for {}", intf);
-        if (intf == null) return null;
-        Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
-        logger.trace("externalIds {}", externalIds);
-        if (externalIds == null) return null;
-        String neutronPortId = externalIds.get(Constants.EXTERNAL_ID_INTERFACE_ID);
-        if (neutronPortId == null) return null;
-        NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
-        logger.trace("neutronPort {}", neutronPort);
-        if (neutronPort == null) return null;
-        NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
-        logger.debug("{} mapped to {}", intf, neutronNetwork);
+    public NeutronNetwork getTenantNetwork(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
+        Preconditions.checkNotNull(neutronNetworkCache);
+        Preconditions.checkNotNull(neutronPortCache);
+        NeutronNetwork neutronNetwork = null;
+
+        logger.debug("getTenantNetwork for {}", terminationPointAugmentation);
+        String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
+                Constants.EXTERNAL_ID_INTERFACE_ID);
+        if (neutronPortId != null) {
+            NeutronPort neutronPort = neutronPortCache.getPort(neutronPortId);
+            if (neutronPort != null) {
+                neutronNetwork = neutronNetworkCache.getNetwork(neutronPort.getNetworkUUID());
+                if (neutronNetwork != null) {
+                    logger.debug("mapped to {}", neutronNetwork);
+                } else {
+                    logger.debug("getTenantNetwork: did not find neutronNetwork in cache");
+                }
+            } else {
+                logger.debug("getTenantNetwork: did not find neutronPort in cache");
+            }
+        } else {
+            logger.debug("getTenantNetwork: did not find {} in external_ids", Constants.EXTERNAL_ID_INTERFACE_ID);
+        }
+        if (neutronNetwork != null) {
+            logger.debug("mapped to {}", neutronNetwork);
+        } else {
+            logger.warn("getTenantNetwork did not find network for {}", terminationPointAugmentation.getName());
+        }
         return neutronNetwork;
     }
 
     @Override
-    public void networkCreated (String networkId) {
-        List<Node> nodes = connectionService.getNodes();
-
-        for (Node node : nodes) {
-            this.networkCreated(node, networkId);
+    public NeutronPort getTenantPort(OvsdbTerminationPointAugmentation terminationPointAugmentation) {
+        Preconditions.checkNotNull(neutronPortCache);
+        NeutronPort neutronPort = null;
+
+        logger.trace("getTenantPort for {}", terminationPointAugmentation.getName());
+        String neutronPortId = MdsalUtils.getInterfaceExternalIdsValue(terminationPointAugmentation,
+            Constants.EXTERNAL_ID_INTERFACE_ID);
+        if (neutronPortId != null) {
+            neutronPort = neutronPortCache.getPort(neutronPortId);
+        }
+        if (neutronPort != null) {
+            logger.debug("mapped to {}", neutronPort);
+        } else {
+            logger.warn("getTenantPort did not find port for {}", terminationPointAugmentation.getName());
         }
 
+        return neutronPort;
     }
 
     @Override
@@ -190,7 +163,7 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager {
 
     @Override
     public void networkDeleted(String id) {
-        //ToDo: Delete? This method does nothing how we dropped container support...
+        //ToDo: Delete? This method does nothing since container support was dropped...
     }
 
     private boolean isInterfacePresentInTenantNetwork (String portId, String networkId) {
@@ -198,4 +171,18 @@ public class TenantNetworkManagerImpl implements TenantNetworkManager {
         return neutronPort != null && neutronPort.getNetworkUUID().equalsIgnoreCase(networkId);
     }
 
+    @Override
+    public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
+        vlanConfigurationCache =
+                (VlanConfigurationCache) ServiceHelper.getGlobalInstance(VlanConfigurationCache.class, this);
+    }
+
+    @Override
+    public void setDependencies(Object impl) {
+        if (impl instanceof INeutronNetworkCRUD) {
+            neutronNetworkCache = (INeutronNetworkCRUD)impl;
+        } else if (impl instanceof INeutronPortCRUD) {
+            neutronPortCache = (INeutronPortCRUD)impl;
+        }
+    }
 }