X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnmanager%2Fvpnmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2FVpnInterfaceManager.java;h=d4dd28813275770c4469305e425fc7ca74e2377a;hb=35a4833050305a6426ec0b937942f1d6f8578102;hp=c37666a919aa10b4dfd458ba030bda4fd4b28229;hpb=acac66d2b4b29eab99b2604965680f50da9eb9ef;p=vpnservice.git diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index c37666a9..d4dd2881 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -18,6 +18,7 @@ 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.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; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfacesBuilder; @@ -41,7 +42,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ArrayList; -import java.util.concurrent.Future; +import java.util.concurrent.*; import com.google.common.base.Optional; @@ -73,7 +74,9 @@ import org.slf4j.LoggerFactory; public class VpnInterfaceManager extends AbstractDataChangeListener implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class); - private ListenerRegistration listenerRegistration; + private ListenerRegistration listenerRegistration, opListenerRegistration; + private ConcurrentMap vpnIntfMap = new ConcurrentHashMap(); + private ExecutorService executorService = Executors.newSingleThreadExecutor(); private final DataBroker broker; private final IBgpManager bgpManager; private IFibManager fibManager; @@ -83,6 +86,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener identifier, final VpnInterface vpnInterface) { - LOG.trace("key: {} , value: {}", identifier, vpnInterface ); + LOG.trace("VPN Interface key: {} , value: {}", identifier, vpnInterface ); addInterface(identifier, vpnInterface); } private void addInterface(final InstanceIdentifier identifier, final VpnInterface vpnInterface) { - LOG.trace("Add event - key: {}, value: {}" ,identifier, vpnInterface ); + LOG.trace("VPN Interface add event - key: {}, value: {}" ,identifier, vpnInterface ); final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class); String interfaceName = key.getName(); @@ -173,11 +182,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener matches = new ArrayList(); BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(lPortTag, ++sIndex, BigInteger.valueOf(vpnId)); BigInteger metadataMask = MetaDataUtil.getMetaDataMaskForLPortDispatcher(MetaDataUtil.METADATA_MASK_SERVICE_INDEX, @@ -304,7 +329,6 @@ public class VpnInterfaceManager extends AbstractDataChangeListener vpnInterfaces = new ArrayList<>(); @@ -423,13 +447,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName); - removeAdjacenciesFromVpn(identifier, vpnInterface); - LOG.info("Unbinding vpn service from interface {} ", interfaceName); - unbindService(vpnName, interfaceName, lPortTag); - updateDpnDbs(vpnName, interfaceName, false); - VpnUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, identifier, VpnUtil.DEFAULT_CALLBACK); + synchronized (interfaceName.intern()) { + removeAdjacenciesFromVpn(identifier, vpnInterface); + LOG.info("Unbinding vpn service from interface {} ", interfaceName); + unbindService(dpId, vpnName, interfaceName, lPortTag, isInterfaceStateDown); + + //wait till DCN for removal of vpn interface in operational DS arrives + Runnable notifyTask = new VpnNotifyTask(); + synchronized (interfaceName.intern()) { + vpnIntfMap.put(interfaceName, notifyTask); + synchronized (notifyTask) { + try { + notifyTask.wait(VpnConstants.WAIT_TIME_IN_MILLISECONDS); + } catch (InterruptedException e) { + } + } + } + + } } private void removeAdjacenciesFromVpn(final InstanceIdentifier identifier, VpnInterface intf) { @@ -459,11 +496,11 @@ public class VpnInterfaceManager extends AbstractDataChangeListener idBuilder = InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, new VrfEntryKey(prefix)); InstanceIdentifier vrfEntryId = idBuilder.build(); - VpnUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, vrfEntryId, VpnUtil.DEFAULT_CALLBACK); + VpnUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId, VpnUtil.DEFAULT_CALLBACK); } @@ -640,7 +681,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener vrfTableId = idBuilder.build(); - VpnUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, vrfTableId, VpnUtil.DEFAULT_CALLBACK); + VpnUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId, VpnUtil.DEFAULT_CALLBACK); } @@ -673,7 +714,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener { + + public VpnInterfaceOpListener() { + super(VpnInterface.class); + } + + @Override + protected void remove(InstanceIdentifier identifier, VpnInterface del) { + final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class); + String interfaceName = key.getName(); + + //increment the vpn interface count in Vpn Instance Op Data + Long ifCnt = 0L; + String rd = getRouteDistinguisher(del.getVpnInstanceName()); + if(rd.isEmpty()) rd = del.getVpnInstanceName(); + VpnInstanceOpDataEntry vpnInstOp = VpnUtil.getVpnInstanceOpData(broker, rd); + if(vpnInstOp != null && vpnInstOp.getVpnInterfaceCount() != null) { + ifCnt = vpnInstOp.getVpnInterfaceCount(); + } + + LOG.trace("VpnInterfaceOpListener remove: interface name {} rd {} interface count in Vpn Op Instance {}", interfaceName, rd, ifCnt); + + VpnUtil.asyncUpdate(broker, LogicalDatastoreType.OPERATIONAL, + VpnUtil.getVpnInstanceOpDataIdentifier(rd), + VpnUtil.updateIntfCntInVpnInstOpData(ifCnt - 1, rd), VpnUtil.DEFAULT_CALLBACK); + + //TODO: Clean up the DPN List in Vpn Instance Op if ifCnt is zero + + notifyTaskIfRequired(interfaceName); + } + + private void notifyTaskIfRequired(String intfName) { + Runnable notifyTask = vpnIntfMap.remove(intfName); + if (notifyTask == null) { + return; + } + executorService.execute(notifyTask); + } + + @Override + protected void update(InstanceIdentifier identifier, VpnInterface original, VpnInterface update) { + } + + @Override + protected void add(InstanceIdentifier identifier, VpnInterface add) { + final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class); + String interfaceName = key.getName(); + + //increment the vpn interface count in Vpn Instance Op Data + Long ifCnt = 0L; + String rd = getRouteDistinguisher(add.getVpnInstanceName()); + if(rd.isEmpty()) rd = add.getVpnInstanceName(); + VpnInstanceOpDataEntry vpnInstOp = VpnUtil.getVpnInstanceOpData(broker, rd); + if(vpnInstOp != null && vpnInstOp.getVpnInterfaceCount() != null) { + ifCnt = vpnInstOp.getVpnInterfaceCount(); + } + + LOG.trace("VpnInterfaceOpListener add: interface name {} rd {} interface count in Vpn Op Instance {}", interfaceName, rd, ifCnt); + + VpnUtil.asyncUpdate(broker, LogicalDatastoreType.OPERATIONAL, + VpnUtil.getVpnInstanceOpDataIdentifier(rd), + VpnUtil.updateIntfCntInVpnInstOpData(ifCnt + 1, rd), VpnUtil.DEFAULT_CALLBACK); + + + } + } + protected void updatePrefixesForDPN(BigInteger dpnId, UpdateRouteAction action) { InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(VpnInstances.class);