Add JSON output for routes CLI command
Change-Id: If4901d58da3130bf30439205e4e87cb1b1e157ad
diff --git a/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
index 1b4658e..b4bbf94 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RoutesListCommand.java
@@ -15,6 +15,10 @@
*/
package org.onosproject.cli.net;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.incubator.net.routing.Route;
@@ -45,14 +49,54 @@
Map<RouteTableId, Collection<Route>> allRoutes = service.getAllRoutes();
- allRoutes.forEach((id, routes) -> {
- print(FORMAT_TABLE, id);
- print(FORMAT_HEADER);
- routes.forEach(r -> print(FORMAT_ROUTE, r.prefix(), r.nextHop()));
- print(FORMAT_TOTAL, routes.size());
- print("");
- });
+ if (outputJson()) {
+ ObjectMapper mapper = new ObjectMapper();
+ ObjectNode result = mapper.createObjectNode();
+ result.set("routes4", json(allRoutes.get(new RouteTableId("ipv4"))));
+ result.set("routes6", json(allRoutes.get(new RouteTableId("ipv6"))));
+ print("%s", result);
+ } else {
+ allRoutes.forEach((id, routes) -> {
+ print(FORMAT_TABLE, id);
+ print(FORMAT_HEADER);
+ routes.forEach(r -> print(FORMAT_ROUTE, r.prefix(), r.nextHop()));
+ print(FORMAT_TOTAL, routes.size());
+ print("");
+ });
+ }
}
+ /**
+ * Produces a JSON array of routes.
+ *
+ * @param routes the routes with the data
+ * @return JSON array with the routes
+ */
+ private JsonNode json(Collection<Route> routes) {
+ ObjectMapper mapper = new ObjectMapper();
+ ArrayNode result = mapper.createArrayNode();
+
+ for (Route route : routes) {
+ result.add(json(mapper, route));
+ }
+ return result;
+ }
+
+ /**
+ * Produces JSON object for a route.
+ *
+ * @param mapper the JSON object mapper to use
+ * @param route the route with the data
+ * @return JSON object for the route
+ */
+ private ObjectNode json(ObjectMapper mapper, Route route) {
+ ObjectNode result = mapper.createObjectNode();
+
+ result.put("prefix", route.prefix().toString());
+ result.put("nextHop", route.nextHop().toString());
+
+ return result;
+ }
+
}