MRI version bumpup for Aluminium
[netvirt.git] / natservice / impl / src / main / java / org / opendaylight / netvirt / natservice / internal / ExternalRoutersListener.java
index f32704a5bca24012f3feb5e8376eee2adeb881e6..3280c781c26824c2cc83964802865169cf76bccd 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 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.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -88,6 +87,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 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.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeGre;
@@ -115,6 +115,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev16011
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.RouterIdName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.RoutersKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.routers.ExternalIps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.ips.counter.ExternalCounters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.ips.counter.external.counters.ExternalIpCounter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.Subnets;
@@ -408,7 +409,8 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
 
     protected void subnetRegisterMapping(Routers routerEntry, Uint32 segmentId) {
         LOG.debug("subnetRegisterMapping : Fetching values from extRouters model");
-        List<String> externalIps = NatUtil.getIpsListFromExternalIps(routerEntry.getExternalIps());
+        List<String> externalIps = NatUtil.getIpsListFromExternalIps(
+                new ArrayList<ExternalIps>(routerEntry.getExternalIps().values()));
         int counter = 0;
         int extIpCounter = externalIps.size();
         LOG.debug("subnetRegisterMapping : counter values before looping counter {} and extIpCounter {}",
@@ -509,7 +511,7 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
                     bgpVpnId, bgpVpnName);
                 RouterIds rtrs = new RouterIdsBuilder().withKey(new RouterIdsKey(bgpVpnId))
                     .setRouterId(bgpVpnId).setRouterName(bgpVpnName).build();
-                confTx.put(getRoutersIdentifier(bgpVpnId), rtrs, CREATE_MISSING_PARENTS);
+                confTx.mergeParentStructurePut(getRoutersIdentifier(bgpVpnId), rtrs);
             }
             if (create) {
                 addDefaultFibRouteForSnatWithBgpVpn(routerName, routerId, bgpVpnId, confTx);
@@ -1019,7 +1021,8 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
             LOG.error("handleSnatReverseTraffic : networkId is null for the router ID {}", routerId);
             return;
         }
-        Collection<Uuid> externalSubnetList = NatUtil.getExternalSubnetIdsFromExternalIps(router.getExternalIps());
+        Collection<Uuid> externalSubnetList = NatUtil.getExternalSubnetIdsFromExternalIps(
+                new ArrayList<ExternalIps>(router.getExternalIps().values()));
         // FLAT/VLAN case having external-subnet as VPN
         String externalSubnetVpn = null;
         if (externalSubnetList != null && !externalSubnetList.isEmpty()) {
@@ -1208,20 +1211,22 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
         matches.add(MatchEthernetType.MPLS_UNICAST);
         matches.add(new MatchMplsLabel(serviceId.longValue()));
 
-        List<Instruction> instructions = new ArrayList<>();
+        Map<InstructionKey, Instruction> instructionsMap = new HashMap<InstructionKey, Instruction>();
+        int instructionKey = 0;
         List<ActionInfo> actionsInfos = new ArrayList<>();
         //NAT is required for IPv4 only. Hence always etherType will be IPv4
         actionsInfos.add(new ActionPopMpls(NwConstants.ETHTYPE_IPV4));
         Instruction writeInstruction = new InstructionApplyActions(actionsInfos).buildInstruction(0);
-        instructions.add(writeInstruction);
-        instructions.add(new InstructionGotoTable(tableId).buildInstruction(1));
+        instructionsMap.put(new InstructionKey(++instructionKey), writeInstruction);
+        instructionsMap.put(new InstructionKey(++instructionKey),
+                new InstructionGotoTable(tableId).buildInstruction(1));
 
         // Install the flow entry in L3_LFIB_TABLE
         String flowRef = getFlowRef(dpId, NwConstants.L3_LFIB_TABLE, serviceId, "");
 
         Flow flowEntity = MDSALUtil.buildFlowNew(NwConstants.L3_LFIB_TABLE, flowRef,
             10, flowRef, 0, 0,
-            COOKIE_VM_LFIB_TABLE, matches, instructions);
+            COOKIE_VM_LFIB_TABLE, matches, instructionsMap);
 
         mdsalManager.addFlow(confTx, dpId, flowEntity);
 
@@ -1242,13 +1247,17 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
         } else {
             mkMatches.add(new MatchTunnelId(Uint64.valueOf(serviceId)));
         }
-
+        Map<InstructionKey, Instruction> customInstructionsMap = new HashMap<InstructionKey, Instruction>();
+        int instructionKey = 0;
+        for (Instruction instructionObj : customInstructions) {
+            customInstructionsMap.put(new InstructionKey(++instructionKey), instructionObj);
+        }
         Flow terminatingServiceTableFlowEntity = MDSALUtil.buildFlowNew(NwConstants.INTERNAL_TUNNEL_TABLE,
             getFlowRef(dpnId, NwConstants.INTERNAL_TUNNEL_TABLE, serviceId, ""),
                 NatConstants.DEFAULT_VPN_INTERNAL_TUNNEL_TABLE_PRIORITY,
                 String.format("%s:%s", "TST Flow Entry ", serviceId), 0, 0,
                 Uint64.valueOf(COOKIE_TUNNEL.toJava().add(BigInteger.valueOf(serviceId.longValue()))),
-                mkMatches, customInstructions);
+                mkMatches, customInstructionsMap);
 
         mdsalManager.addFlow(confTx, dpnId, terminatingServiceTableFlowEntity);
     }
@@ -1346,8 +1355,10 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
                     }
                     //Check if the Update is on External IPs
                     LOG.debug("update : Checking if this is update on External IPs for router {}", routerName);
-                    List<String> originalExternalIps = NatUtil.getIpsListFromExternalIps(original.getExternalIps());
-                    List<String> updatedExternalIps = NatUtil.getIpsListFromExternalIps(update.getExternalIps());
+                    List<String> originalExternalIps = NatUtil.getIpsListFromExternalIps(
+                            new ArrayList<ExternalIps>(original.getExternalIps().values()));
+                    List<String> updatedExternalIps = NatUtil.getIpsListFromExternalIps(
+                            new ArrayList<ExternalIps>(update.getExternalIps().values()));
 
                     //Check if the External IPs are removed during the update.
                     Set<String> removedExternalIps = new HashSet<>(originalExternalIps);
@@ -1436,9 +1447,9 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
 
                             if (ipPortMapping.isPresent()) {
                                 for (IntextIpProtocolType intextIpProtocolType :
-                                        ipPortMapping.get().nonnullIntextIpProtocolType()) {
+                                        ipPortMapping.get().nonnullIntextIpProtocolType().values()) {
                                     ProtocolTypes protoType = intextIpProtocolType.getProtocol();
-                                    for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap()) {
+                                    for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap().values()) {
                                         IpPortExternal ipPortExternal = ipPortMap.getIpPortExternal();
                                         if (ipPortExternal.getIpAddress().equals(externalIp)) {
                                             List<String> removedInternalIpPorts =
@@ -1657,8 +1668,8 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
         }
         if (externalCountersData.isPresent()) {
             ExternalIpsCounter externalIpsCounters = externalCountersData.get();
-            for (ExternalCounters ext : externalIpsCounters.nonnullExternalCounters()) {
-                for (ExternalIpCounter externalIpCount : ext.nonnullExternalIpCounter()) {
+            for (ExternalCounters ext : externalIpsCounters.nonnullExternalCounters().values()) {
+                for (ExternalIpCounter externalIpCount : ext.nonnullExternalIpCounter().values()) {
                     if (externalIpCount.getExternalIp().equals(externalIp)) {
                         if (externalIpCount.getCounter().toJava() != 0) {
                             return true;
@@ -1848,7 +1859,8 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
                 LOG.error("handleDisableSnat : External Network Provider Type missing");
                 return;
             }
-            Collection<Uuid> externalSubnetList = NatUtil.getExternalSubnetIdsFromExternalIps(router.getExternalIps());
+            Collection<Uuid> externalSubnetList = NatUtil.getExternalSubnetIdsFromExternalIps(
+                    new ArrayList<ExternalIps>(router.getExternalIps().values()));
             removeNaptFlowsFromActiveSwitch(routerId, routerName, naptSwitchDpnId, networkUuid, vpnName, externalIps,
                     externalSubnetList, removeFlowInvTx, extNwProvType);
             removeFlowsFromNonActiveSwitches(routerId, routerName, naptSwitchDpnId, removeFlowInvTx);
@@ -2087,9 +2099,9 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
             return;
         }
 
-        for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType()) {
+        for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType().values()) {
             String protocol = intextIpProtocolType.getProtocol().name();
-            for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap()) {
+            for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap().values()) {
                 String ipPortInternal = ipPortMap.getIpPortInternal();
                 String[] ipPortParts = ipPortInternal.split(":");
                 if (ipPortParts.length != 2) {
@@ -2198,9 +2210,9 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
                 LOG.error("removeNaptFlowsFromActiveSwitchInternetVpn : Unable to retrieve the IpPortMapping");
                 return;
             }
-            for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType()) {
+            for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType().values()) {
                 String protocol = intextIpProtocolType.getProtocol().name();
-                for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap()) {
+                for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap().values()) {
                     String ipPortInternal = ipPortMap.getIpPortInternal();
                     String[] ipPortParts = ipPortInternal.split(":");
                     if (ipPortParts.length != 2) {
@@ -2814,8 +2826,8 @@ public class ExternalRoutersListener extends AbstractAsyncDataTreeChangeListener
                     routerId);
             return;
         }
-        for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType()) {
-            for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap()) {
+        for (IntextIpProtocolType intextIpProtocolType : ipPortMapping.nonnullIntextIpProtocolType().values()) {
+            for (IpPortMap ipPortMap : intextIpProtocolType.nonnullIpPortMap().values()) {
                 String ipPortInternal = ipPortMap.getIpPortInternal();
                 String[] ipPortParts = ipPortInternal.split(":");
                 if (ipPortParts.length != 2) {