support to get fib service in vpn manager 61/20361/2
authorSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Thu, 14 May 2015 11:08:08 +0000 (16:38 +0530)
committerSasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
Thu, 14 May 2015 11:23:29 +0000 (16:53 +0530)
Change-Id: I4198abf8edee93999a073e0364cdffa840662dba
Signed-off-by: Sasidharan Sambasivam <sasidharan.s.sambasivam@ericsson.com>
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java
vpnmanager/vpnmanager-api/pom.xml
vpnmanager/vpnmanager-api/src/main/java/org/opendaylight/vpnmanager/api/IVpnManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java

index bb16187c2bd507dc420ab78e69fe711d0318d98f..15ea7db36dcb5e707c72db09b49e21cc9d3755d6 100644 (file)
@@ -55,6 +55,7 @@ public class FibManagerProvider implements BindingAwareProvider, IFibManager, Au
 
   public void setVpnmanager(IVpnManager vpnmanager) {
     this.vpnmanager = vpnmanager;
+    vpnmanager.setFibService(this);
   }
 
   @Override
index 1f9f1584bc9471215eb9c78c147c2f20699ec296..89679c135930c40214699368bc57da591604fe0e 100644 (file)
@@ -61,6 +61,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>model-bgp</artifactId>
       <version>${model.bgp.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>fibmanager-api</artifactId>
+      <version>${vpnservices.version}</version>
+    </dependency>
     <dependency>
         <groupId>org.opendaylight.controller</groupId>
         <artifactId>config-api</artifactId>
index 3748ec13e26034a56bd762ea172c877dc9206785..56e7c7e45661b3121620f7dbab5fce2c0ffb0ad4 100644 (file)
@@ -2,6 +2,9 @@ package org.opendaylight.vpnmanager.api;
 
 import java.util.Collection;
 
+import org.opendaylight.fibmanager.api.IFibManager;
+
 public interface IVpnManager {
     Collection<Long> getDpnsForVpn(long vpnId);
+    void setFibService(IFibManager fibManager);
 }
index 69c190ff8bebea9f7261528d34d51abd464d0b43..beb17f352462c4593afe57f129f832cfd8fef23b 100644 (file)
@@ -7,4 +7,5 @@ public class VpnConstants {
     public static final short LPORT_INGRESS_TABLE = 0;
     public static final short FIB_TABLE = 21;
     public static final short DEFAULT_FLOW_PRIORITY = 10;
+    public static final long INVALID_ID = -1;
 }
index 4dce70d24bd370fa4f73f9debe5fe20b9fd54676..fa81708e6e4208cb57d966e446febf58445a1bbd 100644 (file)
@@ -26,6 +26,7 @@ import com.google.common.util.concurrent.FutureCallback;
 import org.opendaylight.bgpmanager.api.IBgpManager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.fibmanager.api.IFibManager;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.mdsalutil.FlowEntity;
 import org.opendaylight.vpnservice.mdsalutil.InstructionInfo;
@@ -73,6 +74,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private ListenerRegistration<DataChangeListener> listenerRegistration;
     private final DataBroker broker;
     private final IBgpManager bgpManager;
+    private IFibManager fibManager;
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
     private IdManagerService idManager;
@@ -113,6 +115,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         this.interfaceManager = interfaceManager;
     }
 
+    public void setFibManager(IFibManager fibManager) {
+        this.fibManager = fibManager;
+    }
+
     public void setIdManager(IdManagerService idManager) {
         this.idManager = idManager;
     }
@@ -157,7 +163,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Optional<Interface> port = read(LogicalDatastoreType.CONFIGURATION, id);
         if (port.isPresent()) {
             Interface interf = port.get();
-            bindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName()));
+            bindServiceOnInterface(interf, vpnInterface.getVpnInstanceName());
             updateNextHops(identifier, vpnInterface);
         }
     }
@@ -222,8 +228,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         InstanceIdentifier<VpnInstance1> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).augmentation(VpnInstance1.class).build();
         Optional<VpnInstance1> vpnInstance = read(LogicalDatastoreType.OPERATIONAL, id);
-        //TODO: Default vpnid should be a constant.
-        long vpnId = -1;
+
+        long vpnId = VpnConstants.INVALID_ID;
         if(vpnInstance.isPresent()) {
             vpnId = vpnInstance.get().getVpnId();
         }
@@ -243,14 +249,14 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         return rd;
     }
 
-    private synchronized void updateMappingDbs(long vpnId, long dpnId, String intfName) {
+    private synchronized void updateMappingDbs(long vpnId, long dpnId, String intfName, String rd) {
         Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
         if(dpnIds == null) {
             dpnIds = new HashSet<>();
         }
         if(dpnIds.add(dpnId)) {
             vpnToDpnsDb.put(vpnId, dpnIds);
-            //TODO: Send an Event that new DPN added...
+            fibManager.populateFibOnNewDpn(dpnId, vpnId, rd);
         }
 
         Collection<String> intfNames = dpnToInterfaceDb.get(dpnId);
@@ -261,13 +267,14 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         dpnToInterfaceDb.put(dpnId, intfNames);
     }
 
-    private synchronized void remoteFromMappingDbs(long vpnId, long dpnId, String inftName) {
+    private synchronized void remoteFromMappingDbs(long vpnId, long dpnId, String inftName, String rd) {
         Collection<String> intfNames = dpnToInterfaceDb.get(dpnId);
         if(intfNames == null) {
             return;
         }
         intfNames.remove(inftName);
         dpnToInterfaceDb.put(dpnId, intfNames);
+        //TODO: Delay 'DPN' removal so that other services can cleanup the entries for this dpn
         if(intfNames.isEmpty()) {
             Collection<Long> dpnIds = vpnToDpnsDb.get(vpnId);
             if(dpnIds == null) {
@@ -275,18 +282,21 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             }
             dpnIds.remove(dpnId);
             vpnToDpnsDb.put(vpnId, dpnIds);
+            fibManager.cleanUpDpnForVpn(dpnId, vpnId, rd);
         }
     }
 
-    private void bindServiceOnInterface(Interface intf, long vpnId) {
-        LOG.trace("Bind service on interface {} for VPN: {}", intf, vpnId);
+    private void bindServiceOnInterface(Interface intf, String vpnName) {
+        LOG.trace("Bind service on interface {} for VPN: {}", intf, vpnName);
 
+        long vpnId = getVpnId(vpnName);
         long dpId = interfaceManager.getDpnForInterface(intf.getName()); 
         if(dpId == 0L) {
             LOG.warn("DPN for interface {} not found. Bind service on this interface aborted.", intf.getName());
             return;
         } else {
-            updateMappingDbs(vpnId, dpId, intf.getName());
+            String rd = getRouteDistinguisher(vpnName);
+            updateMappingDbs(vpnId, dpId, intf.getName(), rd);
         }
 
         long portNo = interfaceManager.getPortForInterface(intf.getName());
@@ -358,7 +368,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         if (port.isPresent()) {
             Interface interf = port.get();
             removeNextHops(identifier, vpnInterface);
-            unbindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName()));
+            unbindServiceOnInterface(interf, vpnInterface.getVpnInstanceName());
+            //InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
+            delete(LogicalDatastoreType.OPERATIONAL, identifier);
         } else {
             LOG.warn("No nexthops were available to handle remove event {}", interfaceName);
         }
@@ -380,8 +392,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 }
             }
         }
-        InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
-        delete(LogicalDatastoreType.OPERATIONAL, interfaceId);
+//        InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
+//        delete(LogicalDatastoreType.OPERATIONAL, interfaceId);
     }
 
     private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
@@ -390,15 +402,17 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Futures.addCallback(tx.submit(), DEFAULT_CALLBACK);
     }
 
-    private void unbindServiceOnInterface(Interface intf, long vpnId) {
-        LOG.trace("Unbind service on interface {} for VPN: {}", intf, vpnId);
+    private void unbindServiceOnInterface(Interface intf, String vpnName) {
+        LOG.trace("Unbind service on interface {} for VPN: {}", intf, vpnName);
 
+        long vpnId = getVpnId(vpnName);
         long dpId = interfaceManager.getDpnForInterface(intf.getName());
         if(dpId == 0L) {
             LOG.warn("DPN for interface {} not found. Unbind service on this interface aborted.", intf.getName());
             return;
         } else {
-            remoteFromMappingDbs(vpnId, dpId, intf.getName());
+            String rd = getRouteDistinguisher(vpnName);
+            remoteFromMappingDbs(vpnId, dpId, intf.getName(), rd);
         }
 
         long portNo = interfaceManager.getPortForInterface(intf.getName());
index 28c387d3e0e194ef0db09eb8f13484ed1078ded2..e4d6e8970bfad95ad640a91c5e5bdfedf7bcdd08 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.bgpmanager.api.IBgpManager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.fibmanager.api.IFibManager;
 import org.opendaylight.vpnmanager.api.IVpnManager;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
@@ -34,6 +35,7 @@ public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
     private VpnInterfaceManager vpnInterfaceManager;
     private VpnManager vpnManager;
     private IBgpManager bgpManager;
+    private IFibManager fibManager;
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
     private IdManagerService idManager;
@@ -64,6 +66,10 @@ public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
         this.mdsalManager = mdsalManager;
     }
 
+    public void setFibManager(IFibManager fibManager) {
+        this.fibManager = fibManager;
+    }
+
     public void setInterfaceManager(IInterfaceManager interfaceManager) {
         this.interfaceManager = interfaceManager;
     }
@@ -98,4 +104,11 @@ public class VpnserviceProvider implements BindingAwareProvider, IVpnManager,
     public Collection<Long> getDpnsForVpn(long vpnId) {
         return vpnInterfaceManager.getDpnsForVpn(vpnId);
     }
+
+    @Override
+    public void setFibService(IFibManager fibManager) {
+        LOG.debug("Fib service reference is initialized in VPN Manager");
+        this.fibManager = fibManager;
+        vpnInterfaceManager.setFibManager(fibManager);
+    }
 }