Removing redundant extra-route delete
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / SubnetmapChangeListener.java
index 196528dfaeefb6d5aa21fd4c61cd65a01b1c721e..a0fb7bf8cd2d90cd82c76cbdd5b1898d610ab0f7 100644 (file)
@@ -12,6 +12,8 @@ import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -20,6 +22,9 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
@@ -38,14 +43,16 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
     private final DataBroker dataBroker;
     private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
     private final VpnUtil vpnUtil;
+    private final IVpnManager vpnManager;
 
     @Inject
     public SubnetmapChangeListener(final DataBroker dataBroker, final VpnSubnetRouteHandler vpnSubnetRouteHandler,
-                                   VpnUtil vpnUtil) {
+                                   VpnUtil vpnUtil, IVpnManager vpnManager) {
         super(Subnetmap.class, SubnetmapChangeListener.class);
         this.dataBroker = dataBroker;
         this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
         this.vpnUtil = vpnUtil;
+        this.vpnManager = vpnManager;
     }
 
     @PostConstruct
@@ -80,7 +87,7 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
             return;
         }
         if (subnetmap.getVpnId() != null) {
-            if (subnetmap.getNetworkType().equals(NetworkType.VLAN)) {
+            if (NetworkType.VLAN.equals(subnetmap.getNetworkType())) {
                 vpnUtil.addRouterPortToElanDpnListForVlaninAllDpn(subnetmap.getVpnId().getValue());
             }
         }
@@ -96,11 +103,26 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
                       elanInstanceName, subnetId.getValue());
             return;
         }
-        if (subnetmap.getVpnId() != null) {
-            boolean isBgpVpn = !subnetmap.getVpnId().equals(subnetmap.getRouterId());
+        Uuid vpnId = subnetmap.getVpnId();
+        if (vpnId != null) {
+            boolean isBgpVpn = !vpnId.equals(subnetmap.getRouterId());
             LOG.info("SubnetMapChangeListener:add: subnetmap {} with elanTag {} to VPN {}", subnetmap, elanTag,
-                     subnetmap.getVpnId());
+                     vpnId);
             vpnSubnetRouteHandler.onSubnetAddedToVpn(subnetmap, isBgpVpn, elanTag);
+            if (isBgpVpn && subnetmap.getRouterId() == null) {
+                Set<VpnTarget> routeTargets = vpnManager.getRtListForVpn(vpnId.getValue());
+                if (!routeTargets.isEmpty()) {
+                    // FIXME: separate this out somehow?
+                    final ReentrantLock lock = JvmGlobalLocks.getLockForString(subnetmap.getSubnetIp());
+                    lock.lock();
+                    try {
+                        vpnManager.updateRouteTargetsToSubnetAssociation(routeTargets, subnetmap.getSubnetIp(),
+                                vpnId.getValue());
+                    } finally {
+                        lock.unlock();
+                    }
+                }
+            }
         }
     }
 
@@ -130,7 +152,7 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
             return;
         }
         updateVlanDataEntry(subnetmapOriginal.getVpnId(), subnetmapUpdate.getVpnId(), subnetmapUpdate,
-                subnetmapOriginal, elanTag, elanInstanceName);
+                subnetmapOriginal, elanInstanceName);
         if (VpnUtil.getIsExternal(network)) {
             LOG.debug("SubnetMapChangeListener:update: provider subnetwork {} is handling in "
                       + "ExternalSubnetVpnInstanceListener", subnetId.getValue());
@@ -197,20 +219,20 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
             vpnSubnetRouteHandler.onSubnetDeletedFromVpn(subnetmapOriginal, true);
         }
         // subnet updated in VPN
-        if (vpnIdOld != null && vpnIdNew != null && (!vpnIdNew.equals(vpnIdOld))) {
+        if (vpnIdOld != null && vpnIdNew != null && !vpnIdNew.equals(vpnIdOld)) {
             vpnSubnetRouteHandler.onSubnetUpdatedInVpn(subnetmapUpdate, elanTag);
         }
     }
 
     private void updateVlanDataEntry(Uuid vpnIdOld, Uuid vpnIdNew, Subnetmap subnetmapUpdate,
-            Subnetmap subnetmapOriginal, Long elanTag, String  elanInstanceName) {
+            Subnetmap subnetmapOriginal, String elanInstanceName) {
         if (vpnIdNew != null && vpnIdOld == null) {
-            if (elanInstanceName != null && subnetmapUpdate.getNetworkType().equals(NetworkType.VLAN)) {
+            if (elanInstanceName != null && NetworkType.VLAN.equals(subnetmapUpdate.getNetworkType())) {
                 vpnUtil.addRouterPortToElanDpnListForVlaninAllDpn(vpnIdNew.getValue());
             }
         }
         if (vpnIdOld != null && vpnIdNew == null) {
-            if (subnetmapOriginal.getNetworkType().equals(NetworkType.VLAN)) {
+            if (NetworkType.VLAN.equals(subnetmapOriginal.getNetworkType())) {
                 vpnUtil.removeRouterPortFromElanDpnListForVlanInAllDpn(elanInstanceName, subnetmapOriginal
                         .getRouterInterfacePortId().getValue(), vpnIdOld.getValue());
             }
@@ -231,7 +253,7 @@ public class SubnetmapChangeListener extends AsyncDataTreeChangeListenerBase<Sub
                     LogicalDatastoreType.CONFIGURATION, elanIdentifierId);
             if (elanInstance.isPresent()) {
                 if (elanInstance.get().getElanTag() != null) {
-                    elanTag = elanInstance.get().getElanTag();
+                    elanTag = elanInstance.get().getElanTag().toJava();
                 } else {
                     LOG.error("Notification failed because of failure in fetching elanTag for ElanInstance {}",
                             elanInstanceName);