Support LB in kubevirt networking application.

Change-Id: I59578fc0b778173a20c958b641cf9bf1abe69bc6
(cherry picked from commit c8a8759e3adc292a429a4ca7173d15c220b7ea3c)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
index fd90e8a..1c045f3 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtLoadBalancerStore.java
@@ -16,6 +16,7 @@
 package org.onosproject.kubevirtnetworking.impl;
 
 import com.google.common.collect.ImmutableSet;
+import org.onlab.packet.IpAddress;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -42,6 +43,7 @@
 import org.slf4j.Logger;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
@@ -49,6 +51,8 @@
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerEvent.Type.KUBEVIRT_LOAD_BALANCER_CREATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerEvent.Type.KUBEVIRT_LOAD_BALANCER_MEMBER_ADDED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerEvent.Type.KUBEVIRT_LOAD_BALANCER_MEMBER_REMOVED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerEvent.Type.KUBEVIRT_LOAD_BALANCER_REMOVED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancerEvent.Type.KUBEVIRT_LOAD_BALANCER_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -168,9 +172,7 @@
                     break;
                 case UPDATE:
                     log.debug("Kubevirt load balancer updated");
-                    eventExecutor.execute(() ->
-                            notifyDelegate(new KubevirtLoadBalancerEvent(
-                                    KUBEVIRT_LOAD_BALANCER_UPDATED, event.newValue().value())));
+                    eventExecutor.execute(() -> processLoadBalancerMapUpdate(event));
                     break;
                 case REMOVE:
                     log.debug("Kubevirt load balancer removed");
@@ -183,5 +185,41 @@
                     break;
             }
         }
+
+        private void processLoadBalancerMapUpdate(MapEvent<String, KubevirtLoadBalancer> event) {
+            KubevirtLoadBalancer oldLb = event.oldValue().value();
+            KubevirtLoadBalancer newLb = event.newValue().value();
+
+            Set<IpAddress> added = new HashSet<>(newLb.members());
+            Set<IpAddress> oldSet = oldLb.members();
+
+            added.removeAll(oldSet);
+
+            if (added.size() > 0) {
+                notifyDelegate(new KubevirtLoadBalancerEvent(
+                        KUBEVIRT_LOAD_BALANCER_MEMBER_ADDED,
+                        newLb,
+                        added
+                ));
+            }
+
+            Set<IpAddress> removed = new HashSet<>(oldLb.members());
+            Set<IpAddress> newSet = newLb.members();
+            removed.removeAll(newSet);
+
+            if (removed.size() > 0) {
+                notifyDelegate(new KubevirtLoadBalancerEvent(
+                        KUBEVIRT_LOAD_BALANCER_MEMBER_REMOVED,
+                        newLb,
+                        removed
+                ));
+            }
+
+            notifyDelegate(new KubevirtLoadBalancerEvent(
+                    KUBEVIRT_LOAD_BALANCER_UPDATED,
+                    newLb,
+                    oldLb
+            ));
+        }
     }
 }