OF Flow programming on br-int (NORMAL) and bidirectional br-tun (based on tenant... 11/3111/1
authorMadhu Venugopal <mavenugo@gmail.com>
Tue, 26 Nov 2013 19:35:46 +0000 (11:35 -0800)
committerMadhu Venugopal <mavenugo@gmail.com>
Tue, 26 Nov 2013 19:35:46 +0000 (11:35 -0800)
Change-Id: I611e8fed23996b3b03a77640853fadb38b8c9513
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
neutron/pom.xml
neutron/src/main/java/org/opendaylight/ovsdb/neutron/AdminConfigManager.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/InternalNetworkManager.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/SouthboundHandler.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/TenantNetworkManager.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/provider/OF10ProviderManager.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/provider/OF13ProviderManager.java
neutron/src/main/java/org/opendaylight/ovsdb/neutron/provider/ProviderNetworkManager.java

index 41ae17d300811804745e681238d1a5cb112078d2..fe00bb5ffb3ca394b9fbb1c9a6c9806cd5e0658d 100644 (file)
             <Import-Package>
               org.opendaylight.controller.networkconfig.neutron,
               org.opendaylight.controller.containermanager,
+              org.opendaylight.controller.forwardingrulesmanager,
               org.opendaylight.controller.sal.core,
               org.opendaylight.controller.sal.utils,
+              org.opendaylight.controller.sal.action,
               org.opendaylight.ovsdb.plugin,
               org.opendaylight.ovsdb.lib.notation,
               org.opendaylight.ovsdb.lib.table,
       <version>0.4.1-SNAPSHOT</version>
       <artifactId>networkconfig.neutron</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>forwardingrulesmanager</artifactId>
+      <version>0.4.1-SNAPSHOT</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>sal</artifactId>
index d787ba9d9c9d9812ef2d425eed66e5ff877f0227..4f47498951d1ff45980f00bc7c0c02a72238f5e8 100644 (file)
@@ -20,6 +20,8 @@ public class AdminConfigManager {
     private String tunnelBridgeName;
     private String externalBridgeName;
     private String tunnelEndpointConfigName;
+    private String patchToIntegration;
+    private String patchToTunnel;
     private Map<Node, InetAddress> tunnelEndpoints;
 
     // Refer to /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
@@ -27,10 +29,14 @@ public class AdminConfigManager {
     private static String DEFAULT_INTEGRATION_BRIDGENAME = "br-int";
     private static String DEFAULT_TUNNEL_BRIDGENAME = "br-tun";
     private static String DEFAULT_EXTERNAL_BRIDGENAME = "br-ex";
+    private static String DEFAULT_PATCH_TO_INTEGRATION = "patch-int";
+    private static String DEFAULT_PATCH_TO_TUNNEL = "patch-tun";
     private static String CONFIG_TUNNEL_ENDPOINT_CONFIG = "tunnel_endpoint_config_string";
     private static String CONFIG_INTEGRATION_BRIDGENAME = "integration_bridge";
     private static String CONFIG_TUNNEL_BRIDGENAME = "tunnel_bridge";
     private static String CONFIG_EXTERNAL_BRIDGENAME = "external_bridge";
+    private static String CONFIG_PATCH_TO_INTEGRATION = "patch-int";
+    private static String CONFIG_PATCH_TO_TUNNEL = "patch-tun";
 
     private static AdminConfigManager adminConfiguration = new AdminConfigManager();
 
@@ -40,11 +46,15 @@ public class AdminConfigManager {
         integrationBridgeName = System.getProperty(CONFIG_INTEGRATION_BRIDGENAME);
         tunnelBridgeName = System.getProperty(CONFIG_TUNNEL_BRIDGENAME);
         externalBridgeName = System.getProperty(CONFIG_EXTERNAL_BRIDGENAME);
+        patchToIntegration = System.getProperty(CONFIG_PATCH_TO_INTEGRATION);
+        patchToTunnel = System.getProperty(CONFIG_PATCH_TO_TUNNEL);
 
         if (tunnelEndpointConfigName == null) tunnelEndpointConfigName = DEFAULT_TUNNEL_ENDPOINT_CONFIG_STRING;
         if (integrationBridgeName == null) integrationBridgeName = DEFAULT_INTEGRATION_BRIDGENAME;
         if (tunnelBridgeName == null) tunnelBridgeName = DEFAULT_TUNNEL_BRIDGENAME;
         if (externalBridgeName == null) externalBridgeName = DEFAULT_EXTERNAL_BRIDGENAME;
+        if (patchToIntegration == null) patchToIntegration = DEFAULT_PATCH_TO_INTEGRATION;
+        if (patchToTunnel == null) patchToTunnel = DEFAULT_PATCH_TO_TUNNEL;
     }
 
     public static AdminConfigManager getManager() {
@@ -75,6 +85,22 @@ public class AdminConfigManager {
         this.externalBridgeName = externalBridgeName;
     }
 
+    public String getPatchToIntegration() {
+        return patchToIntegration;
+    }
+
+    public void setPatchToIntegration(String patchToIntegration) {
+        this.patchToIntegration = patchToIntegration;
+    }
+
+    public String getPatchToTunnel() {
+        return patchToTunnel;
+    }
+
+    public void setPatchToTunnel(String patchToTunnel) {
+        this.patchToTunnel = patchToTunnel;
+    }
+
     public InetAddress getTunnelEndPoint(Node node) {
         return tunnelEndpoints.get(node);
     }
index d3cbe8f87b0f7e8a35306ace0f94475819680926..3b45fe1ad42e8781cb4e0bf5b5ec8f2f673037fe 100644 (file)
@@ -1,11 +1,18 @@
 package org.opendaylight.ovsdb.neutron;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
+import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
+import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
 import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
 import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
+import org.opendaylight.controller.sal.action.ActionType;
 import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.utils.HexEncode;
 import org.opendaylight.controller.sal.utils.ServiceHelper;
 import org.opendaylight.controller.sal.utils.Status;
 import org.opendaylight.controller.sal.utils.StatusCode;
@@ -40,28 +47,35 @@ public class InternalNetworkManager {
         return internalNetwork;
     }
 
-    public boolean isInternalNetworkNeutronReady(Node node) throws Exception {
-        OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
-        Map<String, Table<?>> bridgeTable = ovsdbTable.getRows(node, Bridge.NAME.getName());
-        if (bridgeTable != null) {
-            for (Table<?> row : bridgeTable.values()) {
-                Bridge bridge = (Bridge)row;
-                if (bridge.getName().equals(AdminConfigManager.getManager().getIntegrationBridgeName())) return true;
+    public String getInternalBridgeUUID (Node node, String bridgeName) {
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            Map<String, Table<?>> bridgeTable = ovsdbTable.getRows(node, Bridge.NAME.getName());
+            if (bridgeTable == null) return null;
+            for (String key : bridgeTable.keySet()) {
+                Bridge bridge = (Bridge)bridgeTable.get(key);
+                if (bridge.getName().equals(bridgeName)) return key;
             }
+        } catch (Exception e) {
+            logger.error("Error getting Bridge Identifier for {} / {}", node, bridgeName, e);
+        }
+        return null;
+    }
+
+    public boolean isInternalNetworkNeutronReady(Node node) throws Exception {
+        if (this.getInternalBridgeUUID(node, AdminConfigManager.getManager().getIntegrationBridgeName()) != null) {
+            return true;
+        } else {
+            return false;
         }
-        return false;
     }
 
     public boolean isInternalNetworkOverlayReady(Node node) throws Exception {
-        OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
-        Map<String, Table<?>> bridgeTable = ovsdbTable.getRows(node, Bridge.NAME.getName());
-        if (bridgeTable != null) {
-            for (Table<?> row : bridgeTable.values()) {
-                Bridge bridge = (Bridge)row;
-                if (bridge.getName().equals(AdminConfigManager.getManager().getTunnelBridgeName())) return true;
-            }
+        if (this.getInternalBridgeUUID(node, AdminConfigManager.getManager().getTunnelBridgeName()) != null) {
+            return true;
+        } else {
+            return false;
         }
-        return false;
     }
 
     public Status createInternalNetworkForOverlay(Node node) throws Exception {
@@ -102,7 +116,10 @@ public class InternalNetworkManager {
         port.setName(brTun.getName());
         status = ovsdbTable.insertRow(node, Port.NAME.getName(), bridgeUUID, port);
 
-        status = addPatchPort(node, bridgeUUID, "patch-int", "patch-tun");
+        String patchInt = AdminConfigManager.getManager().getPatchToIntegration();
+        String patchTun = AdminConfigManager.getManager().getPatchToTunnel();
+
+        status = addPatchPort(node, bridgeUUID, patchInt, patchTun);
         if (!status.isSuccess()) return status;
 
         // Create the corresponding patch-tun port in br-int
@@ -110,7 +127,7 @@ public class InternalNetworkManager {
         for (String brIntUUID : bridges.keySet()) {
             Bridge brInt = (Bridge) bridges.get(brIntUUID);
             if (brInt.getName().equalsIgnoreCase(AdminConfigManager.getManager().getIntegrationBridgeName())) {
-                return addPatchPort(node, brIntUUID, "patch-tun", "patch-int");
+                return addPatchPort(node, brIntUUID, patchTun, patchInt);
             }
         }
 
@@ -180,6 +197,37 @@ public class InternalNetworkManager {
                 e.printStackTrace();
             }
         }
+
+        this.initializeFlowRules(node, AdminConfigManager.getManager().getIntegrationBridgeName());
+    }
+
+    private void initializeFlowRules(Node node, String bridgeName) {
+        String brIntId = this.getInternalBridgeUUID(node, bridgeName);
+        if (brIntId == null) {
+            logger.error("Failed to initialize Flow Rules for {}", node);
+            return;
+        }
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            Bridge bridge = (Bridge) ovsdbTable.getRow(node, Bridge.NAME.getName(), brIntId);
+            Set<String> dpids = bridge.getDatapath_id();
+            if (dpids == null || dpids.size() ==  0) return;
+            Long dpidLong = Long.valueOf(HexEncode.stringToLong((String)dpids.toArray()[0]));
+            Node ofNode = new Node(Node.NodeIDType.OPENFLOW, dpidLong);
+            IForwardingRulesManager frm = (IForwardingRulesManager) ServiceHelper.getInstance(
+                    IForwardingRulesManager.class, "default", this);
+            FlowConfig flow = new FlowConfig();
+            flow.setName("IntegrationBridgeNormal");
+            flow.setNode(ofNode);
+            flow.setPriority("1");
+            List<String> normalAction = new ArrayList<String>();
+            normalAction.add(ActionType.HW_PATH.toString());
+            flow.setActions(normalAction);
+            Status status = frm.addStaticFlow(flow);
+            logger.debug("Flow Programming Status {} for Flow {} on {} / {}", status, flow, ofNode, node);
+        } catch (Exception e) {
+            logger.error("Failed to initialize Flow Rules for {}", node, e);
+        }
     }
 
     public void prepareInternalNetwork(NeutronNetwork network) {
@@ -198,4 +246,7 @@ public class InternalNetworkManager {
         }
     }
 
+    public static List safe( List other ) {
+        return other == null ? Collections.EMPTY_LIST : other;
+    }
 }
index 281aecf3d14787fb2de1651f4b88761d6e9b2a2c..d776aeff110afecd90727e3a4c9d1659163725c5 100644 (file)
@@ -152,7 +152,7 @@ public class SouthboundHandler extends BaseHandler implements OVSDBInventoryList
         NeutronNetwork network = TenantNetworkManager.getManager().getTenantNetworkForInterface(intf);
         if (network != null) {
             ProviderNetworkManager.getManager().createTunnels(network.getProviderNetworkType(),
-                    network.getProviderSegmentationID());
+                    network.getProviderSegmentationID(), node, intf);
         }
     }
 
index 8a188f71ca4f9cbae2c2586a55f0033b59fe8a6f..4c14c87b87cb2a85410a1f12029ee410009327a3 100644 (file)
@@ -35,9 +35,9 @@ public class TenantNetworkManager {
     static final Logger logger = LoggerFactory.getLogger(TenantNetworkManager.class);
 
     private static final int MAX_VLAN = 4096;
-    private static final String EXTERNAL_ID_VM_ID = "vm-id";
-    private static final String EXTERNAL_ID_INTERFACE_ID = "iface-id";
-    private static final String EXTERNAL_ID_VM_MAC = "attached-mac";
+    public static final String EXTERNAL_ID_VM_ID = "vm-id";
+    public static final String EXTERNAL_ID_INTERFACE_ID = "iface-id";
+    public static final String EXTERNAL_ID_VM_MAC = "attached-mac";
     private static TenantNetworkManager tenantHelper = new TenantNetworkManager();
     private Queue<Integer> internalVlans = new LinkedList<Integer>();
     private Map<String, Integer> tenantVlanMap = new HashMap<String, Integer>();
@@ -162,7 +162,7 @@ public class TenantNetworkManager {
         return false;
     }
 
-    private String getNetworkIdForSegmentationId (String segmentationId) {
+    public String getNetworkIdForSegmentationId (String segmentationId) {
         INeutronNetworkCRUD neutronNetworkService = (INeutronNetworkCRUD)ServiceHelper.getGlobalInstance(INeutronNetworkCRUD.class, this);
         List <NeutronNetwork> networks = neutronNetworkService.getAllNetworks();
         for (NeutronNetwork network : networks) {
index 152ba0a44eacd30b6db1a7445b2a2321b6cac6ac..dc1008ba1225ef795d32d8e8c9125c65eb573803 100644 (file)
@@ -1,11 +1,17 @@
 package org.opendaylight.ovsdb.neutron.provider;
 
+import java.math.BigInteger;
 import java.net.InetAddress;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
+import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
+import org.opendaylight.controller.sal.action.ActionType;
 import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.utils.HexEncode;
 import org.opendaylight.controller.sal.utils.ServiceHelper;
 import org.opendaylight.controller.sal.utils.Status;
 import org.opendaylight.controller.sal.utils.StatusCode;
@@ -57,8 +63,150 @@ class OF10ProviderManager extends ProviderNetworkManager {
         return new Status(StatusCode.SUCCESS);
     }
 
+    private void programLocalIngressTunnelBridgeRules(Node node, int tunnelOFPort, String attachedMac,
+                                                      int internalVlan, int patchPort) {
+        String brIntId = InternalNetworkManager.getManager().getInternalBridgeUUID(node, AdminConfigManager.getManager().getTunnelBridgeName());
+        if (brIntId == null) {
+            logger.error("Failed to initialize Flow Rules for {}", node);
+            return;
+        }
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            Bridge bridge = (Bridge) ovsdbTable.getRow(node, Bridge.NAME.getName(), brIntId);
+            Set<String> dpids = bridge.getDatapath_id();
+            if (dpids == null || dpids.size() ==  0) return;
+            Long dpidLong = Long.valueOf(HexEncode.stringToLong((String)dpids.toArray()[0]));
+            Node ofNode = new Node(Node.NodeIDType.OPENFLOW, dpidLong);
+            IForwardingRulesManager frm = (IForwardingRulesManager) ServiceHelper.getInstance(
+                    IForwardingRulesManager.class, "default", this);
+            FlowConfig flow = new FlowConfig();
+            flow.setName("TepMatch"+tunnelOFPort+""+internalVlan+""+HexEncode.stringToLong(attachedMac));
+            flow.setNode(ofNode);
+            flow.setPriority("100");
+            flow.setDstMac(attachedMac);
+            flow.setIngressPort(tunnelOFPort+"");
+            List<String> actions = new ArrayList<String>();
+            actions.add(ActionType.SET_VLAN_ID+"="+internalVlan);
+            actions.add(ActionType.OUTPUT.toString()+"="+patchPort);
+            flow.setActions(actions);
+            Status status = frm.addStaticFlow(flow);
+            logger.debug("Local Ingress Flow Programming Status {} for Flow {} on {} / {}", status, flow, ofNode, node);
+        } catch (Exception e) {
+            logger.error("Failed to initialize Flow Rules for {}", node, e);
+        }
+    }
+
+    private void programRemoteEgressTunnelBridgeRules(Node node, int patchPort, String attachedMac,
+            int internalVlan, int tunnelOFPort) {
+        String brIntId = InternalNetworkManager.getManager().getInternalBridgeUUID(node, AdminConfigManager.getManager().getTunnelBridgeName());
+        if (brIntId == null) {
+            logger.error("Failed to initialize Flow Rules for {}", node);
+            return;
+        }
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            Bridge bridge = (Bridge) ovsdbTable.getRow(node, Bridge.NAME.getName(), brIntId);
+            Set<String> dpids = bridge.getDatapath_id();
+            if (dpids == null || dpids.size() ==  0) return;
+            Long dpidLong = Long.valueOf(HexEncode.stringToLong((String)dpids.toArray()[0]));
+            Node ofNode = new Node(Node.NodeIDType.OPENFLOW, dpidLong);
+            IForwardingRulesManager frm = (IForwardingRulesManager) ServiceHelper.getInstance(
+                    IForwardingRulesManager.class, "default", this);
+            FlowConfig flow = new FlowConfig();
+            flow.setName("TepMatch"+tunnelOFPort+""+internalVlan+""+HexEncode.stringToLong(attachedMac));
+            flow.setNode(ofNode);
+            flow.setPriority("100");
+            flow.setDstMac(attachedMac);
+            flow.setIngressPort(patchPort+"");
+            flow.setVlanId(internalVlan+"");
+            List<String> actions = new ArrayList<String>();
+            actions.add(ActionType.POP_VLAN.toString());
+            actions.add(ActionType.OUTPUT.toString()+"="+tunnelOFPort);
+            flow.setActions(actions);
+            Status status = frm.addStaticFlow(flow);
+            logger.debug("Remote Egress Flow Programming Status {} for Flow {} on {} / {}", status, flow, ofNode, node);
+        } catch (Exception e) {
+            logger.error("Failed to initialize Flow Rules for {}", node, e);
+        }
+    }
+
+    private void programTunnelRules (String tunnelType, String segmentationId, InetAddress dst, Node node,
+                                     Interface intf, boolean local) {
+        String networkId = TenantNetworkManager.getManager().getNetworkIdForSegmentationId(segmentationId);
+        if (networkId == null) {
+            logger.debug("Tenant Network not found with Segmenation-id {}",segmentationId);
+            return;
+        }
+        int internalVlan = TenantNetworkManager.getManager().getInternalVlan(networkId);
+        if (internalVlan == 0) {
+            logger.debug("No InternalVlan provisioned for Tenant Network {}",networkId);
+            return;
+        }
+        Map<String, String> externalIds = intf.getExternal_ids();
+        if (externalIds == null) {
+            logger.error("No external_ids seen in {}", intf);
+            return;
+        }
+
+        String attachedMac = externalIds.get(TenantNetworkManager.EXTERNAL_ID_VM_MAC);
+        if (attachedMac == null) {
+            logger.error("No AttachedMac seen in {}", intf);
+            return;
+        }
+        String patchInt = "";
+        if (local) {
+            patchInt = AdminConfigManager.getManager().getPatchToIntegration();
+        } else {
+            patchInt = AdminConfigManager.getManager().getPatchToTunnel();
+        }
+
+        int patchOFPort = -1;
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            Map<String, Table<?>> intfs = ovsdbTable.getRows(node, Interface.NAME.getName());
+            if (intfs != null) {
+                for (Table<?> row : intfs.values()) {
+                    Interface patchIntf = (Interface)row;
+                    if (patchIntf.getName().equalsIgnoreCase(patchInt)) {
+                        Set<BigInteger> of_ports = patchIntf.getOfport();
+                        if (of_ports == null || of_ports.size() <= 0) {
+                            logger.error("Could NOT Identified Patch port {} -> OF ({}) on {}", patchInt, node);
+                            continue;
+                        }
+                        patchOFPort = Long.valueOf(((BigInteger)of_ports.toArray()[0]).longValue()).intValue();
+                        logger.debug("Identified Patch port {} -> OF ({}) on {}", patchInt, patchOFPort, node);
+                        break;
+                    }
+                }
+                if (patchOFPort == -1) {
+                    logger.error("Cannot identify {} interface on {}", patchInt, node);
+                }
+                for (Table<?> row : intfs.values()) {
+                    Interface tunIntf = (Interface)row;
+                    if (tunIntf.getName().equals(this.getTunnelName(tunnelType, segmentationId, dst))) {
+                        Set<BigInteger> of_ports = tunIntf.getOfport();
+                        if (of_ports == null || of_ports.size() <= 0) {
+                            logger.error("Could NOT Identified Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), node);
+                            continue;
+                        }
+                        int tunnelOFPort = Long.valueOf(((BigInteger)of_ports.toArray()[0]).longValue()).intValue();
+                        logger.debug("Identified Tunnel port {} -> OF ({}) on {}", tunIntf.getName(), tunnelOFPort, node);
+
+                        if (local) {
+                            programLocalIngressTunnelBridgeRules(node, tunnelOFPort, attachedMac, internalVlan, patchOFPort);
+                        } else {
+                            programRemoteEgressTunnelBridgeRules(node, patchOFPort, attachedMac, internalVlan, tunnelOFPort);
+                        }
+                        return;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            logger.error("", e);
+        }
+    }
     @Override
-    public Status createTunnels(String tunnelType, String tunnelKey, Node srcNode) {
+    public Status createTunnels(String tunnelType, String tunnelKey, Node srcNode, Interface intf) {
         Status status = getTunnelReadinessStatus(srcNode, tunnelKey);
         if (!status.isSuccess()) return status;
 
@@ -70,12 +218,42 @@ class OF10ProviderManager extends ProviderNetworkManager {
             if (!status.isSuccess()) continue;
             InetAddress src = AdminConfigManager.getManager().getTunnelEndPoint(srcNode);
             InetAddress dst = AdminConfigManager.getManager().getTunnelEndPoint(dstNode);
-            addTunnelPort(srcNode, tunnelType, src, dst, tunnelKey);
+            status = addTunnelPort(srcNode, tunnelType, src, dst, tunnelKey);
+            if (status.isSuccess()) {
+                this.programTunnelRules(tunnelType, tunnelKey, dst, srcNode, intf, true);
+            }
             addTunnelPort(dstNode, tunnelType, dst, src, tunnelKey);
+            if (status.isSuccess()) {
+                this.programTunnelRules(tunnelType, tunnelKey, src, dstNode, intf, false);
+            }
         }
         return new Status(StatusCode.SUCCESS);
     }
 
+
+    private String getTunnelName(String tunnelType, String key, InetAddress dst) {
+        return tunnelType+"-"+key+"-"+dst.getHostAddress();
+    }
+
+    private Interface getTunnelInterface (Node node, String tunnelType, InetAddress dst, String key) {
+        try {
+            OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
+            String portName = getTunnelName(tunnelType, key, dst);
+
+            Map<String, Table<?>> tunIntfs = ovsdbTable.getRows(node, Interface.NAME.getName());
+            if (tunIntfs != null) {
+                for (Table<?> row : tunIntfs.values()) {
+                    Interface tunIntf = (Interface)row;
+                    if (tunIntf.getName().equals(portName)) return tunIntf;
+                }
+
+            }
+        } catch (Exception e) {
+            logger.error("", e);
+        }
+        return null;
+    }
+
     private boolean isTunnelPresent(Node node, String tunnelName, String bridgeUUID) throws Exception {
         OVSDBConfigService ovsdbTable = (OVSDBConfigService)ServiceHelper.getGlobalInstance(OVSDBConfigService.class, this);
         Bridge bridge = (Bridge)ovsdbTable.getRow(node, Bridge.NAME.getName(), bridgeUUID);
@@ -108,7 +286,7 @@ class OF10ProviderManager extends ProviderNetworkManager {
                 logger.error("Could not find Bridge {} in {}", tunnelBridgeName, node);
                 return new Status(StatusCode.NOTFOUND, "Could not find "+tunnelBridgeName+" in "+node);
             }
-            String portName = tunnelType+"-"+key+"-"+dst.getHostAddress();
+            String portName = getTunnelName(tunnelType, key, dst);
 
             if (this.isTunnelPresent(node, portName, bridgeUUID)) {
                 logger.trace("Tunnel {} is present in {} of {}", portName, tunnelBridgeName, node);
@@ -167,8 +345,8 @@ class OF10ProviderManager extends ProviderNetworkManager {
         IConnectionServiceInternal connectionService = (IConnectionServiceInternal)ServiceHelper.getGlobalInstance(IConnectionServiceInternal.class, this);
         List<Node> nodes = connectionService.getNodes();
         for (Node srcNode : nodes) {
-            this.createTunnels(tunnelType, tunnelKey, srcNode);
+            this.createTunnels(tunnelType, tunnelKey, srcNode, null);
         }
-        return null;
+        return new Status(StatusCode.SUCCESS);
     }
 }
index 5db85e327cb08c528fd0c2c87ef29e3f7ea8a299..f4ec73b51c7dc3bd9230ba3e144cc9885156bbcf 100644 (file)
@@ -2,6 +2,7 @@ package org.opendaylight.ovsdb.neutron.provider;
 
 import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.controller.sal.utils.Status;
+import org.opendaylight.ovsdb.lib.table.Interface;
 
 
 class OF13ProviderManager extends ProviderNetworkManager {
@@ -11,7 +12,7 @@ class OF13ProviderManager extends ProviderNetworkManager {
     }
 
     @Override
-    public Status createTunnels(String tunnelType, String tunnelKey, Node source) {
+    public Status createTunnels(String tunnelType, String tunnelKey, Node source, Interface intf) {
         // TODO Auto-generated method stub
         return null;
     }
index 09654fc457e7ff9aa3ada3b377d0b560528e1fb5..601a860339da1413ba23ee1386486e476d446259 100644 (file)
@@ -2,6 +2,7 @@ package org.opendaylight.ovsdb.neutron.provider;
 
 import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.controller.sal.utils.Status;
+import org.opendaylight.ovsdb.lib.table.Interface;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,5 +22,5 @@ public abstract class ProviderNetworkManager {
 
     public abstract boolean hasPerTenantTunneling();
     public abstract Status createTunnels(String tunnelType, String tunnelKey);
-    public abstract Status createTunnels(String tunnelType, String tunnelKey, Node source);
+    public abstract Status createTunnels(String tunnelType, String tunnelKey, Node source, Interface intf);
 }