Initial implementation of SNAT functionality.

Change-Id: I9094755c6d25a62e527976b9bf275d7c1e2a3f86
(cherry picked from commit b9a220261df1f591b75d59b646aa834c1efdb7f1)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
index c11fb2d..93d7cc3 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
@@ -45,6 +45,7 @@
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
@@ -56,6 +57,9 @@
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_DISASSOCIATED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_REMOVED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_UPDATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_GATEWAY_NODE_ATTACHED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_GATEWAY_NODE_CHANGED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_GATEWAY_NODE_DETACHED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_CREATED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_EXTERNAL_NETWORK_ATTACHED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED;
@@ -297,6 +301,27 @@
                         KUBEVIRT_ROUTER_INTERNAL_NETWORKS_DETACHED,
                         router, removed));
             }
+            if (oldValue.electedGateway() == null
+                    && newValue.electedGateway() != null) {
+                notifyDelegate(new KubevirtRouterEvent(
+                        KUBEVIRT_GATEWAY_NODE_ATTACHED,
+                        router, newValue.electedGateway()));
+            }
+
+            if (oldValue.electedGateway() != null
+                    && newValue.electedGateway() == null) {
+                notifyDelegate(new KubevirtRouterEvent(
+                        KUBEVIRT_GATEWAY_NODE_DETACHED,
+                        router, oldValue.electedGateway()));
+            }
+
+            if (oldValue.electedGateway() != null
+                    && newValue.electedGateway() != null
+                    && !Objects.equals(oldValue.electedGateway(), newValue.electedGateway())) {
+                notifyDelegate(new KubevirtRouterEvent(
+                        KUBEVIRT_GATEWAY_NODE_CHANGED,
+                        router, oldValue.electedGateway()));
+            }
         }
     }