MRI version bumpup for Aluminium
[netvirt.git] / fibmanager / impl / src / main / java / org / opendaylight / netvirt / fibmanager / RouterInterfaceVrfEntryHandler.java
index a1eed62557b3685b93443ab12a0b0c34b7219c5b..01db51a272b384b9290328785a7bff2f10ee7c35 100644 (file)
@@ -10,27 +10,32 @@ package org.opendaylight.netvirt.fibmanager;
 import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address;
 
 import com.google.common.base.Preconditions;
-import java.math.BigInteger;
-import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
 import org.opendaylight.genius.mdsalutil.FlowEntity;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.utils.JvmGlobalLocks;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
+import org.opendaylight.serviceutils.upgrade.UpgradeState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.RouterInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnListKey;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class RouterInterfaceVrfEntryHandler extends BaseVrfEntryHandler implements IVrfEntryHandler {
+public class RouterInterfaceVrfEntryHandler extends BaseVrfEntryHandler {
 
     private static final Logger LOG = LoggerFactory.getLogger(RouterInterfaceVrfEntryHandler.class);
     private final IMdsalApiManager mdsalManager;
@@ -38,8 +43,9 @@ public class RouterInterfaceVrfEntryHandler extends BaseVrfEntryHandler implemen
 
     @Inject
     public RouterInterfaceVrfEntryHandler(final DataBroker dataBroker, final NexthopManager nexthopManager,
-            final IMdsalApiManager mdsalManager, final IPv6Handler ipv6Handler, final FibUtil fibUtil) {
-        super(dataBroker, nexthopManager, mdsalManager, fibUtil);
+            final IMdsalApiManager mdsalManager, final IPv6Handler ipv6Handler, final FibUtil fibUtil,
+            final UpgradeState upgradeState, final DataTreeEventCallbackRegistrar eventCallbacks) {
+        super(dataBroker, nexthopManager, mdsalManager, fibUtil, upgradeState, eventCallbacks);
         this.mdsalManager = mdsalManager;
         this.ipv6Handler = ipv6Handler;
     }
@@ -49,60 +55,59 @@ public class RouterInterfaceVrfEntryHandler extends BaseVrfEntryHandler implemen
         LOG.info("{} close", getClass().getSimpleName());
     }
 
-    @Override
-    public void createFlows(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry, String rd) {
-        RouterInterface routerInt = vrfEntry.getAugmentation(RouterInterface.class);
+    void createFlows(VrfEntry vrfEntry, String rd) {
+        RouterInterface routerInt = vrfEntry.augmentation(RouterInterface.class);
         installRouterFibEntries(vrfEntry, rd, NwConstants.ADD_FLOW, routerInt);
     }
 
-    @Override
-    public void updateFlows(InstanceIdentifier<VrfEntry> identifier, VrfEntry original, VrfEntry update, String rd) {
-        // Not used
-    }
-
-    @Override
-    public void removeFlows(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry, String rd) {
-        RouterInterface routerInt = vrfEntry.getAugmentation(RouterInterface.class);
+    void removeFlows(VrfEntry vrfEntry, String rd) {
+        RouterInterface routerInt = vrfEntry.augmentation(RouterInterface.class);
         installRouterFibEntries(vrfEntry, rd, NwConstants.DEL_FLOW, routerInt);
     }
 
-    private Boolean installRouterFibEntries(VrfEntry vrfEntry, String rd, int addOrRemove,
+    private boolean installRouterFibEntries(VrfEntry vrfEntry, String rd, int addOrRemove,
             RouterInterface routerInterface) {
         final VpnInstanceOpDataEntry vpnInstance = getFibUtil().getVpnInstance(rd);
         Preconditions.checkNotNull(vpnInstance, "Vpn Instance not available " + rd);
         Preconditions.checkNotNull(vpnInstance.getVpnId(),
                 "Vpn Instance with rd " + vpnInstance.getVrfId() + " has null vpnId!");
-        synchronized (vpnInstance.getVpnInstanceName().intern()) {
-            final Collection<VpnToDpnList> vpnToDpnList;
+
+        // FIXME: separate this out somehow?
+        final ReentrantLock lock = JvmGlobalLocks.getLockForString(vpnInstance.getVpnInstanceName());
+        lock.lock();
+        try {
+            final Map<VpnToDpnListKey, VpnToDpnList> keyVpnToDpnListMap;
             if (vrfEntry.getParentVpnRd() != null
                     && FibHelper.isControllerManagedNonSelfImportedRoute(RouteOrigin.value(vrfEntry.getOrigin()))) {
                 VpnInstanceOpDataEntry parentVpnInstance =
                         getFibUtil().getVpnInstance(vrfEntry.getParentVpnRd());
-                vpnToDpnList = parentVpnInstance != null ? parentVpnInstance.getVpnToDpnList()
+                keyVpnToDpnListMap = parentVpnInstance != null ? parentVpnInstance.getVpnToDpnList()
                         : vpnInstance.getVpnToDpnList();
             } else {
-                vpnToDpnList = vpnInstance.getVpnToDpnList();
+                keyVpnToDpnListMap = vpnInstance.getVpnToDpnList();
             }
-            final Long vpnId = vpnInstance.getVpnId();
+            final Uint32 vpnId = vpnInstance.getVpnId();
 
-            if (vpnToDpnList != null) {
+            if (keyVpnToDpnListMap != null) {
                 String routerId = routerInterface.getUuid();
                 String macAddress = routerInterface.getMacAddress();
                 String ipValue = routerInterface.getIpAddress();
                 LOG.trace("createFibEntries - Router augmented vrfentry found for for router uuid:{}, ip:{}, mac:{}",
                         routerId, ipValue, macAddress);
-                for (VpnToDpnList vpnDpn : vpnToDpnList) {
+                for (VpnToDpnList vpnDpn : keyVpnToDpnListMap.values()) {
                     if (vpnDpn.getDpnState() == VpnToDpnList.DpnState.Active) {
-                        installRouterFibEntry(vrfEntry, vpnDpn.getDpnId(), vpnId, ipValue, new MacAddress(macAddress),
-                                addOrRemove);
+                        installRouterFibEntry(vrfEntry, vpnDpn.getDpnId(), vpnId, ipValue,
+                                new MacAddress(macAddress), addOrRemove);
                     }
                 }
             }
+        } finally {
+            lock.unlock();
         }
         return true;
     }
 
-    public void installRouterFibEntry(final VrfEntry vrfEntry, BigInteger dpnId, long vpnId, String routerInternalIp,
+    public void installRouterFibEntry(final VrfEntry vrfEntry, Uint64 dpnId, Uint32 vpnId, String routerInternalIp,
             MacAddress routerMac, int addOrRemove) {
 
         // First install L3_GW_MAC_TABLE flows as it's common for both IPv4 and IPv6
@@ -114,7 +119,7 @@ public class RouterInterfaceVrfEntryHandler extends BaseVrfEntryHandler implemen
             mdsalManager.syncRemoveFlow(l3GwMacFlowEntity, 1);
         }
 
-        java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+        java.util.Optional<Uint32> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
         if (!optionalLabel.isPresent()) {
             LOG.warn("Routes paths not present. Exiting installRouterFibEntry");
             return;