[ONOS-4480] Implement select group based load balancing

 - Implements select group handler for vxlan tunnel based network
 - Implements update bucket method for select type group

Change-Id: Ic58f298f9be6d5c9c8036fb521c2ffb6d0bb62ee
diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
index f837546..44db634 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
@@ -39,6 +39,10 @@
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.group.Group;
+import org.onosproject.net.group.GroupDescription;
+import org.onosproject.net.group.GroupService;
 import org.onosproject.scalablegateway.api.GatewayNode;
 import org.onosproject.scalablegateway.api.GatewayNodeConfig;
 import org.onosproject.scalablegateway.api.ScalableGatewayService;
@@ -81,7 +85,14 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverService driverService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected GroupService groupService;
+
     private GatewayNodeConfig config;
+    private SelectGroupHandler selectGroupHandler;
 
     private final NetworkConfigListener configListener = new InternalConfigListener();
 
@@ -100,6 +111,7 @@
         configRegistry.registerConfigFactory(configFactory);
         configService.addListener(configListener);
 
+        selectGroupHandler = new SelectGroupHandler(groupService, deviceService, driverService, appId);
         readConfiguration();
 
         log.info("started");
@@ -141,8 +153,10 @@
 
     @Override
     public GroupId getGroupIdForGatewayLoadBalance(DeviceId srcDeviceId) {
-        //TODO: Implement group generation method by handler
-        return null;
+        GroupDescription description = selectGroupHandler.createSelectGroupInVxlan(srcDeviceId, getGatewayNodes());
+        groupService.addGroup(description);
+        Group group = groupService.getGroup(description.deviceId(), description.appCookie());
+        return group != null ? group.id() : null;
     }
 
     @Override