Segment Routing refactor with flow objectives

Change-Id: I0b87f89bb8b18522b9d38bdf5e96f55485b6f1e3
diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 956fc1e..b7167c8 100644
--- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -36,12 +36,10 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.group.GroupEvent;
 import org.onosproject.net.group.GroupKey;
-import org.onosproject.net.group.GroupListener;
-import org.onosproject.net.group.GroupService;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.link.LinkEvent;
@@ -68,7 +66,8 @@
 @Component(immediate = true)
 public class SegmentRoutingManager {
 
-    private static Logger log = LoggerFactory.getLogger(SegmentRoutingManager.class);
+    private static Logger log = LoggerFactory
+            .getLogger(SegmentRoutingManager.class);
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
@@ -89,15 +88,12 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected FlowRuleService flowRuleService;
+    protected FlowObjectiveService flowObjectiveService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected LinkService linkService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected GroupService groupService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MastershipService mastershipService;
     protected ArpHandler arpHandler = null;
     protected IcmpHandler icmpHandler = null;
@@ -110,12 +106,12 @@
     private InternalPacketProcessor processor = new InternalPacketProcessor();
     private InternalEventHandler eventHandler = new InternalEventHandler();
 
-    private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
+    private ScheduledExecutorService executorService = Executors
+            .newScheduledThreadPool(1);
 
     private static ScheduledFuture<?> eventHandlerFuture = null;
     private ConcurrentLinkedQueue<Event> eventQueue = new ConcurrentLinkedQueue<Event>();
-    private Map<DeviceId, DefaultGroupHandler> groupHandlerMap
-            = new ConcurrentHashMap<DeviceId, DefaultGroupHandler>();
+    private Map<DeviceId, DefaultGroupHandler> groupHandlerMap = new ConcurrentHashMap<DeviceId, DefaultGroupHandler>();
 
     private NetworkConfigManager networkConfigService = new NetworkConfigManager();;
 
@@ -125,7 +121,8 @@
 
     @Activate
     protected void activate() {
-        appId = coreService.registerApplication("org.onosproject.segmentrouting");
+        appId = coreService
+                .registerApplication("org.onosproject.segmentrouting");
         networkConfigService.init();
         deviceConfiguration = new DeviceConfiguration(networkConfigService);
         arpHandler = new ArpHandler(this);
@@ -136,25 +133,22 @@
 
         packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 2);
         linkService.addListener(new InternalLinkListener());
-        groupService.addListener(new InternalGroupListener());
         deviceService.addListener(new InternalDeviceListener());
 
-        for (Device device: deviceService.getDevices()) {
-            if (mastershipService.
-                    getLocalRole(device.id()) == MastershipRole.MASTER) {
-                DefaultGroupHandler groupHandler =
-                    DefaultGroupHandler.createGroupHandler(device.id(),
-                            appId, deviceConfiguration, linkService, groupService);
-                groupHandler.createGroups();
+        for (Device device : deviceService.getDevices()) {
+            if (mastershipService.getLocalRole(device.id()) == MastershipRole.MASTER) {
+                DefaultGroupHandler groupHandler = DefaultGroupHandler
+                        .createGroupHandler(device.id(), appId,
+                                            deviceConfiguration, linkService,
+                                            flowObjectiveService);
                 groupHandlerMap.put(device.id(), groupHandler);
                 defaultRoutingHandler.populateTtpRules(device.id());
                 log.debug("Initiating default group handling for {}", device.id());
             } else {
                 log.debug("Activate: Local role {} "
-                                + "is not MASTER for device {}",
-                        mastershipService.
-                                getLocalRole(device.id()),
-                        device.id());
+                                  + "is not MASTER for device {}",
+                          mastershipService.getLocalRole(device.id()),
+                          device.id());
             }
         }
 
@@ -177,13 +171,19 @@
      */
     public GroupKey getGroupKey(NeighborSet ns) {
 
-        for (DefaultGroupHandler groupHandler: groupHandlerMap.values()) {
+        for (DefaultGroupHandler groupHandler : groupHandlerMap.values()) {
             return groupHandler.getGroupKey(ns);
         }
 
         return null;
     }
 
+    public int getNextObjectiveId(DeviceId deviceId, NeighborSet ns) {
+
+        return (groupHandlerMap.get(deviceId) != null) ? groupHandlerMap
+                .get(deviceId).getNextObjectiveId(ns) : -1;
+    }
+
     private class InternalPacketProcessor implements PacketProcessor {
 
         @Override
@@ -213,8 +213,8 @@
     private class InternalLinkListener implements LinkListener {
         @Override
         public void event(LinkEvent event) {
-            if (event.type() == LinkEvent.Type.LINK_ADDED ||
-                    event.type() == LinkEvent.Type.LINK_REMOVED) {
+            if (event.type() == LinkEvent.Type.LINK_ADDED
+                    || event.type() == LinkEvent.Type.LINK_REMOVED) {
                 scheduleEventHandlerIfNotScheduled(event);
             }
         }
@@ -224,12 +224,10 @@
 
         @Override
         public void event(DeviceEvent event) {
-            if (mastershipService.
-                    getLocalRole(event.subject().id()) != MastershipRole.MASTER) {
+            if (mastershipService.getLocalRole(event.subject().id()) != MastershipRole.MASTER) {
                 log.debug("Local role {} is not MASTER for device {}",
-                        mastershipService.
-                                getLocalRole(event.subject().id()),
-                        event.subject().id());
+                          mastershipService.getLocalRole(event.subject().id()),
+                          event.subject().id());
                 return;
             }
 
@@ -245,38 +243,18 @@
         }
     }
 
-    private class InternalGroupListener implements GroupListener {
-
-        @Override
-        public void event(GroupEvent event) {
-            switch (event.type()) {
-                case GROUP_ADDED:
-                    scheduleEventHandlerIfNotScheduled(event);
-                    break;
-                case GROUP_ADD_REQUESTED:
-                    log.info("Group add requested");
-                    break;
-                case GROUP_UPDATED:
-                    break;
-                default:
-                    log.warn("Unhandled group event type: {}", event.type());
-            }
-        }
-    }
-
     private void scheduleEventHandlerIfNotScheduled(Event event) {
 
         eventQueue.add(event);
         numOfEvents++;
-        if (eventHandlerFuture == null ||
-                eventHandlerFuture.isDone()) {
-            eventHandlerFuture = executorService.schedule(eventHandler,
-                    100, TimeUnit.MILLISECONDS);
+        if (eventHandlerFuture == null || eventHandlerFuture.isDone()) {
+            eventHandlerFuture = executorService
+                    .schedule(eventHandler, 100, TimeUnit.MILLISECONDS);
             numOfHandlerScheduled++;
         }
 
         log.trace("numOfEvents {}, numOfEventHanlderScheduled {}", numOfEvents,
-                numOfHandlerScheduled);
+                  numOfHandlerScheduled);
 
     }
 
@@ -301,25 +279,22 @@
                     }
                 } else if (event.type() == DeviceEvent.Type.PORT_REMOVED) {
                     processPortRemoved((Device) event.subject(),
-                            ((DeviceEvent) event).port());
+                                       ((DeviceEvent) event).port());
                 } else {
                     log.warn("Unhandled event type: {}", event.type());
                 }
             }
             log.debug("numOfHandlerExecution {} numOfEventHanlderScheduled {} numOfEvents {}",
-                    numOfHandlerExecution, numOfHandlerScheduled, numOfEvents);
+                      numOfHandlerExecution, numOfHandlerScheduled, numOfEvents);
         }
     }
 
-
-
     private void processLinkAdded(Link link) {
         log.debug("A new link {} was added", link.toString());
 
-        if (mastershipService.
-                getLocalRole(link.src().deviceId()) == MastershipRole.MASTER) {
-            DefaultGroupHandler groupHandler =
-                    groupHandlerMap.get(link.src().deviceId());
+        if (mastershipService.getLocalRole(link.src().deviceId()) == MastershipRole.MASTER) {
+            DefaultGroupHandler groupHandler = groupHandlerMap.get(link.src()
+                    .deviceId());
             if (groupHandler != null) {
                 groupHandler.linkUp(link);
             }
@@ -332,7 +307,6 @@
         defaultRoutingHandler.populateRoutingRulesForLinkStatusChange(link);
     }
 
-
     private void processGroupAdded(Group group) {
         log.debug("A new group with ID {} was added", group.id());
         defaultRoutingHandler.resumePopulationProcess();
@@ -341,20 +315,14 @@
     private void processDeviceAdded(Device device) {
         log.debug("A new device with ID {} was added", device.id());
         defaultRoutingHandler.populateTtpRules(device.id());
-        DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(
-                device.id(),
-                appId,
-                deviceConfiguration,
-                linkService,
-                groupService);
-        dgh.createGroups();
+        DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(device
+                .id(), appId, deviceConfiguration, linkService, flowObjectiveService);
         groupHandlerMap.put(device.id(), dgh);
     }
 
     private void processPortRemoved(Device device, Port port) {
         log.debug("Port {} was removed", port.toString());
-        DefaultGroupHandler groupHandler =
-                groupHandlerMap.get(device.id());
+        DefaultGroupHandler groupHandler = groupHandlerMap.get(device.id());
         if (groupHandler != null) {
             groupHandler.portDown(port.number());
         }