Added commands to list paths.
Added protection against bad input on some command-lines.
diff --git a/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
index 9a2bda8..e4f87ee 100644
--- a/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
@@ -31,4 +31,14 @@
System.out.println(String.format(format, args));
}
+ /**
+ * Prints the arguments using the specified format to error stream.
+ *
+ * @param format format string; see {@link String#format}
+ * @param args arguments
+ */
+ public static void error(String format, Object... args) {
+ System.err.println(String.format(format, args));
+ }
+
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
index d4d6d24..a6f3048 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
@@ -35,11 +35,16 @@
int cid = Integer.parseInt(id);
init();
TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
- List<DeviceId> ids = Lists.newArrayList(service.getClusterDevices(topology, cluster));
- Collections.sort(ids, ID_COMPARATOR);
- for (DeviceId deviceId : ids) {
- print("%s", deviceId);
+ if (cluster == null) {
+ error("No such cluster %s", cid);
+ } else {
+ List<DeviceId> ids = Lists.newArrayList(service.getClusterDevices(topology, cluster));
+ Collections.sort(ids, ID_COMPARATOR);
+ for (DeviceId deviceId : ids) {
+ print("%s", deviceId);
+ }
}
+
return null;
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
index 246c39e..be5105c 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
@@ -24,8 +24,12 @@
int cid = Integer.parseInt(id);
init();
TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
- for (Link link : service.getClusterLinks(topology, cluster)) {
- print(linkString(link));
+ if (cluster == null) {
+ error("No such cluster %s", cid);
+ } else {
+ for (Link link : service.getClusterLinks(topology, cluster)) {
+ print(linkString(link));
+ }
}
return null;
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
index 03fc555..8750424 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
@@ -42,7 +42,12 @@
printDevice(service, device);
}
} else {
- printDevice(service, service.getDevice(deviceId(uri)));
+ Device device = service.getDevice(deviceId(uri));
+ if (device == null) {
+ error("No such device %s", uri);
+ } else {
+ printDevice(service, device);
+ }
}
return null;
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
index 1cbeb6b..9a90ef2 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
@@ -56,10 +56,12 @@
* @param device infrastructure device
*/
protected void printDevice(DeviceService service, Device device) {
- print(FMT, device.id(), service.isAvailable(device.id()),
- service.getRole(device.id()), device.type(),
- device.manufacturer(), device.hwVersion(), device.swVersion(),
- device.serialNumber());
+ if (device != null) {
+ print(FMT, device.id(), service.isAvailable(device.id()),
+ service.getRole(device.id()), device.type(),
+ device.manufacturer(), device.hwVersion(), device.swVersion(),
+ device.serialNumber());
+ }
}
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
index e62fb05..d74f9e4 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
@@ -16,6 +16,7 @@
public class LinksListCommand extends AbstractShellCommand {
private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s";
+ private static final String COMPACT = "%s/%s-%s/%s";
@Argument(index = 0, name = "uri", description = "Device ID",
required = false, multiValued = false)
@@ -43,4 +44,16 @@
link.dst().deviceId(), link.dst().port(), link.type());
}
+
+ /**
+ * Returns a compact string representing the given link.
+ *
+ * @param link infrastructure link
+ * @return formatted link string
+ */
+ public static String compactLinkString(Link link) {
+ return String.format(COMPACT, link.src().deviceId(), link.src().port(),
+ link.dst().deviceId(), link.dst().port());
+ }
+
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
index 114d837..cdede0b 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
@@ -2,10 +2,12 @@
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.net.Link;
import org.onlab.onos.net.Path;
import java.util.Set;
+import static org.onlab.onos.cli.net.LinksListCommand.compactLinkString;
import static org.onlab.onos.net.DeviceId.deviceId;
/**
@@ -16,13 +18,13 @@
description = "Lists all shortest-paths paths between the specified source and destination devices")
public class PathListCommand extends TopologyCommand {
- private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s";
+ private static final String SEP = "==>";
@Argument(index = 0, name = "src", description = "Source device ID",
required = true, multiValued = false)
String src = null;
- @Argument(index = 0, name = "dst", description = "Destination device ID",
+ @Argument(index = 1, name = "dst", description = "Destination device ID",
required = true, multiValued = false)
String dst = null;
@@ -36,8 +38,20 @@
return null;
}
- private String pathString(Path path) {
- return path.toString();
+ /**
+ * Produces a formatted string representing the specified path.
+ *
+ * @param path network path
+ * @return formatted path string
+ */
+ protected String pathString(Path path) {
+ StringBuilder sb = new StringBuilder();
+ for (Link link : path.links()) {
+ sb.append(compactLinkString(link)).append(SEP);
+ }
+ sb.delete(sb.lastIndexOf(SEP), sb.length());
+ sb.append("; cost=").append(path.cost());
+ return sb.toString();
}
}
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 65a6c9e..1ed7931 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -35,6 +35,12 @@
<action class="org.onlab.onos.cli.net.TopologyCommand"/>
</command>
<command>
+ <action class="org.onlab.onos.cli.net.PathListCommand"/>
+ <completers>
+ <ref component-id="deviceIdCompleter"/>
+ </completers>
+ </command>
+ <command>
<action class="org.onlab.onos.cli.net.ClustersListCommand"/>
</command>
<command>