Added CLI support for showing key/value annotations for devices, ports, links & hosts.
Showing
5 changed files
with
48 additions
and
10 deletions
| ... | @@ -18,10 +18,13 @@ | ... | @@ -18,10 +18,13 @@ |
| 18 | */ | 18 | */ |
| 19 | package org.onlab.onos.cli; | 19 | package org.onlab.onos.cli; |
| 20 | 20 | ||
| 21 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 22 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 21 | import org.apache.karaf.shell.commands.Option; | 23 | import org.apache.karaf.shell.commands.Option; |
| 22 | import org.apache.karaf.shell.console.OsgiCommandSupport; | 24 | import org.apache.karaf.shell.console.OsgiCommandSupport; |
| 23 | import org.onlab.onos.ApplicationId; | 25 | import org.onlab.onos.ApplicationId; |
| 24 | import org.onlab.onos.CoreService; | 26 | import org.onlab.onos.CoreService; |
| 27 | +import org.onlab.onos.net.Annotations; | ||
| 25 | import org.onlab.osgi.DefaultServiceDirectory; | 28 | import org.onlab.osgi.DefaultServiceDirectory; |
| 26 | import org.onlab.osgi.ServiceNotFoundException; | 29 | import org.onlab.osgi.ServiceNotFoundException; |
| 27 | 30 | ||
| ... | @@ -76,6 +79,34 @@ public abstract class AbstractShellCommand extends OsgiCommandSupport { | ... | @@ -76,6 +79,34 @@ public abstract class AbstractShellCommand extends OsgiCommandSupport { |
| 76 | } | 79 | } |
| 77 | 80 | ||
| 78 | /** | 81 | /** |
| 82 | + * Produces a string image of the specified key/value annotations. | ||
| 83 | + * | ||
| 84 | + * @param annotations key/value annotations | ||
| 85 | + * @return string image with ", k1=v1, k2=v2, ..." pairs | ||
| 86 | + */ | ||
| 87 | + public static String annotations(Annotations annotations) { | ||
| 88 | + StringBuilder sb = new StringBuilder(); | ||
| 89 | + for (String key : annotations.keys()) { | ||
| 90 | + sb.append(", ").append(key).append('=').append(annotations.value(key)); | ||
| 91 | + } | ||
| 92 | + return sb.toString(); | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + /** | ||
| 96 | + * Produces a JSON object from the specified key/value annotations. | ||
| 97 | + * | ||
| 98 | + * @param annotations key/value annotations | ||
| 99 | + * @return JSON object | ||
| 100 | + */ | ||
| 101 | + public static ObjectNode annotations(ObjectMapper mapper, Annotations annotations) { | ||
| 102 | + ObjectNode result = mapper.createObjectNode(); | ||
| 103 | + for (String key : annotations.keys()) { | ||
| 104 | + result.put(key, annotations.value(key)); | ||
| 105 | + } | ||
| 106 | + return result; | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + /** | ||
| 79 | * Executes this command. | 110 | * Executes this command. |
| 80 | */ | 111 | */ |
| 81 | protected abstract void execute(); | 112 | protected abstract void execute(); | ... | ... |
| ... | @@ -43,7 +43,7 @@ import static org.onlab.onos.net.DeviceId.deviceId; | ... | @@ -43,7 +43,7 @@ import static org.onlab.onos.net.DeviceId.deviceId; |
| 43 | description = "Lists all ports or all ports of a device") | 43 | description = "Lists all ports or all ports of a device") |
| 44 | public class DevicePortsListCommand extends DevicesListCommand { | 44 | public class DevicePortsListCommand extends DevicesListCommand { |
| 45 | 45 | ||
| 46 | - private static final String FMT = " port=%s, state=%s"; | 46 | + private static final String FMT = " port=%s, state=%s%s"; |
| 47 | 47 | ||
| 48 | @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports", | 48 | @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports", |
| 49 | required = false, multiValued = false) | 49 | required = false, multiValued = false) |
| ... | @@ -112,7 +112,8 @@ public class DevicePortsListCommand extends DevicesListCommand { | ... | @@ -112,7 +112,8 @@ public class DevicePortsListCommand extends DevicesListCommand { |
| 112 | if (isIncluded(port)) { | 112 | if (isIncluded(port)) { |
| 113 | ports.add(mapper.createObjectNode() | 113 | ports.add(mapper.createObjectNode() |
| 114 | .put("port", port.number().toString()) | 114 | .put("port", port.number().toString()) |
| 115 | - .put("isEnabled", port.isEnabled())); | 115 | + .put("isEnabled", port.isEnabled()) |
| 116 | + .set("annotations", annotations(mapper, port.annotations()))); | ||
| 116 | } | 117 | } |
| 117 | } | 118 | } |
| 118 | return result.put("device", device.id().toString()).set("ports", ports); | 119 | return result.put("device", device.id().toString()).set("ports", ports); |
| ... | @@ -131,7 +132,8 @@ public class DevicePortsListCommand extends DevicesListCommand { | ... | @@ -131,7 +132,8 @@ public class DevicePortsListCommand extends DevicesListCommand { |
| 131 | Collections.sort(ports, Comparators.PORT_COMPARATOR); | 132 | Collections.sort(ports, Comparators.PORT_COMPARATOR); |
| 132 | for (Port port : ports) { | 133 | for (Port port : ports) { |
| 133 | if (isIncluded(port)) { | 134 | if (isIncluded(port)) { |
| 134 | - print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled"); | 135 | + print(FMT, port.number(), port.isEnabled() ? "enabled" : "disabled", |
| 136 | + annotations(port.annotations())); | ||
| 135 | } | 137 | } |
| 136 | } | 138 | } |
| 137 | } | 139 | } | ... | ... |
| ... | @@ -41,7 +41,7 @@ import static com.google.common.collect.Lists.newArrayList; | ... | @@ -41,7 +41,7 @@ import static com.google.common.collect.Lists.newArrayList; |
| 41 | public class DevicesListCommand extends AbstractShellCommand { | 41 | public class DevicesListCommand extends AbstractShellCommand { |
| 42 | 42 | ||
| 43 | private static final String FMT = | 43 | private static final String FMT = |
| 44 | - "id=%s, available=%s, role=%s, type=%s, mfr=%s, hw=%s, sw=%s, serial=%s"; | 44 | + "id=%s, available=%s, role=%s, type=%s, mfr=%s, hw=%s, sw=%s, serial=%s%s"; |
| 45 | 45 | ||
| 46 | @Override | 46 | @Override |
| 47 | protected void execute() { | 47 | protected void execute() { |
| ... | @@ -89,7 +89,8 @@ public class DevicesListCommand extends AbstractShellCommand { | ... | @@ -89,7 +89,8 @@ public class DevicesListCommand extends AbstractShellCommand { |
| 89 | .put("mfr", device.manufacturer()) | 89 | .put("mfr", device.manufacturer()) |
| 90 | .put("hw", device.hwVersion()) | 90 | .put("hw", device.hwVersion()) |
| 91 | .put("sw", device.swVersion()) | 91 | .put("sw", device.swVersion()) |
| 92 | - .put("serial", device.serialNumber()); | 92 | + .put("serial", device.serialNumber()) |
| 93 | + .set("annotations", annotations(mapper, device.annotations())); | ||
| 93 | } | 94 | } |
| 94 | return result; | 95 | return result; |
| 95 | } | 96 | } |
| ... | @@ -117,7 +118,7 @@ public class DevicesListCommand extends AbstractShellCommand { | ... | @@ -117,7 +118,7 @@ public class DevicesListCommand extends AbstractShellCommand { |
| 117 | print(FMT, device.id(), service.isAvailable(device.id()), | 118 | print(FMT, device.id(), service.isAvailable(device.id()), |
| 118 | service.getRole(device.id()), device.type(), | 119 | service.getRole(device.id()), device.type(), |
| 119 | device.manufacturer(), device.hwVersion(), device.swVersion(), | 120 | device.manufacturer(), device.hwVersion(), device.swVersion(), |
| 120 | - device.serialNumber()); | 121 | + device.serialNumber(), annotations(device.annotations())); |
| 121 | } | 122 | } |
| 122 | } | 123 | } |
| 123 | 124 | ... | ... |
| ... | @@ -42,7 +42,7 @@ import static com.google.common.collect.Lists.newArrayList; | ... | @@ -42,7 +42,7 @@ import static com.google.common.collect.Lists.newArrayList; |
| 42 | public class HostsListCommand extends AbstractShellCommand { | 42 | public class HostsListCommand extends AbstractShellCommand { |
| 43 | 43 | ||
| 44 | private static final String FMT = | 44 | private static final String FMT = |
| 45 | - "id=%s, mac=%s, location=%s/%s, vlan=%s, ip(s)=%s"; | 45 | + "id=%s, mac=%s, location=%s/%s, vlan=%s, ip(s)=%s%s"; |
| 46 | 46 | ||
| 47 | @Override | 47 | @Override |
| 48 | protected void execute() { | 48 | protected void execute() { |
| ... | @@ -80,6 +80,7 @@ public class HostsListCommand extends AbstractShellCommand { | ... | @@ -80,6 +80,7 @@ public class HostsListCommand extends AbstractShellCommand { |
| 80 | .put("vlan", host.vlan().toString()); | 80 | .put("vlan", host.vlan().toString()); |
| 81 | result.set("location", loc); | 81 | result.set("location", loc); |
| 82 | result.set("ips", ips); | 82 | result.set("ips", ips); |
| 83 | + result.set("annotations", annotations(mapper, host.annotations())); | ||
| 83 | return result; | 84 | return result; |
| 84 | } | 85 | } |
| 85 | 86 | ||
| ... | @@ -105,7 +106,8 @@ public class HostsListCommand extends AbstractShellCommand { | ... | @@ -105,7 +106,8 @@ public class HostsListCommand extends AbstractShellCommand { |
| 105 | print(FMT, host.id(), host.mac(), | 106 | print(FMT, host.id(), host.mac(), |
| 106 | host.location().deviceId(), | 107 | host.location().deviceId(), |
| 107 | host.location().port(), | 108 | host.location().port(), |
| 108 | - host.vlan(), host.ipAddresses()); | 109 | + host.vlan(), host.ipAddresses(), |
| 110 | + annotations(host.annotations())); | ||
| 109 | } | 111 | } |
| 110 | } | 112 | } |
| 111 | } | 113 | } | ... | ... |
| ... | @@ -38,7 +38,7 @@ import static org.onlab.onos.net.DeviceId.deviceId; | ... | @@ -38,7 +38,7 @@ import static org.onlab.onos.net.DeviceId.deviceId; |
| 38 | description = "Lists all infrastructure links") | 38 | description = "Lists all infrastructure links") |
| 39 | public class LinksListCommand extends AbstractShellCommand { | 39 | public class LinksListCommand extends AbstractShellCommand { |
| 40 | 40 | ||
| 41 | - private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s"; | 41 | + private static final String FMT = "src=%s/%s, dst=%s/%s, type=%s%s"; |
| 42 | private static final String COMPACT = "%s/%s-%s/%s"; | 42 | private static final String COMPACT = "%s/%s-%s/%s"; |
| 43 | 43 | ||
| 44 | @Argument(index = 0, name = "uri", description = "Device ID", | 44 | @Argument(index = 0, name = "uri", description = "Device ID", |
| ... | @@ -85,6 +85,7 @@ public class LinksListCommand extends AbstractShellCommand { | ... | @@ -85,6 +85,7 @@ public class LinksListCommand extends AbstractShellCommand { |
| 85 | ObjectNode result = mapper.createObjectNode(); | 85 | ObjectNode result = mapper.createObjectNode(); |
| 86 | result.set("src", json(mapper, link.src())); | 86 | result.set("src", json(mapper, link.src())); |
| 87 | result.set("dst", json(mapper, link.dst())); | 87 | result.set("dst", json(mapper, link.dst())); |
| 88 | + result.set("annotations", annotations(mapper, link.annotations())); | ||
| 88 | return result; | 89 | return result; |
| 89 | } | 90 | } |
| 90 | 91 | ||
| ... | @@ -109,7 +110,8 @@ public class LinksListCommand extends AbstractShellCommand { | ... | @@ -109,7 +110,8 @@ public class LinksListCommand extends AbstractShellCommand { |
| 109 | */ | 110 | */ |
| 110 | public static String linkString(Link link) { | 111 | public static String linkString(Link link) { |
| 111 | return String.format(FMT, link.src().deviceId(), link.src().port(), | 112 | return String.format(FMT, link.src().deviceId(), link.src().port(), |
| 112 | - link.dst().deviceId(), link.dst().port(), link.type()); | 113 | + link.dst().deviceId(), link.dst().port(), link.type(), |
| 114 | + annotations(link.annotations())); | ||
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | /** | 117 | /** | ... | ... |
-
Please register or login to post a comment