Bug 5054: Fix for switch restart 58/34058/2
authorDeepthi V V <deepthi.v.v@ericsson.com>
Wed, 3 Feb 2016 13:35:03 +0000 (19:05 +0530)
committerDeepthi V V <deepthi.v.v@ericsson.com>
Fri, 5 Feb 2016 06:59:49 +0000 (06:59 +0000)
- Fix switch retsart issue
- Fix tunnel events issue

Change-Id: Idc2f7de66700b6d3584e1a68f9ded85be2bd0699
Signed-off-by: Deepthi V V <deepthi.v.v@ericsson.com>
(cherry picked from commit 753c24f1160e84011934b94c4ea727efb5d8d061)

12 files changed:
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibUtil.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java
itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/NwConstants.java
vpnmanager/vpnmanager-api/src/main/yang/odl-l3vpn.yang
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/InterfaceStateChangeListener.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java
vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java

index 80500315315a38b9a18cd35d8a9d87daeb78c56e..62b60ca8c1783aa7516ba633b5ee2e06591fbc9a 100644 (file)
@@ -41,6 +41,7 @@ import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
 import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil;
 import org.opendaylight.vpnservice.mdsalutil.NwConstants;
 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.OpState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.PrefixToInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnToExtraroute;
@@ -275,6 +276,7 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
 
   public BigInteger deleteLocalFibEntry(Long vpnId, String rd, VrfEntry vrfEntry) {
     BigInteger localDpnId = BigInteger.ZERO;
+    boolean isExtraRoute = false;
     VpnNexthop localNextHopInfo = nextHopManager.getVpnNexthop(vpnId, vrfEntry.getDestPrefix());
     String localNextHopIP = vrfEntry.getDestPrefix();
 
@@ -284,13 +286,17 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
         if (extra_route != null) {
             localNextHopInfo = nextHopManager.getVpnNexthop(vpnId, extra_route.getNexthopIp());
             localNextHopIP = extra_route.getNexthopIp() + "/32";
+            isExtraRoute = true;
         }
     }
 
 
     if(localNextHopInfo != null) {
       localDpnId = localNextHopInfo.getDpnId();
-      //if (getPrefixToInterface(vpnId, (staticRoute == true) ? extra_route.getNextHopAddress() + "/32" : vrfEntry.getDestPrefix()) == null)
+      Prefixes prefix = getPrefixToInterface(vpnId, isExtraRoute ? localNextHopIP : vrfEntry.getDestPrefix());
+      Optional<OpState> opStateData = FibUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                                                            FibUtil.getVpnInterfaceOpStateIdentifier(prefix.getVpnInterfaceName()));
+      if(opStateData.isPresent() && !opStateData.get().isStateUp())
       {
         makeConnectedRoute(localDpnId, vpnId, vrfEntry, rd, null /* invalid */,
                            NwConstants.DEL_FLOW);
@@ -423,8 +429,10 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
             if (vpnInterfaces.remove(currVpnInterface)) {
                 if (vpnInterfaces.isEmpty()) {
                     //FibUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, id);
+                  LOG.trace("cleanUpOpDataForFib: cleanUpDpnForVpn: {}, {}", dpnId, vpnId);
                     cleanUpDpnForVpn(dpnId, vpnId, rd);
                 } else {
+                  LOG.trace("cleanUpOpDataForFib: delete interface: {} on {}", intfName, dpnId);
                     FibUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, id.child(
                             org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data
                                     .vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces.class,
@@ -457,12 +465,14 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
       if (optAdjacencies.isPresent()) {
           numAdj = optAdjacencies.get().getAdjacency().size();
       }
+      LOG.trace("cleanUpOpDataForFib: remove adjacency for prefix: {} {}", vpnId, vrfEntry.getDestPrefix());
       //remove adjacency corr to prefix
       FibUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, FibUtil.getAdjacencyIdentifier(ifName, vrfEntry.getDestPrefix()));
 
       if((numAdj - 1) == 0) { //there are no adjacencies left for this vpn interface, clean up
         //clean up the vpn interface from DpnToVpn list
           delIntfFromDpnToVpnList(vpnId, prefixInfo.getDpnId(), ifName, rd);
+        LOG.trace("cleanUpOpDataForFib: Delete prefix to interface and vpnInterface ");
           FibUtil.delete(broker, LogicalDatastoreType.OPERATIONAL,
                   FibUtil.getPrefixToInterfaceIdentifier(
                           vpnId,
index 273d648114a5dc29700be3c072522ca1bb50cb50..69c73e10915828f9e05f05ef088f11b4848e9be9 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.OpState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
@@ -88,6 +89,13 @@ public class FibUtil {
                 .child(org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface.class, new org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey(vpnInterfaceName)).build();
     }
 
+    static InstanceIdentifier<OpState> getVpnInterfaceOpStateIdentifier(String vpnInterfaceName) {
+        return InstanceIdentifier.builder(org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces.class)
+            .child(org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface.class,
+                   new org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey(vpnInterfaceName))
+            .augmentation(OpState.class).build();
+    }
+
     static InstanceIdentifier<VpnToDpnList> getVpnToDpnListIdentifier(String rd, BigInteger dpnId) {
         return InstanceIdentifier.builder(org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstanceOpData.class)
                 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey(rd))
index 1ceaa17152689c1366640fe130d5d3382273884d..a8e2d6ed01de01b266e0a7a7e7a620199acd39d9 100644 (file)
@@ -205,6 +205,7 @@ public class OvsInterfaceConfigAddHelper {
         InterfaceBuilder ifaceBuilder = new InterfaceBuilder();
         if (!interfaceNew.isEnabled() && ifState.getOperStatus() != OperStatus.Down) {
             ifaceBuilder.setOperStatus(OperStatus.Down);
+            ifaceBuilder.setType(interfaceNew.getType());
             ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceNew.getName()));
             transaction.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build());
         }
index e14633413ea1a6cb3c912007b7ad6221ecf5418b..d7fc08795dc949ef05fd44624d65f6fa16030f79 100644 (file)
@@ -89,6 +89,9 @@ public class OvsInterfaceStateAddHelper {
         InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setOperStatus(operStatus)
                 .setAdminStatus(adminStatus).setPhysAddress(physAddress).setIfIndex(ifIndex).setLowerLayerIf(lowerLayerIfList)
                 .setKey(IfmUtil.getStateInterfaceKeyFromName(portName));
+        if(iface != null) {
+            ifaceBuilder.setType(iface.getType());
+        }
         transaction.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true);
 
         // allocate lport tag and set in if-index
@@ -154,7 +157,7 @@ public class OvsInterfaceStateAddHelper {
             ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, ifaceChild.getName());
             InterfaceBuilder childIfaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus).setOperStatus(operStatus)
                     .setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList).setIfIndex(ifIndex);
-            childIfaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceChild.getName()));
+            childIfaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceChild.getName())).setType(ifaceChild.getType());
             transaction.put(LogicalDatastoreType.OPERATIONAL, ifChildStateId, childIfaceBuilder.build(), true);
 
             // create lportTag Interface Map
index 4b626cf648f45fe356e7f2bc6494588839514947..168188648eb08d924b2e10523a43f17eb9b867bb 100644 (file)
@@ -122,7 +122,7 @@ public class StateInterfaceTest {
         ifaceBuilder.setOperStatus(OperStatus.Up).setAdminStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up)
                 .setPhysAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA"))
                 .setIfIndex(100)
-                .setLowerLayerIf(lowerLayerIfList);
+                .setLowerLayerIf(lowerLayerIfList).setType(L2vlan.class);
         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(InterfaceManagerTestUtil.interfaceName));
 
         stateInterface = ifaceBuilder.build();
index 469ac2a5c14de190f6ae65be0902e115d7b43913..cd460f228bb7aa35afb461181e8875dbe3977ce4 100644 (file)
@@ -145,6 +145,7 @@ public class VlanInterfaceConfigurationTest {
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder();
         ifaceBuilder.setOperStatus(OperStatus.Down);
         ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(vlanInterfaceEnabled.getName()));
+        ifaceBuilder.setType(L2vlan.class);
         stateInterface = ifaceBuilder.build();
 
         addHelper.addConfiguration(dataBroker, null, vlanInterfaceDisabled, idManager,
index 69aa9044e265da50b869d16d0b54579f019f52e7..36ad7a41f63afbdad800aca54cfc7fa64f167568 100644 (file)
@@ -297,45 +297,47 @@ public class ItmManagerRpcService implements ItmRpcService {
     @Override
     public Future<RpcResult<GetInternalOrExternalInterfaceNameOutput>> getInternalOrExternalInterfaceName(
        GetInternalOrExternalInterfaceNameInput input) {
-       RpcResultBuilder<GetInternalOrExternalInterfaceNameOutput> resultBld = null;
+       RpcResultBuilder<GetInternalOrExternalInterfaceNameOutput> resultBld = RpcResultBuilder.failed();
        BigInteger srcDpn = input.getSourceDpid() ;
        IpAddress dstIp = input.getDestinationIp() ;
-       List<DPNTEPsInfo> meshedDpnList = ItmUtils.getTunnelMeshInfo(dataBroker) ;
-       // Look for external tunnels if not look for internal tunnel
-       for( DPNTEPsInfo teps : meshedDpnList) {
-           TunnelEndPoints firstEndPt = teps.getTunnelEndPoints().get(0) ;
-           if( dstIp.equals(firstEndPt.getIpAddress())) {
-              InstanceIdentifier<InternalTunnel> path = InstanceIdentifier.create(
-                       TunnelList.class)
-                           .child(InternalTunnel.class, new InternalTunnelKey(srcDpn, teps.getDPNID()));      
-               
-               Optional<InternalTunnel> tnl = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker);
-               if( tnl != null && tnl.isPresent())
-               {
-                    InternalTunnel tunnel = tnl.get();
-                    GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(tunnel.getTunnelInterfaceName() );
-                    resultBld = RpcResultBuilder.success();
-                    resultBld.withResult(output.build()) ;
-               }else {
-                   //resultBld = RpcResultBuilder.failed();
-                   InstanceIdentifier<ExternalTunnel> path1 = InstanceIdentifier.create(
-                           ExternalTunnelList.class)
-                               .child(ExternalTunnel.class, new ExternalTunnelKey(dstIp, srcDpn));      
-                   
-                   Optional<ExternalTunnel> ext = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path1, dataBroker);
-
-                   if( ext != null && ext.isPresent())
-                   {
-                        ExternalTunnel extTunnel = ext.get();
-                        GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(extTunnel.getTunnelInterfaceName() );
-                        resultBld = RpcResultBuilder.success();
-                        resultBld.withResult(output.build()) ;
-                   }else {
-                       resultBld = RpcResultBuilder.failed();
-                   }
-               }
-           }
-       }
+      InstanceIdentifier<ExternalTunnel> path1 = InstanceIdentifier.create(
+          ExternalTunnelList.class)
+          .child(ExternalTunnel.class, new ExternalTunnelKey(dstIp, srcDpn));
+
+      Optional<ExternalTunnel> ext = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path1, dataBroker);
+
+      if( ext != null && ext.isPresent())
+      {
+        ExternalTunnel extTunnel = ext.get();
+        GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(extTunnel.getTunnelInterfaceName() );
+        resultBld = RpcResultBuilder.success();
+        resultBld.withResult(output.build()) ;
+      } else {
+        List<DPNTEPsInfo> meshedDpnList = ItmUtils.getTunnelMeshInfo(dataBroker);
+        // Look for external tunnels if not look for internal tunnel
+        for (DPNTEPsInfo teps : meshedDpnList) {
+          TunnelEndPoints firstEndPt = teps.getTunnelEndPoints().get(0);
+          if (dstIp.equals(firstEndPt.getIpAddress())) {
+            InstanceIdentifier<InternalTunnel> path = InstanceIdentifier.create(
+                TunnelList.class)
+                .child(InternalTunnel.class, new InternalTunnelKey(srcDpn, teps.getDPNID()));
+
+            Optional<InternalTunnel>
+                tnl =
+                ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker);
+            if (tnl != null && tnl.isPresent()) {
+              InternalTunnel tunnel = tnl.get();
+              GetInternalOrExternalInterfaceNameOutputBuilder
+                  output =
+                  new GetInternalOrExternalInterfaceNameOutputBuilder()
+                      .setInterfaceName(tunnel.getTunnelInterfaceName());
+              resultBld = RpcResultBuilder.success();
+              resultBld.withResult(output.build());
+              break;
+            }
+          }
+        }
+      }
        return Futures.immediateFuture(resultBld.build());
     }
 
index 56df83530ecc42c3391b3f9d444909d60a465686..ead21fd4e0e5e34da728896116be1e7cc245159a 100644 (file)
@@ -50,6 +50,6 @@ public class NwConstants {
     public static final short LPORT_DISPATCHER_TABLE = 30;
     public static final short VLAN_INTERFACE_INGRESS_TABLE = 0;
     public static final short INTERNAL_TUNNEL_TABLE = 36;
-    public static final short EXTERNAL_TUNNEL_TABLE = 38;
+    public static final short EXTERNAL_TUNNEL_TABLE = 36;
 
  }
\ No newline at end of file
index 4beb21ec9eb1b94d90bf637942dfae750f50c8d0..93d25bdf59b15a146ba5a795abf8131b7511359e 100644 (file)
@@ -30,6 +30,11 @@ module odl-l3vpn {
         uses adjacency-list;
     }
 
+    augment "/l3vpn:vpn-interfaces/l3vpn:vpn-interface" {
+        ext:augment-identifier "opState";
+        leaf stateUp {type boolean; config false;}
+    }
+
     /* Operational DS containers for reverse lookups*/
     container prefix-to-interface {
         config false;
index 206f884a3c6dcfb56bbd25669cd6e9c9bb33d7f2..f4adb4c55f3d0bd83e73dda8ea6086c8b4921a31 100644 (file)
@@ -101,14 +101,10 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
       try {
         String interfaceName = intrf.getName();
         LOG.info("Received port DOWN event for interface {} ", interfaceName);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface
-            intf = InterfaceUtils.getInterface(broker, interfaceName);
         BigInteger dpId = InterfaceUtils.getDpIdFromInterface(intrf);
-        if (intf != null && intf.getType().equals(Tunnel.class)) {
-          if(intrf.getOperStatus().equals(Interface.OperStatus.Down)) {
-            //withdraw all prefixes in all vpns for this dpn from bgp
-            vpnInterfaceManager.updatePrefixesForDPN(dpId, VpnInterfaceManager.UpdateRouteAction.WITHDRAW_ROUTE);
-          }
+        if (intrf != null && intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
+          //withdraw all prefixes in all vpns for this dpn from bgp
+          vpnInterfaceManager.updatePrefixesForDPN(dpId, VpnInterfaceManager.UpdateRouteAction.WITHDRAW_ROUTE);
         } else {
           if (VpnUtil.isVpnInterfaceConfigured(broker, interfaceName)) {
             vpnInterfaceManager.processVpnInterfaceDown(dpId, interfaceName, intrf.getIfIndex(), true);
index d4dd28813275770c4469305e425fc7ca74e2377a..66e24e132b8f94b01d231c7fcd268e734f8a904c 100644 (file)
@@ -17,6 +17,8 @@ import org.opendaylight.controller.md.sal.binding.api.*;
 import org.opendaylight.vpnservice.mdsalutil.*;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.OpState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.OpStateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
@@ -202,15 +204,15 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             LOG.trace("VpnInstance to VPNId mapping is not yet available, bailing out now.");
             return;
         }
-        if (VpnUtil.getOperationalVpnInterface(broker, vpnInterface.getName()) != null) {
-            LOG.trace("VPN Interface already provisioned , bailing out from here.");
-            return;
-        }
         synchronized (interfaceName.intern()) {
+            if (VpnUtil.getOperationalVpnInterface(broker, vpnInterface.getName()) != null) {
+                LOG.trace("VPN Interface already provisioned , bailing out from here.");
+                return;
+            }
 
             bindService(dpId, vpnName, interfaceName, lPortTag);
             updateDpnDbs(vpnName, interfaceName, true);
-            processVpnInterfaceAdjacencies(VpnUtil.getVpnInterfaceIdentifier(vpnInterface.getName()), vpnInterface);
+            processVpnInterfaceAdjacencies(VpnUtil.getVpnInterfaceIdentifier(vpnInterface.getName()), vpnInterface, true);
         }
 
     }
@@ -249,7 +251,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
     }
 
-    private void processVpnInterfaceAdjacencies(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf) {
+    private void processVpnInterfaceAdjacencies(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf,
+                                                boolean vpnInterfaceState) {
         String intfName = intf.getName();
 
         synchronized (intfName) {
@@ -289,7 +292,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 }
 
                 Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(value);
-                VpnInterface opInterface = VpnUtil.getVpnInterface(intfName, intf.getVpnInstanceName(), aug);
+                VpnInterface opInterface = VpnUtil.getVpnInterface(intfName, intf.getVpnInstanceName(),
+                                                                   aug, vpnInterfaceState);
                 InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName);
                 VpnUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, interfaceId, opInterface);
                 for (Adjacency nextHop : aug.getAdjacency()) {
@@ -489,6 +493,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
         String rd = VpnUtil.getVpnRd(broker, intf.getVpnInstanceName());
         if (adjacencies.isPresent()) {
+            VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier.augmentation(OpState.class),
+                               new OpStateBuilder().setStateUp(false).build());
             List<Adjacency> nextHops = adjacencies.get().getAdjacency();
 
             if (!nextHops.isEmpty()) {
@@ -581,7 +587,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     }
                     //updatePrefixToBGP(newRd, nextHop, nextHopIp, label);
                 }
-                processVpnInterfaceAdjacencies(identifier, update);
+                processVpnInterfaceAdjacencies(identifier, update, true);
                 VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, update);
             }
         } else if (oldAdjs != newAdjs) {
@@ -711,7 +717,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     .setIpAddress(prefix).setKey(new AdjacencyKey(prefix)).build());
 
             Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(adjacencies);
-            VpnInterface newVpnIntf = VpnUtil.getVpnInterface(currVpnIntf.getName(), currVpnIntf.getVpnInstanceName(), aug);
+            VpnInterface newVpnIntf = VpnUtil.getVpnInterface(currVpnIntf.getName(), currVpnIntf.getVpnInstanceName(),
+                                                              aug, currVpnIntf.getAugmentation(OpState.class).isStateUp());
 
             VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
             addExtraRoute(adj.getIpAddress(), adj.getNextHopIp(), rd, currVpnIntf.getVpnInstanceName(), (int) label, currVpnIntf.getName());
@@ -743,7 +750,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                             adjIt.remove();
 
                             Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(adjacencies);
-                            VpnInterface newVpnIntf = VpnUtil.getVpnInterface(currVpnIntf.getName(), currVpnIntf.getVpnInstanceName(), aug);
+                            VpnInterface newVpnIntf = VpnUtil.getVpnInterface(currVpnIntf.getName(),
+                                                                              currVpnIntf.getVpnInstanceName(),
+                                                                              aug,
+                                                                              currVpnIntf.getAugmentation(OpState.class).isStateUp());
 
                             VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
 
@@ -863,6 +873,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
     protected void updatePrefixesForDPN(BigInteger dpnId, UpdateRouteAction action) {
 
+        LOG.info("Tunnel event triggered {} for Dpn:{} ", action.name(), dpnId);
         InstanceIdentifierBuilder<VpnInstances> idBuilder = InstanceIdentifier.builder(VpnInstances.class);
         InstanceIdentifier<VpnInstances> vpnInstancesId = idBuilder.build();
         Optional<VpnInstances> vpnInstances = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnInstancesId);
index 10d69f961627900d630cd67991a9532e2e4c2914..cbd29917a46ed52e834626f5f12beef070773bd7 100644 (file)
@@ -83,10 +83,11 @@ public class VpnUtil {
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build();
     }
 
-    static VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) {
-        return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(
-            vpnName)
-                .addAugmentation(Adjacencies.class, aug).build();
+    static VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug, boolean opState) {
+        return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName)
+                .addAugmentation(Adjacencies.class, aug)
+                .addAugmentation(OpState.class, new OpStateBuilder().setStateUp(opState).build())
+                .build();
     }
 
     static InstanceIdentifier<Prefixes> getPrefixToInterfaceIdentifier(long vpnId, String ipPrefix) {