NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / vpnmanager / impl / src / main / java / org / opendaylight / netvirt / vpnmanager / intervpnlink / InterVpnLinkNodeAddTask.java
index a9b10bf850886c25ad08a7fbc34709e4ef414649..bd555d9346b2305c1277235436c14f0f8224249c 100755 (executable)
@@ -7,17 +7,20 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-import com.google.common.base.Optional;
+import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.mdsal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+
 import com.google.common.util.concurrent.ListenableFuture;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.Callable;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.netvirt.vpnmanager.VpnFootprintService;
 import org.opendaylight.netvirt.vpnmanager.VpnUtil;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
@@ -28,6 +31,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.inter.vpn.link.state.FirstEndpointStateBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.inter.vpn.link.state.SecondEndpointState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.inter.vpn.link.state.SecondEndpointStateBuilder;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,41 +42,46 @@ import org.slf4j.LoggerFactory;
  * there are no DPNs connected to controller by the time the InterVpnLink is
  * created.
  */
-public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<Void>>> {
+public class InterVpnLinkNodeAddTask implements Callable<List<? extends ListenableFuture<?>>> {
     private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeAddTask.class);
     private static final String NBR_OF_DPNS_PROPERTY_NAME = "vpnservice.intervpnlink.number.dpns";
 
     private final DataBroker broker;
+    private final ManagedNewTransactionRunner txRunner;
     private final BigInteger dpnId;
     private final IMdsalApiManager mdsalManager;
     private final VpnFootprintService vpnFootprintService;
     private final InterVpnLinkCache interVpnLinkCache;
+    private final VpnUtil vpnUtil;
+    private final InterVpnLinkUtil interVpnLinkUtil;
 
     public InterVpnLinkNodeAddTask(final DataBroker broker, final IMdsalApiManager mdsalMgr,
             final VpnFootprintService vpnFootprintService, final BigInteger dpnId,
-            final InterVpnLinkCache interVpnLinkCache) {
+            final InterVpnLinkCache interVpnLinkCache, VpnUtil vpnUtil, InterVpnLinkUtil interVpnLinkUtil) {
         this.broker = broker;
+        this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
         this.mdsalManager = mdsalMgr;
         this.vpnFootprintService = vpnFootprintService;
         this.dpnId = dpnId;
         this.interVpnLinkCache = interVpnLinkCache;
+        this.interVpnLinkUtil = interVpnLinkUtil;
+        this.vpnUtil = vpnUtil;
     }
 
     @Override
-    public List<ListenableFuture<Void>> call() throws Exception {
+    public List<ListenableFuture<Void>> call() {
         List<ListenableFuture<Void>> result = new ArrayList<>();
         // check if there is any inter-vpn-link in with erroneous state
         int numberOfDpns = Integer.getInteger(NBR_OF_DPNS_PROPERTY_NAME, 1);
 
-        List<BigInteger> firstDpnList = Collections.singletonList(this.dpnId);
-        List<BigInteger> secondDpnList = firstDpnList;
+        List<Uint64> firstDpnList = Collections.singletonList(Uint64.valueOf(this.dpnId));
+        List<Uint64> secondDpnList = firstDpnList;
         interVpnLinkCache.getAllInterVpnLinks().stream()
             .filter(i -> i.isComplete() && !i.isActive()
                         && shouldConfigureLinkIntoDpn(i.getInterVpnLinkState(), numberOfDpns))
             .forEach(i -> {
                 installLPortDispatcherTable(i.getInterVpnLinkState(), firstDpnList, secondDpnList);
-                result.add(updateInterVpnLinkState(i.getInterVpnLinkState(), firstDpnList, secondDpnList,
-                                                   numberOfDpns));
+                result.add(updateInterVpnLinkState(i.getInterVpnLinkState(), firstDpnList, secondDpnList));
             });
 
         return result;
@@ -84,8 +94,8 @@ public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<V
             || interVpnLinkState.getSecondEndpointState().getDpId() == null
                     || interVpnLinkState.getSecondEndpointState().getDpId().isEmpty()) {
             return true;
-        } else if (!interVpnLinkState.getFirstEndpointState().getDpId().contains(dpnId)
-            && !interVpnLinkState.getSecondEndpointState().getDpId().contains(dpnId)
+        } else if (!interVpnLinkState.getFirstEndpointState().getDpId().contains(Uint64.valueOf(dpnId))
+            && !interVpnLinkState.getSecondEndpointState().getDpId().contains(Uint64.valueOf(dpnId))
             && interVpnLinkState.getFirstEndpointState().getDpId().size() < numberOfDpns) {
             return true;
         } else {
@@ -94,8 +104,8 @@ public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<V
     }
 
     private ListenableFuture<Void>
-        updateInterVpnLinkState(InterVpnLinkState interVpnLinkState, List<BigInteger> firstDpnList,
-                                List<BigInteger> secondDpnList, int numberOfDpns) {
+        updateInterVpnLinkState(InterVpnLinkState interVpnLinkState, List<Uint64> firstDpnList,
+                                List<Uint64> secondDpnList) {
 
         FirstEndpointState firstEndPointState =
             new FirstEndpointStateBuilder(interVpnLinkState.getFirstEndpointState()).setDpId(firstDpnList).build();
@@ -105,16 +115,14 @@ public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<V
             new InterVpnLinkStateBuilder(interVpnLinkState).setState(InterVpnLinkState.State.Active)
                     .setFirstEndpointState(firstEndPointState).setSecondEndpointState(secondEndPointState)
                     .build();
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.merge(LogicalDatastoreType.CONFIGURATION,
-            InterVpnLinkUtil.getInterVpnLinkStateIid(interVpnLinkState.getInterVpnLinkName()), newInterVpnLinkState,
-            true);
-        return tx.submit();
+        return txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx ->
+            tx.merge(InterVpnLinkUtil.getInterVpnLinkStateIid(interVpnLinkState.getInterVpnLinkName()),
+                    newInterVpnLinkState, CREATE_MISSING_PARENTS));
     }
 
-    private void installLPortDispatcherTable(InterVpnLinkState interVpnLinkState, List<BigInteger> firstDpnList,
-                                             List<BigInteger> secondDpnList) {
-        String ivpnLinkName = interVpnLinkState.getKey().getInterVpnLinkName();
+    private void installLPortDispatcherTable(InterVpnLinkState interVpnLinkState, List<Uint64> firstDpnList,
+                                             List<Uint64> secondDpnList) {
+        String ivpnLinkName = interVpnLinkState.key().getInterVpnLinkName();
         Optional<InterVpnLinkDataComposite> optVpnLink = interVpnLinkCache.getInterVpnLinkByName(ivpnLinkName);
         if (!optVpnLink.isPresent()) {
             LOG.warn("installLPortDispatcherTable: Could not find interVpnLink {}", ivpnLinkName);
@@ -122,14 +130,14 @@ public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<V
         }
 
         InterVpnLinkDataComposite vpnLink = optVpnLink.get();
-        Optional<Long> opt1stEndpointLportTag = vpnLink.getFirstEndpointLportTag();
+        Optional<Uint32> opt1stEndpointLportTag = vpnLink.getFirstEndpointLportTag();
         if (!opt1stEndpointLportTag.isPresent()) {
             LOG.warn("installLPortDispatcherTable: Could not find LPortTag for 1stEnpoint in InterVpnLink {}",
                      ivpnLinkName);
             return;
         }
 
-        Optional<Long> opt2ndEndpointLportTag = vpnLink.getSecondEndpointLportTag();
+        Optional<Uint32> opt2ndEndpointLportTag = vpnLink.getSecondEndpointLportTag();
         if (!opt2ndEndpointLportTag.isPresent()) {
             LOG.warn("installLPortDispatcherTable: Could not find LPortTag for 2ndEnpoint in InterVpnLink {}",
                      ivpnLinkName);
@@ -139,23 +147,21 @@ public class InterVpnLinkNodeAddTask implements Callable<List<ListenableFuture<V
         String firstEndpointVpnUuid = vpnLink.getFirstEndpointVpnUuid().get();
         String secondEndpointVpnUuid = vpnLink.getSecondEndpointVpnUuid().get();
         // Note that in the DPN of the firstEndpoint we install the lportTag of the secondEndpoint and viceversa
-        String vpn1PrimaryRd = VpnUtil.getPrimaryRd(broker, firstEndpointVpnUuid);
-        String vpn2PrimaryRd = VpnUtil.getPrimaryRd(broker, secondEndpointVpnUuid);
-        if (!VpnUtil.isVpnPendingDelete(broker, vpn1PrimaryRd)
-                && !VpnUtil.isVpnPendingDelete(broker, vpn2PrimaryRd)) {
-            InterVpnLinkUtil.installLPortDispatcherTableFlow(broker, mdsalManager, ivpnLinkName, firstDpnList,
-                    secondEndpointVpnUuid, opt2ndEndpointLportTag.get());
-            InterVpnLinkUtil.installLPortDispatcherTableFlow(broker, mdsalManager, ivpnLinkName, secondDpnList,
-                    firstEndpointVpnUuid, opt1stEndpointLportTag.get());
+        String vpn1PrimaryRd = vpnUtil.getPrimaryRd(firstEndpointVpnUuid);
+        String vpn2PrimaryRd = vpnUtil.getPrimaryRd(secondEndpointVpnUuid);
+        if (!vpnUtil.isVpnPendingDelete(vpn1PrimaryRd)
+                && !vpnUtil.isVpnPendingDelete(vpn2PrimaryRd)) {
+            interVpnLinkUtil.installLPortDispatcherTableFlow(ivpnLinkName, firstDpnList, secondEndpointVpnUuid,
+                    opt2ndEndpointLportTag.get().toJava());
+            interVpnLinkUtil.installLPortDispatcherTableFlow(ivpnLinkName, secondDpnList, firstEndpointVpnUuid,
+                    opt1stEndpointLportTag.get().toJava());
             // Update the VPN -> DPNs Map.
             // Note: when a set of DPNs is calculated for Vpn1, these DPNs are added to the VpnToDpn map of Vpn2. Why?
             // because we do the handover from Vpn1 to Vpn2 in those DPNs, so in those DPNs we must know how to reach
             // to Vpn2 targets. If new Vpn2 targets are added later, the Fib will be maintained in these DPNs even if
             // Vpn2 is not physically present there.
-            InterVpnLinkUtil.updateVpnFootprint(vpnFootprintService, secondEndpointVpnUuid, vpn1PrimaryRd,
-                    firstDpnList);
-            InterVpnLinkUtil.updateVpnFootprint(vpnFootprintService, firstEndpointVpnUuid, vpn2PrimaryRd,
-                    secondDpnList);
+            interVpnLinkUtil.updateVpnFootprint(secondEndpointVpnUuid, vpn1PrimaryRd, firstDpnList);
+            interVpnLinkUtil.updateVpnFootprint(firstEndpointVpnUuid, vpn2PrimaryRd, secondDpnList);
         }
     }
 }