Purge internal map variables by leveraging persistent store

Change-Id: If347de18803a6f84a220e1ffdee26b9e1c28634b
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index 1f73566..f1440c1 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -17,7 +17,6 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -69,13 +68,11 @@
 import org.openstack4j.model.network.ExternalGateway;
 import org.openstack4j.model.network.IP;
 import org.openstack4j.model.network.NetFloatingIP;
-import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Router;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
 import java.nio.ByteBuffer;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -158,11 +155,6 @@
     private ApplicationId appId;
     private NodeId localNodeId;
 
-    private final Map<String, MacAddress> floatingIpMacMap = Maps.newConcurrentMap();
-
-    // TODO: pendingInstPortIds should be purged later
-    private final Map<String, NetFloatingIP> pendingInstPortIds = Maps.newConcurrentMap();
-
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
             groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
 
@@ -336,31 +328,6 @@
                 .anyMatch(ip -> IpAddress.valueOf(ip.getIpAddress()).equals(targetIp));
     }
 
-    private void initFloatingIpMacMap() {
-        osRouterService.floatingIps().forEach(f -> {
-            if (f.getPortId() != null && f.getFloatingIpAddress() != null) {
-                Port port = osNetworkAdminService.port(f.getPortId());
-                if (port != null && port.getMacAddress() != null) {
-                    floatingIpMacMap.put(f.getFloatingIpAddress(),
-                            MacAddress.valueOf(port.getMacAddress()));
-                }
-            }
-        });
-    }
-
-    private void initPendingInstPorts() {
-        osRouterService.floatingIps().forEach(f -> {
-            if (f.getPortId() != null) {
-                Port port = osNetworkAdminService.port(f.getPortId());
-                if (port != null) {
-                    if (!Strings.isNullOrEmpty(port.getDeviceId())) {
-                        pendingInstPortIds.put(f.getPortId(), f);
-                    }
-                }
-            }
-        });
-    }
-
     /**
      * Installs static ARP rules used in ARP BROAD_CAST mode.
      *
@@ -463,24 +430,14 @@
                 return;
             }
 
-            MacAddress targetMac;
-            InstancePort instPort;
-
-            if (install) {
-                if (fip.getPortId() != null) {
-                    String macString = osNetworkAdminService.port(fip.getPortId()).getMacAddress();
-                    targetMac = MacAddress.valueOf(macString);
-                    floatingIpMacMap.put(fip.getFloatingIpAddress(), targetMac);
-                } else {
-                    log.trace("Unknown target ARP request for {}, ignore it",
-                            fip.getFloatingIpAddress());
-                    return;
-                }
-            } else {
-                targetMac = floatingIpMacMap.get(fip.getFloatingIpAddress());
+            if (fip.getPortId() == null) {
+                log.trace("Unknown target ARP request for {}, ignore it",
+                                                    fip.getFloatingIpAddress());
+                return;
             }
 
-            instPort = instancePortService.instancePort(targetMac);
+            InstancePort instPort = instancePortService.instancePort(fip.getPortId());
+            MacAddress targetMac = instPort.macAddress();
 
             OpenstackNode gw = getGwByInstancePort(gateways, instPort);
 
@@ -690,13 +647,10 @@
             switch (event.type()) {
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
 
-                    if (pendingInstPortIds.containsKey(instPort.portId())) {
-                        Set<OpenstackNode> completedGws =
-                                osNodeService.completeNodes(GATEWAY);
-                        setFloatingIpArpRule(pendingInstPortIds.get(instPort.portId()),
-                                completedGws, true);
-                        pendingInstPortIds.remove(instPort.portId());
-                    }
+                    osRouterService.floatingIps().stream()
+                            .filter(f -> f.getPortId() != null)
+                            .filter(f -> f.getPortId().equals(instPort.portId()))
+                            .forEach(f -> setFloatingIpArpRule(f, gateways, true));
 
                     break;
                 case OPENSTACK_INSTANCE_MIGRATION_STARTED:
@@ -759,13 +713,6 @@
                 case OPENSTACK_NODE_COMPLETE:
                     setDefaultArpRule(osNode, true);
                     setFloatingIpArpRuleForGateway(osNode, true);
-
-                    // initialize FloatingIp to Mac map
-                    initFloatingIpMacMap();
-
-                    // initialize pendingInstPorts
-                    initPendingInstPorts();
-
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
                     setDefaultArpRule(osNode, false);