Initial commit to implement external loadbalancer for kubernetes pods.
  - Adds elb-related parameters in KubevirtNode class
  - Defines KubernetesExternalLb and related service, manager and store.

Change-Id: I68476887af493c7daeaf1dca0320218f1764653f
(cherry picked from commit 734b5532e87da5e7f9ee9c5e63de2a3771fd8409)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index de71f29..3496008 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -41,6 +41,7 @@
 import org.onosproject.cfg.ConfigProperty;
 import org.onosproject.kubevirtnetworking.api.DefaultKubevirtNetwork;
 import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubernetesExternalLb;
 import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
 import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
 import org.onosproject.kubevirtnetworking.api.KubevirtLoadBalancer;
@@ -542,6 +543,28 @@
     }
 
     /**
+     * Returns the gateway node for the specified kubernetes external lb.
+     * Among gateways, only one gateway would act as a gateway per external lb.
+     * Currently gateway node is selected based on modulo operation with router hashcode.
+     *
+     * @param nodeService kubevirt node service
+     * @param externalLb kubernetes external lb
+     * @return elected gateway node
+     */
+    public static KubevirtNode gatewayNodeForSpecifiedService(KubevirtNodeService nodeService,
+                                                              KubernetesExternalLb externalLb) {
+        //TODO: enhance election logic for a better load balancing
+
+        int numOfGateways = nodeService.completeNodes(GATEWAY).size();
+        if (numOfGateways == 0) {
+            return null;
+        }
+
+        return (KubevirtNode) nodeService.completeNodes(GATEWAY)
+                .toArray()[externalLb.hashCode() % numOfGateways];
+    }
+
+    /**
      * Returns the mac address of the router.
      *
      * @param router kubevirt router