Implementing VNI generation for VBD 45/40445/4
authorMichal Cmarada <mcmarada@cisco.com>
Thu, 16 Jun 2016 16:34:40 +0000 (18:34 +0200)
committerMartin Sunal <msunal@cisco.com>
Fri, 17 Jun 2016 08:20:11 +0000 (10:20 +0200)
Change-Id: Id79cb9442f58761c957914cc8448883d32ebccf3
Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
Signed-off-by: Martin Sunal <msunal@cisco.com>
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/api/BridgeDomainManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/listener/VppNodeListener.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/BridgeDomainManagerImpl.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManager.java

index bbb3a6d418dc91586d9309ac02ec1b991d593e10..1fd983930e4727e7f20bff318c3c305101d61db8 100644 (file)
@@ -30,7 +30,7 @@ public interface BridgeDomainManager {
      * @param vppNodeId VPP node where the bridge domain should be created
      * @return {@link ListenableFuture}
      */
-    ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, VxlanVni vni, @Nonnull NodeId vppNodeId);
+    ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, @Nonnull VxlanVni vni, @Nonnull NodeId vppNodeId);
 
     /**
      * Creates a bridge domain on VPP node and it also adds tunnels of the bridge domain to VLAN
index 086b51953249c43a10d37a309ed0eeb21fb586d7..7eeb356530e7d5c6015c793669b322c1ed83c469 100644 (file)
@@ -21,7 +21,9 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.NodeOperEvent;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.manager.VppNodeManager;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -34,6 +36,7 @@ import com.google.common.eventbus.EventBus;
 public class VppNodeListener implements DataTreeChangeListener<Node>, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(VppNodeListener.class);
+    private static final TopologyId TOPOLOGY_NETCONF = new TopologyId("topology-netconf");
 
     private final ListenerRegistration<VppNodeListener> listenerRegistration;
     private final VppNodeManager nodeManager;
@@ -44,7 +47,10 @@ public class VppNodeListener implements DataTreeChangeListener<Node>, AutoClosea
         this.eventBus = Preconditions.checkNotNull(eventBus);
         // Register listener
         final DataTreeIdentifier<Node> networkTopologyPath = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).child(Node.class).build());
+                InstanceIdentifier.builder(NetworkTopology.class)
+                    .child(Topology.class, new TopologyKey(TOPOLOGY_NETCONF))
+                    .child(Node.class)
+                    .build());
         listenerRegistration =
                 Preconditions.checkNotNull(dataBroker.registerDataTreeChangeListener(networkTopologyPath, this));
         LOG.info("Network-Topology VppNodelistener registered");
index d573246a5ba1f1d37ce1569b87b070a37742f88e..def9b7bb12e015df86341144cd6af7aab7bffe2c 100644 (file)
@@ -130,8 +130,8 @@ public class BridgeDomainManagerImpl implements BridgeDomainManager {
     }
 
     @Override
-    public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, VxlanVni vni,
-            @Nonnull NodeId vppNodeId) {
+    public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
+            @Nonnull VxlanVni vni, @Nonnull NodeId vppNodeId) {
         TopologyVbridgeAugment topoAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVxlan.class)
             .setArpTermination(false)
             .setFlood(true)
index ba98eae0b3b649ec050057b8bf7d8d2b7300bbd9..fc8dd52d8f420fa057cbec4dc3a10cded030a3a5 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -54,6 +56,8 @@ public final class ForwardingManager {
     private static final Logger LOG = LoggerFactory.getLogger(ForwardingManager.class);
     @VisibleForTesting
     static long WAIT_FOR_BD_CREATION = 10; // seconds
+    private long lastVxlanVni = 1L;
+    private final Map<String, VxlanVni> vxlanVniByBridgeDomain = new HashMap<>();
     private final InterfaceManager ifaceManager;
     private final BridgeDomainManager bdManager;
     private final DataBroker dataBroker;
@@ -80,7 +84,12 @@ public final class ForwardingManager {
                     createVlanBridgeDomains(bd, bdConfig.get().getVlan(), vppNodes);
                 }
             } else {
-                createVxlanBridgeDomains(bd, null, vppNodes);
+                VxlanVni vxlanVni = vxlanVniByBridgeDomain.get(bd);
+                if (vxlanVni == null) {
+                    vxlanVni = new VxlanVni(lastVxlanVni++);
+                    vxlanVniByBridgeDomain.put(bd, vxlanVni);
+                }
+                createVxlanBridgeDomains(bd, vxlanVni, vppNodes);
             }
         }
     }