ONOS- 2946 Adding ability to view existing packet intercept requests and packet processors.
Change-Id: Id0d82fb4a19506ec607a71856dbf0c33c8e51baf
diff --git a/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java
new file mode 100644
index 0000000..ff66b80
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cli.net;
+
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.packet.PacketProcessor;
+import org.onosproject.net.packet.PacketService;
+
+import static org.onosproject.net.packet.PacketProcessor.ADVISOR_MAX;
+import static org.onosproject.net.packet.PacketProcessor.DIRECTOR_MAX;
+
+/**
+ * Lists packet processors.
+ */
+@Command(scope = "onos", name = "packet-processors",
+ description = "Lists packet processors")
+public class PacketProcessorsListCommand extends AbstractShellCommand {
+
+ private static final String FMT = "priority=%s, class=%s";
+
+ @Override
+ protected void execute() {
+ PacketService service = get(PacketService.class);
+ if (outputJson()) {
+ // TODO: implement this
+ print("Not implemented.");
+ } else {
+ service.getProcessors().forEach(this::print);
+ }
+ }
+
+ private void print(int priority, PacketProcessor processor) {
+ print(FMT, priorityFormat(priority), processor.getClass().getName());
+ }
+
+ private String priorityFormat(int priority) {
+ if (priority > DIRECTOR_MAX) {
+ return "observer(" + (priority - DIRECTOR_MAX - 1) + ")";
+ } else if (priority > ADVISOR_MAX) {
+ return "director(" + (priority - ADVISOR_MAX - 1) + ")";
+ }
+ return "advisor(" + (priority - 1) + ")";
+ }
+
+}
diff --git a/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java
new file mode 100644
index 0000000..9bdeadb
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cli.net;
+
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.packet.PacketRequest;
+import org.onosproject.net.packet.PacketService;
+
+/**
+ * Lists packet requests.
+ */
+@Command(scope = "onos", name = "packet-requests",
+ description = "Lists packet requests")
+public class PacketRequestsListCommand extends AbstractShellCommand {
+
+ private static final String FMT = "priority=%s, appId=%s, criteria=%s";
+
+ @Override
+ protected void execute() {
+ PacketService service = get(PacketService.class);
+ if (outputJson()) {
+ // TODO: implement this
+ print("Not implemented.");
+ } else {
+ service.getRequests().forEach(this::print);
+ }
+ }
+
+ private void print(PacketRequest request) {
+ print(FMT, request.priority(), request.appId().name(), request.selector().criteria());
+ }
+
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 9958849..459ffa9 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -351,6 +351,13 @@
</command>
<command>
+ <action class="org.onosproject.cli.net.PacketRequestsListCommand"/>
+ </command>
+ <command>
+ <action class="org.onosproject.cli.net.PacketProcessorsListCommand"/>
+ </command>
+
+ <command>
<action class="org.onosproject.cli.net.AddTestFlowsCommand"/>
</command>
<command>
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 & 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;
}
}