Datastore txes: natservice, part 3 51/73851/4
authorStephen Kitt <skitt@redhat.com>
Mon, 9 Jul 2018 16:35:48 +0000 (18:35 +0200)
committerSam Hague <shague@redhat.com>
Tue, 10 Jul 2018 16:40:03 +0000 (16:40 +0000)
This switches calls to VpnManager to datastore-constrained
transactions, and completes the natservice migration.

Change-Id: Ib441b99be37177b121010ba08da99256fb740e51
JIRA: NETVIRT-1342
Signed-off-by: Stephen Kitt <skitt@redhat.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java

index 0ad7649db5311767950130af8adcb81535eb4648..d37fac2ea04f150cb717918a5fb0c02e6a8ddd19 100644 (file)
@@ -164,11 +164,11 @@ public class EvpnDnatFlowProgrammer {
         LOG.debug("onAddFloatingIp : Add Floating Ip {} , found associated to fixed port {}",
                 externalIp, interfaceName);
         if (floatingIpPortMacAddress != null) {
-            ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(tx -> {
+            ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
                 vpnManager.addSubnetMacIntoVpnInstance(vpnName, null, floatingIpPortMacAddress, dpnId, tx);
                 vpnManager.addArpResponderFlowsToExternalNetworkIps(routerName,
                         Collections.singleton(externalIp),
-                        floatingIpPortMacAddress, dpnId, networkId, tx);
+                        floatingIpPortMacAddress, dpnId, networkId);
             }), LOG, "Error processing floating IP port with MAC address {}", floatingIpPortMacAddress);
         }
         final long finalL3Vni = l3Vni;
index b69b69af6105cb0caa04096cd600a1baccdac038..436592c8e4f3323a622d92a7dbb78bce427cdae6 100644 (file)
@@ -1326,7 +1326,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                                 + "operation");
                         vpnManager.addArpResponderFlowsToExternalNetworkIps(routerName, addedExternalIps,
                                 update.getExtGwMacAddress(), dpnId,
-                                update.getNetworkId(), null);
+                                update.getNetworkId());
 
                         for (String addedExternalIp : addedExternalIps) {
                 /*
index b2fafbf3c5a43ad1fb799528bf911d2414831b3d..26e9035b274e8d5a9cc6b80adad384e57573f469 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
+import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -429,6 +430,16 @@ public final class NatUtil {
                 LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Networks::getVpnid).orElse(null);
     }
 
+    @Nullable
+    public static Uuid getVpnIdfromNetworkId(TypedReadTransaction<Configuration> tx, Uuid networkId) {
+        try {
+            return tx.read(buildNetworkIdentifier(networkId)).get().toJavaUtil().map(Networks::getVpnid).orElse(null);
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error reading network VPN id for {}", networkId, e);
+            return null;
+        }
+    }
+
     public static ProviderTypes getProviderTypefromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -699,6 +710,15 @@ public final class NatUtil {
         return vpnUuid.getValue();
     }
 
+    public static String getAssociatedVPN(TypedReadTransaction<Configuration> tx, Uuid networkId) {
+        Uuid vpnUuid = NatUtil.getVpnIdfromNetworkId(tx, networkId);
+        if (vpnUuid == null) {
+            LOG.error("getAssociatedVPN : No VPN instance associated with ext network {}", networkId);
+            return null;
+        }
+        return vpnUuid.getValue();
+    }
+
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
     public static void addPrefixToBGP(DataBroker broker,
@@ -2060,7 +2080,7 @@ public final class NatUtil {
 
     public static void installRouterGwFlows(ManagedNewTransactionRunner txRunner, IVpnManager vpnManager,
             Routers router, BigInteger primarySwitchId, int addOrRemove) {
-        ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
+        ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
             List<ExternalIps> externalIps = router.getExternalIps();
             List<String> externalIpsSting = new ArrayList<>();
 
@@ -2077,7 +2097,7 @@ public final class NatUtil {
                         router.getNetworkId(), subnetVpnName.getValue(), tx);
                 vpnManager.addArpResponderFlowsToExternalNetworkIps(router.getRouterName(), externalIpsSting,
                         router.getExtGwMacAddress(), primarySwitchId,
-                        router.getNetworkId(), tx);
+                        router.getNetworkId());
             } else {
                 vpnManager.removeRouterGwMacFlow(router.getRouterName(), router.getExtGwMacAddress(), primarySwitchId,
                         router.getNetworkId(), subnetVpnName.getValue(), tx);
index 3569980f900cc5c5ecb41454a99a47b23aa62736..f5ac94c77b0c185499eb91697e4fb702181363f5 100644 (file)
@@ -254,12 +254,12 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
                 LOG.debug("onAddFloatingIp : Add Floating Ip {} , found associated to fixed port {}",
                         externalIp, interfaceName);
                 String networkVpnName =  NatUtil.getAssociatedVPN(dataBroker, networkId);
-                txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
+                txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
                     vpnManager.addSubnetMacIntoVpnInstance(networkVpnName, subnetVpnName,
                             floatingIpPortMacAddress, dpnId, tx);
                     vpnManager.addArpResponderFlowsToExternalNetworkIps(routerUuid,
                             Collections.singleton(externalIp),
-                            floatingIpPortMacAddress, dpnId, networkId, tx);
+                            floatingIpPortMacAddress, dpnId, networkId);
                 });
                 return future1;
             } else {
@@ -319,8 +319,8 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
             return;
         }
 
-        ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
-            String networkVpnName =  NatUtil.getAssociatedVPN(dataBroker, networkId);
+        ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
+            String networkVpnName =  NatUtil.getAssociatedVPN(tx, networkId);
             vpnManager.removeSubnetMacFromVpnInstance(networkVpnName, subnetId.getValue(), floatingIpPortMacAddress,
                     dpnId, tx);
             vpnManager.removeArpResponderFlowsToExternalNetworkIps(routerUuid, Collections.singletonList(externalIp),