Cleaned-up CLI commands.
diff --git a/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java b/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java
new file mode 100644
index 0000000..ee948d6
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/MastersListCommand.java
@@ -0,0 +1,40 @@
+package org.onlab.onos.cli;
+
+import com.google.common.collect.Lists;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.net.Comparators;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.cluster.MastershipService;
+import org.onlab.onos.net.DeviceId;
+
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
+/**
+ * Lists device mastership information.
+ */
+@Command(scope = "onos", name = "masters",
+ description = "Lists device mastership information")
+public class MastersListCommand extends AbstractShellCommand {
+
+ @Override
+ protected void execute() {
+ ClusterService service = get(ClusterService.class);
+ MastershipService mastershipService = get(MastershipService.class);
+ List<ControllerNode> nodes = newArrayList(service.getNodes());
+ Collections.sort(nodes, Comparators.NODE_COMPARATOR);
+ ControllerNode self = service.getLocalNode();
+ for (ControllerNode node : nodes) {
+ List<DeviceId> ids = Lists.newArrayList(mastershipService.getDevicesOf(node.id()));
+ Collections.sort(ids, Comparators.ELEMENT_ID_COMPARATOR);
+ print("%s: %d devices", node.id(), ids.size());
+ for (DeviceId deviceId : ids) {
+ print(" %s", deviceId);
+ }
+ }
+ }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java b/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java
new file mode 100644
index 0000000..c47189e
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/NodeIdCompleter.java
@@ -0,0 +1,33 @@
+package org.onlab.onos.cli;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.cluster.ControllerNode;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
+/**
+ * Node ID completer.
+ */
+public class NodeIdCompleter implements Completer {
+ @Override
+ public int complete(String buffer, int cursor, List<String> candidates) {
+ // Delegate string completer
+ StringsCompleter delegate = new StringsCompleter();
+
+ // Fetch our service and feed it's offerings to the string completer
+ ClusterService service = AbstractShellCommand.get(ClusterService.class);
+ Iterator<ControllerNode> it = service.getNodes().iterator();
+ SortedSet<String> strings = delegate.getStrings();
+ while (it.hasNext()) {
+ strings.add(it.next().id().toString());
+ }
+
+ // Now let the completer do the work for figuring out what to offer.
+ return delegate.complete(buffer, cursor, candidates);
+ }
+
+}
diff --git a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
index 1e921b4..020179e 100644
--- a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
@@ -1,11 +1,11 @@
package org.onlab.onos.cli;
import org.apache.karaf.shell.commands.Command;
+import org.onlab.onos.cli.net.Comparators;
import org.onlab.onos.cluster.ClusterService;
import org.onlab.onos.cluster.ControllerNode;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@@ -20,19 +20,11 @@
private static final String FMT =
"id=%s, ip=%s, state=%s %s";
- protected static final Comparator<ControllerNode> ID_COMPARATOR =
- new Comparator<ControllerNode>() {
- @Override
- public int compare(ControllerNode ci1, ControllerNode ci2) {
- return ci1.id().toString().compareTo(ci2.id().toString());
- }
- };
-
@Override
protected void execute() {
ClusterService service = get(ClusterService.class);
List<ControllerNode> nodes = newArrayList(service.getNodes());
- Collections.sort(nodes, ID_COMPARATOR);
+ Collections.sort(nodes, Comparators.NODE_COMPARATOR);
ControllerNode self = service.getLocalNode();
for (ControllerNode node : nodes) {
print(FMT, node.id(), node.ip(),
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 f0217de..9c68244 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
@@ -7,7 +7,6 @@
import org.onlab.onos.net.topology.TopologyCluster;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import static org.onlab.onos.net.topology.ClusterId.clusterId;
@@ -23,13 +22,6 @@
required = false, multiValued = false)
String id = null;
- protected static final Comparator<DeviceId> ID_COMPARATOR = new Comparator<DeviceId>() {
- @Override
- public int compare(DeviceId id1, DeviceId id2) {
- return id1.uri().toString().compareTo(id2.uri().toString());
- }
- };
-
@Override
protected void execute() {
int cid = Integer.parseInt(id);
@@ -39,7 +31,7 @@
error("No such cluster %s", cid);
} else {
List<DeviceId> ids = Lists.newArrayList(service.getClusterDevices(topology, cluster));
- Collections.sort(ids, ID_COMPARATOR);
+ Collections.sort(ids, Comparators.ELEMENT_ID_COMPARATOR);
for (DeviceId deviceId : ids) {
print("%s", deviceId);
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
index fe67348..d2d452f 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
@@ -5,7 +5,6 @@
import org.onlab.onos.net.topology.TopologyCluster;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
/**
@@ -18,19 +17,11 @@
private static final String FMT =
"id=%d, devices=%d, links=%d";
- protected static final Comparator<TopologyCluster> ID_COMPARATOR =
- new Comparator<TopologyCluster>() {
- @Override
- public int compare(TopologyCluster c1, TopologyCluster c2) {
- return c1.id().index() - c2.id().index();
- }
- };
-
@Override
protected void execute() {
init();
List<TopologyCluster> clusters = Lists.newArrayList(service.getClusters(topology));
- Collections.sort(clusters, ID_COMPARATOR);
+ Collections.sort(clusters, Comparators.CLUSTER_COMPARATOR);
for (TopologyCluster cluster : clusters) {
print(FMT, cluster.id().index(), cluster.deviceCount(), cluster.linkCount());
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java b/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java
new file mode 100644
index 0000000..3bb1e4d
--- /dev/null
+++ b/cli/src/main/java/org/onlab/onos/cli/net/Comparators.java
@@ -0,0 +1,64 @@
+package org.onlab.onos.cli.net;
+
+import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.net.Element;
+import org.onlab.onos.net.ElementId;
+import org.onlab.onos.net.Port;
+import org.onlab.onos.net.flow.FlowRule;
+import org.onlab.onos.net.topology.TopologyCluster;
+
+import java.util.Comparator;
+
+/**
+ * Various comparators.
+ */
+public final class Comparators {
+
+ // Ban construction
+ private Comparators() {
+ }
+
+ public static final Comparator<ElementId> ELEMENT_ID_COMPARATOR = new Comparator<ElementId>() {
+ @Override
+ public int compare(ElementId id1, ElementId id2) {
+ return id1.uri().toString().compareTo(id2.uri().toString());
+ }
+ };
+
+ public static final Comparator<Element> ELEMENT_COMPARATOR = new Comparator<Element>() {
+ @Override
+ public int compare(Element e1, Element e2) {
+ return e1.id().uri().toString().compareTo(e2.id().uri().toString());
+ }
+ };
+
+ public static final Comparator<FlowRule> FLOW_RULE_COMPARATOR = new Comparator<FlowRule>() {
+ @Override
+ public int compare(FlowRule f1, FlowRule f2) {
+ return Long.valueOf(f1.id().value()).compareTo(f2.id().value());
+ }
+ };
+
+ public static final Comparator<Port> PORT_COMPARATOR = new Comparator<Port>() {
+ @Override
+ public int compare(Port p1, Port p2) {
+ long delta = p1.number().toLong() - p2.number().toLong();
+ return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
+ }
+ };
+
+ public static final Comparator<TopologyCluster> CLUSTER_COMPARATOR = new Comparator<TopologyCluster>() {
+ @Override
+ public int compare(TopologyCluster c1, TopologyCluster c2) {
+ return c1.id().index() - c2.id().index();
+ }
+ };
+
+ public static final Comparator<ControllerNode> NODE_COMPARATOR = new Comparator<ControllerNode>() {
+ @Override
+ public int compare(ControllerNode ci1, ControllerNode ci2) {
+ return ci1.id().toString().compareTo(ci2.id().toString());
+ }
+ };
+
+}
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 e62fe56..1382896 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
@@ -8,7 +8,6 @@
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import static org.onlab.onos.net.DeviceId.deviceId;
@@ -26,14 +25,6 @@
required = false, multiValued = false)
String uri = null;
- private static final Comparator<Port> PORT_COMPARATOR = new Comparator<Port>() {
- @Override
- public int compare(Port p1, Port p2) {
- long delta = p1.number().toLong() - p2.number().toLong();
- return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
- }
- };
-
@Override
protected void execute() {
DeviceService service = get(DeviceService.class);
@@ -55,7 +46,7 @@
protected void printDevice(DeviceService service, Device device) {
super.printDevice(service, device);
List<Port> ports = new ArrayList<>(service.getPorts(device.id()));
- Collections.sort(ports, PORT_COMPARATOR);
+ Collections.sort(ports, Comparators.PORT_COMPARATOR);
for (Port port : ports) {
print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled");
}
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 be102f2..6ecb482 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
@@ -6,7 +6,6 @@
import org.onlab.onos.net.device.DeviceService;
import java.util.Collections;
-import java.util.Comparator;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
@@ -21,13 +20,6 @@
private static final String FMT =
"id=%s, available=%s, role=%s, type=%s, mfr=%s, hw=%s, sw=%s, serial=%s";
- protected static final Comparator<Device> ID_COMPARATOR = new Comparator<Device>() {
- @Override
- public int compare(Device d1, Device d2) {
- return d1.id().uri().toString().compareTo(d2.id().uri().toString());
- }
- };
-
@Override
protected void execute() {
DeviceService service = get(DeviceService.class);
@@ -44,7 +36,7 @@
*/
protected List<Device> getSortedDevices(DeviceService service) {
List<Device> devices = newArrayList(service.getDevices());
- Collections.sort(devices, ID_COMPARATOR);
+ Collections.sort(devices, Comparators.ELEMENT_COMPARATOR);
return devices;
}
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
index c2ca416..da43255 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
@@ -1,12 +1,6 @@
package org.onlab.onos.cli.net;
-import static com.google.common.collect.Lists.newArrayList;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.collect.Maps;
import org.apache.karaf.shell.commands.Command;
import org.onlab.onos.cli.AbstractShellCommand;
import org.onlab.onos.net.Device;
@@ -14,7 +8,11 @@
import org.onlab.onos.net.flow.FlowRule;
import org.onlab.onos.net.flow.FlowRuleService;
-import com.google.common.collect.Maps;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.collect.Lists.newArrayList;
/**
* Lists all currently-known hosts.
@@ -26,13 +24,6 @@
private static final String FMT =
" id=%s, selector=%s, treatment=%s, state=%s";
- protected static final Comparator<FlowRule> ID_COMPARATOR = new Comparator<FlowRule>() {
- @Override
- public int compare(FlowRule f1, FlowRule f2) {
- return Long.valueOf(f1.id().value()).compareTo(f2.id().value());
- }
- };
-
@Override
protected void execute() {
DeviceService deviceService = get(DeviceService.class);
@@ -43,7 +34,6 @@
}
}
-
/**
* Returns the list of devices sorted using the device ID URIs.
*
@@ -55,7 +45,7 @@
List<FlowRule> rules;
for (Device d : deviceService.getDevices()) {
rules = newArrayList(service.getFlowEntries(d.id()));
- Collections.sort(rules, ID_COMPARATOR);
+ Collections.sort(rules, Comparators.FLOW_RULE_COMPARATOR);
flows.put(d, rules);
}
return flows;
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java b/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
index 6da2d82..72c6a41 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/HostIdCompleter.java
@@ -1,15 +1,15 @@
package org.onlab.onos.cli.net;
-import java.util.Iterator;
-import java.util.List;
-import java.util.SortedSet;
-
import org.apache.karaf.shell.console.Completer;
import org.apache.karaf.shell.console.completer.StringsCompleter;
import org.onlab.onos.cli.AbstractShellCommand;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.host.HostService;
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedSet;
+
public class HostIdCompleter implements Completer {
@Override
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
index 29919a8..4e1f16b 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
@@ -1,16 +1,15 @@
package org.onlab.onos.cli.net;
-import static com.google.common.collect.Lists.newArrayList;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
import org.apache.karaf.shell.commands.Command;
import org.onlab.onos.cli.AbstractShellCommand;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.host.HostService;
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.collect.Lists.newArrayList;
+
/**
* Lists all currently-known hosts.
*/
@@ -21,13 +20,6 @@
private static final String FMT =
"id=%s, mac=%s, location=%s/%s, vlan=%s, ip(s)=%s";
- protected static final Comparator<Host> ID_COMPARATOR = new Comparator<Host>() {
- @Override
- public int compare(Host h1, Host h2) {
- return h1.id().uri().toString().compareTo(h2.id().uri().toString());
- }
- };
-
@Override
protected void execute() {
HostService service = get(HostService.class);
@@ -44,7 +36,7 @@
*/
protected List<Host> getSortedHosts(HostService service) {
List<Host> hosts = newArrayList(service.getHosts());
- Collections.sort(hosts, ID_COMPARATOR);
+ Collections.sort(hosts, Comparators.ELEMENT_COMPARATOR);
return hosts;
}
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 4361bd7..f5226b1 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
@@ -41,7 +41,6 @@
public static String linkString(Link link) {
return String.format(FMT, link.src().deviceId(), link.src().port(),
link.dst().deviceId(), link.dst().port(), link.type());
-
}
/**
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 419ed16..5284477 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -5,8 +5,12 @@
<action class="org.onlab.onos.cli.NodesListCommand"/>
</command>
<command>
- <action class="org.onlab.onos.cli.net.FlowsListCommand"/>
+ <action class="org.onlab.onos.cli.MastersListCommand"/>
+ <completers>
+ <ref component-id="clusterIdCompleter"/>
+ </completers>
</command>
+
<command>
<action class="org.onlab.onos.cli.net.DevicesListCommand"/>
</command>
@@ -67,10 +71,15 @@
</command>
<command>
+ <action class="org.onlab.onos.cli.net.FlowsListCommand"/>
+ </command>
+
+ <command>
<action class="org.onlab.onos.cli.net.WipeOutCommand"/>
</command>
</command-bundle>
+ <bean id="nodeIdCompleter" class="org.onlab.onos.cli.NodeIdCompleter"/>
<bean id="deviceIdCompleter" class="org.onlab.onos.cli.net.DeviceIdCompleter"/>
<bean id="clusterIdCompleter" class="org.onlab.onos.cli.net.ClusterIdCompleter"/>
<bean id="roleCompleter" class="org.onlab.onos.cli.net.RoleCompleter"/>