Use neutron from new repo
[netvirt.git] / openstack / net-virt-providers / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / providers / openflow13 / OF13Provider.java
index 8e6d0f8ff90d21902d24983ae37ea1e795ea867e..f684fb2b7fcbe313e1dcb40d50ff9ddcbcfa6955 100644 (file)
@@ -21,8 +21,8 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
-import org.opendaylight.controller.networkconfig.neutron.NeutronSecurityGroup;
+import org.opendaylight.neutron.spi.NeutronNetwork;
+import org.opendaylight.neutron.spi.NeutronSecurityGroup;
 import org.opendaylight.controller.sal.core.Node;
 import org.opendaylight.controller.sal.utils.HexEncode;
 import org.opendaylight.controller.sal.utils.Status;
@@ -32,6 +32,7 @@ import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.openstack.netvirt.NetworkHandler;
 import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager;
 import org.opendaylight.ovsdb.openstack.netvirt.api.ClassifierProvider;
+import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService;
 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
 import org.opendaylight.ovsdb.openstack.netvirt.api.EgressAclProvider;
 import org.opendaylight.ovsdb.openstack.netvirt.api.IngressAclProvider;
@@ -109,7 +110,7 @@ public class OF13Provider implements NetworkingProvider {
     private static final String OPENFLOW = "openflow:";
     private static Long groupId = 1L;
 
-    private volatile org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService configurationService;
+    private volatile ConfigurationService configurationService;
     private volatile BridgeConfigurationManager bridgeConfigurationManager;
     private volatile TenantNetworkManager tenantNetworkManager;
     private volatile OvsdbConfigurationService ovsdbConfigurationService;
@@ -365,6 +366,7 @@ public class OF13Provider implements NetworkingProvider {
          */
 
         handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, true);
+        handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, true);
 
         /*
          * TODO : Optimize the following 2 writes to be restricted only for the very first port known in a segment.
@@ -429,6 +431,7 @@ public class OF13Provider implements NetworkingProvider {
          */
 
         handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, false);
+        handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, false);
     }
 
     private void programLocalIngressTunnelBridgeRules(Node node, Long dpid, String segmentationId, String attachedMac, long tunnelOFPort, long localPort) {
@@ -535,6 +538,7 @@ public class OF13Provider implements NetworkingProvider {
         /*
          * Table(0) Rule #1
          * ----------------
+         * Tag traffic coming from the local port and vm srcmac
          * Match: VM sMac and Local Ingress Port
          * Action: Set VLAN ID and GOTO Local Table 1
          */
@@ -546,6 +550,7 @@ public class OF13Provider implements NetworkingProvider {
         /*
          * Table(0) Rule #3
          * ----------------
+         * Drop all other traffic coming from the local port
          * Match: Drop any remaining Ingress Local VM Packets
          * Action: Drop w/ a low priority
          */
@@ -555,6 +560,7 @@ public class OF13Provider implements NetworkingProvider {
         /*
          * Table(2) Rule #1
          * ----------------
+         * Forward unicast traffic destined to the local port after stripping tag
          * Match: Match VLAN ID and Destination DL/dMAC Addr
          * Action: strip vlan, output to local port
          * Example: table=2,vlan_id=0x5,dl_dst=00:00:00:00:00:01 actions= strip vlan, output:2
@@ -572,8 +578,10 @@ public class OF13Provider implements NetworkingProvider {
          * actions= strip_vlan, output:2,3,4,5
          */
 
-        handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
-                localPort, true);
+        //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
+        //        localPort, ethPort, true);
+        //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, localPort, ethport, true);
 
         /*
          * Table(2) Rule #3
@@ -583,13 +591,12 @@ public class OF13Provider implements NetworkingProvider {
          * Example: table=2,priority=8192,vlan_id=0x5 actions=drop
          */
 
-        handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
-                true);
+        //handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
+        //        true);
     }
 
     private void removeLocalVlanRules(Node node, Long dpid,
-            String segmentationId, String attachedMac,
-            long localPort) {
+                                      String segmentationId, String attachedMac, long localPort) {
         /*
          * Table(0) Rule #1
          * ----------------
@@ -630,11 +637,15 @@ public class OF13Provider implements NetworkingProvider {
          * actions= strip_vlan, output:2,3,4,5
          */
 
-        handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
-                localPort, false);
+        //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
+        //        localPort, ethPort, false);
+        //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, localPort, false);
+
     }
 
-    private void programLocalIngressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) {
+    private void programLocalIngressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac,
+                                              long localPort, long ethPort) {
         /*
          * Table(0) Rule #2
          * ----------------
@@ -653,13 +664,27 @@ public class OF13Provider implements NetworkingProvider {
          * -------------------------------------------
          * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \
          * actions=output:10 (eth port),goto_table:2
+         * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4
          */
 
-        handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, true);
+        handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, true);
+
+        /*
+         * Table(1) Rule #2
+         * ----------------
+         * Match: Match VLAN ID and L2 ::::FF:FF Flooding
+         * Action: Flood to local and remote VLAN members
+         * -------------------------------------------
+         * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \
+         * actions=output:10 (eth port),goto_table:2
+         */
+
+        //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, ethPort, true);
     }
 
-    private void programRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) {
+    private void programRemoteEgressVlanRules(Node node, Long dpid, String segmentationId,
+                                              String attachedMac, long ethPort) {
         /*
          * Table(1) Rule #1
          * ----------------
@@ -670,8 +695,8 @@ public class OF13Provider implements NetworkingProvider {
          * actions=goto_table:2
          */
 
-        handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, attachedMac, true);
+        //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, ethPort, attachedMac, true);
 
         /*
          * Table(1) Rule #3
@@ -680,13 +705,14 @@ public class OF13Provider implements NetworkingProvider {
          * Action: Go to table 2
          * -------------------------------------------
          * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2
+         * table=110,priority=8192,dl_vlan=2001 actions=output:2
          */
 
-        handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, true);
+        handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, true);
     }
 
-    private void removeRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) {
+    private void removeRemoteEgressVlanRules(Node node, Long dpid, String segmentationId,
+                                             String attachedMac, long localPort, long ethPort) {
         /*
          * Table(1) Rule #1
          * ----------------
@@ -697,11 +723,24 @@ public class OF13Provider implements NetworkingProvider {
          * actions=goto_table:2
          */
 
-        handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, attachedMac, false);
+        //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, ethPort, attachedMac, false);
+
+        /*
+         * Table(1) Rule #2
+         * ----------------
+         * Match: Match VLAN ID and L2 ::::FF:FF Flooding
+         * Action: Flood to local and remote VLAN members
+         * -------------------------------------------
+         * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \
+         * actions=output:10 (eth port),goto_table:2
+         * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4
+         */
+
+        handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, false);
     }
 
-    private void removePerVlanRules(Node node, Long dpid, String segmentationId, long ethPort) {
+    private void removePerVlanRules(Node node, Long dpid, String segmentationId, long localPort, long ethPort) {
         /*
          * Table(2) Rule #3
          * ----------------
@@ -710,8 +749,7 @@ public class OF13Provider implements NetworkingProvider {
          * Example: table=2,priority=8192,vlan_id=0x5 actions=drop
          */
 
-        handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId,
-                false);
+        //handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, false);
 
         /*
          * Table(0) Rule #2
@@ -720,8 +758,20 @@ public class OF13Provider implements NetworkingProvider {
          * Action: GOTO Local Table 2
          */
 
-        handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, false);
+        handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, false);
+
+        /*
+         * Table(1) Rule #2
+         * ----------------
+         * Match: Match VLAN ID and L2 ::::FF:FF Flooding
+         * Action: Flood to local and remote VLAN members
+         * -------------------------------------------
+         * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \
+         * actions=output:10 (eth port),goto_table:2
+         * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4
+         */
+
+        //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, false);
 
         /*
          * Table(1) Rule #2
@@ -733,8 +783,8 @@ public class OF13Provider implements NetworkingProvider {
          * actions=output:10 (eth port),goto_table:2
          */
 
-        handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, false);
+        //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+        //        segmentationId, ethPort, false);
 
         /*
          * Table(1) Rule #3
@@ -743,11 +793,12 @@ public class OF13Provider implements NetworkingProvider {
          * Action: Go to table 2
          * -------------------------------------------
          * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2
+         * table=110,priority=8192,dl_vlan=2001 actions=output:2
          */
 
-        handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
-                segmentationId, ethPort, false);
+        handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, false);
     }
+
     private Long getDpid (Node node, String bridgeUuid) {
         Preconditions.checkNotNull(ovsdbConfigurationService);
         try {
@@ -1046,6 +1097,7 @@ public class OF13Provider implements NetworkingProvider {
                 logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node);
                 return;
             }
+            long localPort = (Long)of_ports.toArray()[0];
 
             Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
             if (externalIds == null) {
@@ -1086,9 +1138,9 @@ public class OF13Provider implements NetworkingProvider {
                             throw new Exception("port number < 0");
                         }
                         logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node);
-
+                        // TODO: add logic to only add rule on remote nodes
                         programRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort);
-                        programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort);
+                        programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort);
                         return;
                     }
                 }
@@ -1116,6 +1168,7 @@ public class OF13Provider implements NetworkingProvider {
                 logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node);
                 return;
             }
+            long localPort = (Long)of_ports.toArray()[0];
 
             Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
             if (externalIds == null) {
@@ -1148,9 +1201,9 @@ public class OF13Provider implements NetworkingProvider {
                         }
                         logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node);
 
-                        removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort);
+                        removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort);
                         if (isLastInstanceOnNode) {
-                            removePerVlanRules(node, dpid, network.getProviderSegmentationID(), ethOFPort);
+                            removePerVlanRules(node, dpid, network.getProviderSegmentationID(), localPort, ethOFPort);
                         }
                         return;
                     }
@@ -1175,13 +1228,20 @@ public class OF13Provider implements NetworkingProvider {
             for (Node dstNode : nodes) {
                 InetAddress src = configurationService.getTunnelEndPoint(srcNode);
                 InetAddress dst = configurationService.getTunnelEndPoint(dstNode);
-                Status status = addTunnelPort(srcNode, network.getProviderNetworkType(), src, dst);
-                if (status.isSuccess()) {
-                    this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), dst, srcNode, intf, true);
-                }
-                addTunnelPort(dstNode, network.getProviderNetworkType(), dst, src);
-                if (status.isSuccess()) {
-                    this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), src, dstNode, intf, false);
+                if ((src != null) && (dst != null)) {
+                    Status status = addTunnelPort(srcNode, network.getProviderNetworkType(), src, dst);
+                    if (status.isSuccess()) {
+                        this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), dst, srcNode, intf, true);
+                    }
+                    addTunnelPort(dstNode, network.getProviderNetworkType(), dst, src);
+                    if (status.isSuccess()) {
+                        this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), src, dstNode, intf, false);
+                    }
+                } else {
+                    logger.warn("Tunnel end-point configuration missing. Please configure it in OpenVSwitch Table. " +
+                            "Check source {} or destination {}",
+                            src != null ? src.getHostAddress() : "null",
+                            dst != null ? dst.getHostAddress() : "null");
                 }
             }
         }
@@ -1252,12 +1312,19 @@ public class OF13Provider implements NetworkingProvider {
                 for (Node dstNode : nodes) {
                     InetAddress src = configurationService.getTunnelEndPoint(srcNode);
                     InetAddress dst = configurationService.getTunnelEndPoint(dstNode);
-                    logger.info("Remove tunnel rules for interface " + intf.getName() + " on srcNode " + srcNode.getNodeIDString());
-                    this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(),
-                            dst, srcNode, intf, true, isLastInstanceOnNode);
-                    logger.info("Remove tunnel rules for interface " + intf.getName() + " on dstNode " + dstNode.getNodeIDString());
-                    this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(),
-                            src, dstNode, intf, false, isLastInstanceOnNode);
+                    if ((src != null) && (dst != null)) {
+                        logger.info("Remove tunnel rules for interface " + intf.getName() + " on srcNode " + srcNode.getNodeIDString());
+                        this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(),
+                                dst, srcNode, intf, true, isLastInstanceOnNode);
+                        logger.info("Remove tunnel rules for interface " + intf.getName() + " on dstNode " + dstNode.getNodeIDString());
+                        this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(),
+                                src, dstNode, intf, false, isLastInstanceOnNode);
+                    } else {
+                        logger.warn("Tunnel end-point configuration missing. Please configure it in OpenVSwitch Table. ",
+                                "Check source {} or destination {}",
+                                src != null ? src.getHostAddress() : "null",
+                                dst != null ? dst.getHostAddress() : "null");
+                    }
                 }
             }
         }
@@ -1331,7 +1398,7 @@ public class OF13Provider implements NetworkingProvider {
         List<Instruction> instructions = Lists.newArrayList();
 
         // Call the InstructionBuilder Methods Containing Actions
-        InstructionUtils.createNormalInstructions(ib);
+        InstructionUtils.createNormalInstructions(nodeName, ib);
         ib.setOrder(0);
         ib.setKey(new InstructionKey(0));
         instructions.add(ib.build());
@@ -1474,8 +1541,8 @@ public class OF13Provider implements NetworkingProvider {
 
     private void handleVlanFloodOut(Long dpidLong, Short writeTable,
             Short localTable, String segmentationId,
-            Long ethPort, boolean write) {
-        l2ForwardingProvider.programVlanFloodOut(dpidLong, segmentationId, ethPort, write);
+            Long localPort, Long ethPort, boolean write) {
+        //l2ForwardingProvider.programVlanFloodOut(dpidLong, segmentationId, localPort, ethPort, write);
     }
 
     /*
@@ -1497,6 +1564,7 @@ public class OF13Provider implements NetworkingProvider {
      * Match: Vlan ID
      * Action: Output port eth interface
      * table=1,priority=8192,vlan_id=0x5 actions= output port:eth1
+     * table=110,priority=8192,dl_vlan=2001 actions=output:2
      */
 
     private void handleVlanMiss(Long dpidLong, Short writeTable,
@@ -1549,12 +1617,12 @@ public class OF13Provider implements NetworkingProvider {
      * Match: vlan ID and dMAC (::::FF:FF)
      * table=2,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \
      * actions=strip_vlan, output:2,3,4,5
+     * table=110,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4
      */
 
-    private void handleLocalVlanBcastOut(Long dpidLong, Short writeTable,
-            String segmentationId, Long localPort,
-            boolean write) {
-        l2ForwardingProvider.programLocalVlanBcastOut(dpidLong, segmentationId, localPort, write);
+    private void handleLocalVlanBcastOut(Long dpidLong, Short writeTable, String segmentationId,
+                                         Long localPort, Long ethPort, boolean write) {
+        l2ForwardingProvider.programLocalVlanBcastOut(dpidLong, segmentationId, localPort, ethPort, write);
     }
 
     /*