Fix: Add inst port to store if host updated with no inst port found

1. Remove purge state CLI and REST API
2. Remove stateful SNAT rules when removing router and ext gateway

Change-Id: I133e9f280690d2da9f65e39cb83618db41b72502
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
index 82413d4..ba90b7e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -51,10 +51,13 @@
 
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_NETWORK_ID;
 import static org.onosproject.openstacknetworking.api.Constants.ANNOTATION_PORT_ID;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
@@ -110,6 +113,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterService routerService;
 
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler"));
     private final InstancePortStoreDelegate
                             delegate = new InternalInstancePortStoreDelegate();
     private final InternalHostListener
@@ -308,22 +313,31 @@
 
             switch (event.type()) {
                 case HOST_UPDATED:
-                    updateInstancePort(instPort);
+                    eventExecutor.execute(() -> processHostUpdate(instPort));
                     break;
                 case HOST_ADDED:
-                    processHostAddition(instPort);
+                    eventExecutor.execute(() -> processHostAddition(instPort));
                     break;
                 case HOST_REMOVED:
-                    processHostRemoval(instPort);
+                    eventExecutor.execute(() -> processHostRemoval(instPort));
                     break;
                 case HOST_MOVED:
-                    processHostMove(event, instPort);
+                    eventExecutor.execute(() -> processHostMove(event, instPort));
                     break;
                 default:
                     break;
             }
         }
 
+        private void processHostUpdate(InstancePort instPort) {
+            InstancePort existingPort = instancePort(instPort.portId());
+            if (existingPort == null) {
+                createInstancePort(instPort);
+            } else {
+                updateInstancePort(instPort);
+            }
+        }
+
         private void processHostAddition(InstancePort instPort) {
             InstancePort existingPort = instancePort(instPort.portId());
             if (existingPort == null) {