ONOS- 2946 Adding ability to view existing packet intercept requests and packet processors.

Change-Id: Id0d82fb4a19506ec607a71856dbf0c33c8e51baf
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketProcessor.java b/core/api/src/main/java/org/onosproject/net/packet/PacketProcessor.java
index e700d62..0eba1b4 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/PacketProcessor.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketProcessor.java
@@ -24,7 +24,7 @@
 
     int ADVISOR_MAX = Integer.MAX_VALUE / 3;
     int DIRECTOR_MAX = (Integer.MAX_VALUE / 3) * 2;
-    static final int OBSERVER_MAX = Integer.MAX_VALUE;
+    int OBSERVER_MAX = Integer.MAX_VALUE;
 
     /**
      * Returns a priority in the ADVISOR range, where processors can take early action and
@@ -38,7 +38,7 @@
     static int advisor(int priority) {
         int overallPriority = priority + 1;
         checkArgument(overallPriority > 0 && overallPriority <= ADVISOR_MAX,
-                "Priority not within ADVISOR range");
+                      "Priority not within ADVISOR range");
         return overallPriority;
     }
 
@@ -53,7 +53,7 @@
     static int director(int priority) {
         int overallPriority = ADVISOR_MAX + priority + 1;
         checkArgument(overallPriority > ADVISOR_MAX && overallPriority <= DIRECTOR_MAX,
-                "Priority not within DIRECTOR range");
+                      "Priority not within DIRECTOR range");
         return overallPriority;
     }
 
@@ -68,8 +68,8 @@
      */
     static int observer(int priority) {
         int overallPriority = DIRECTOR_MAX + priority + 1;
-        checkArgument(overallPriority > DIRECTOR_MAX && overallPriority <= OBSERVER_MAX,
-                "Priority not within OBSERVER range");
+        checkArgument(overallPriority > DIRECTOR_MAX,
+                      "Priority not within OBSERVER range");
         return overallPriority;
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketService.java b/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
index 06c416e..98f4d8e 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketService.java
@@ -15,9 +15,13 @@
  */
 package org.onosproject.net.packet;
 
+import com.google.common.annotations.Beta;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.flow.TrafficSelector;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * Service for intercepting data plane packets and for emitting synthetic
  * outbound packets.
@@ -48,6 +52,15 @@
     void removeProcessor(PacketProcessor processor);
 
     /**
+     * Returns priority bindings of all registered packet processors.
+     *
+     * @return list of existing packet processors
+     */
+    @Beta
+    // TODO: Consider returning list of PacketProcessorEntry with processor, priority and stats
+    Map<Integer, PacketProcessor> getProcessors();
+
+    /**
      * Requests that packets matching the given selector are punted from the
      * dataplane to the controller.
      *
@@ -70,6 +83,13 @@
                        ApplicationId appId);
 
     /**
+     * Returns list of all existing requests ordered by priority.
+     *
+     * @return list of existing packet requests
+     */
+    List<PacketRequest> getRequests();
+
+    /**
      * Emits the specified outbound packet onto the network.
      *
      * @param packet outbound packet
diff --git a/core/api/src/main/java/org/onosproject/net/packet/PacketStore.java b/core/api/src/main/java/org/onosproject/net/packet/PacketStore.java
index ff45cc0..97f7cb5 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/PacketStore.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/PacketStore.java
@@ -17,7 +17,7 @@
 
 import org.onosproject.store.Store;
 
-import java.util.Set;
+import java.util.List;
 
 /**
  * Manages routing of outbound packets.
@@ -52,8 +52,8 @@
     /**
      * Obtains all existing requests in the system.
      *
-     * @return a set of packet requests
+     * @return list of packet requests in order of priority
      */
-    Set<PacketRequest> existingRequests();
+    List<PacketRequest> existingRequests();
 
 }
diff --git a/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
index afe936b..c438659 100644
--- a/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/packet/PacketServiceAdapter.java
@@ -18,6 +18,9 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.flow.TrafficSelector;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * Test adapter for packet service.
  */
@@ -31,6 +34,16 @@
     }
 
     @Override
+    public Map<Integer, PacketProcessor> getProcessors() {
+        return null;
+    }
+
+    @Override
+    public List<PacketRequest> getRequests() {
+        return null;
+    }
+
+    @Override
     public void requestPackets(TrafficSelector selector, PacketPriority priority, ApplicationId appId) {
     }
 
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
index 4345aba..f835926 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.store.trivial;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
@@ -26,8 +27,7 @@
 import org.onosproject.net.packet.PacketStoreDelegate;
 import org.onosproject.store.AbstractStore;
 
-
-import java.util.Collections;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -57,8 +57,8 @@
     }
 
     @Override
-    public Set<PacketRequest> existingRequests() {
-        return Collections.unmodifiableSet(requests);
+    public List<PacketRequest> existingRequests() {
+        return ImmutableList.copyOf(requests);
     }
 
 }
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 75239fd..a0bc693 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.packet.impl;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -53,6 +54,7 @@
 import org.onosproject.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
@@ -61,8 +63,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.slf4j.LoggerFactory.getLogger;
 import static org.onosproject.security.AppPermission.Type.*;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides a basic implementation of the packet SB &amp; NB APIs.
@@ -138,6 +140,11 @@
     }
 
     @Override
+    public Map<Integer, PacketProcessor> getProcessors() {
+        return ImmutableMap.copyOf(processors);
+    }
+
+    @Override
     public void requestPackets(TrafficSelector selector, PacketPriority priority,
                                ApplicationId appId) {
         checkPermission(PACKET_READ);
@@ -163,6 +170,11 @@
         }
     }
 
+    @Override
+    public List<PacketRequest> getRequests() {
+        return store.existingRequests();
+    }
+
     /**
      * Pushes a packet request flow rule to all devices.
      *
diff --git a/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java b/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
index 24ce215..d4c89c9 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.store.packet.impl;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -45,6 +45,7 @@
 import org.slf4j.Logger;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -152,7 +153,7 @@
     }
 
     @Override
-    public Set<PacketRequest> existingRequests() {
+    public List<PacketRequest> existingRequests() {
         return tracker.requests();
     }
 
@@ -197,10 +198,11 @@
             return requests.replace(request.selector(), old.version(), newSet);
         }
 
-        public Set<PacketRequest> requests() {
-            ImmutableSet.Builder<PacketRequest> builder = ImmutableSet.builder();
-            requests.values().forEach(v -> builder.addAll(v.value()));
-            return builder.build();
+        public List<PacketRequest> requests() {
+            List<PacketRequest> list = Lists.newArrayList();
+            requests.values().forEach(v -> list.addAll(v.value()));
+            list.sort((o1, o2) -> o1.priority().priorityValue() - o2.priority().priorityValue());
+            return list;
         }
 
     }