From 42193f4644b9a0f9170facb7e773d7586e54310e Mon Sep 17 00:00:00 2001 From: Lorand Jakab Date: Wed, 14 Jun 2017 16:04:09 +0300 Subject: [PATCH] Make 'keys' CLI output user friendly Before this patch, the 'keys' CLI command would print out the full Java objects contained in a map-cache. That's great for in-depth debugging, but for a quick look it very hard to read. This patch implements a user friendly CLI output for keys, to improve readability. The old full output is still available in Karaf, by adding the '-d' or '--debug' switch to the CLI command. Example output: ---8<------------------------------------------------------------------------------ opendaylight-user@root>keys Instance ID 0 -> EID HMAC Algorithm Shared Key 192.0.2.1/32 HmacSHA1 password 192.0.2.1/32|192.0.2.2/32 HmacSHA1 password ------------------------------------------------------------------------------>8--- Change-Id: Ibe95d0ee4318053df3bc9f30c09c0e01c1d00eba Signed-off-by: Lorand Jakab --- .../interfaces/mapcache/IAuthKeyDb.java | 7 +++ .../interfaces/mapcache/IMappingSystem.java | 7 +++ .../mappingservice/IMappingService.java | 7 +++ .../mappingservice/IMappingServiceShell.java | 7 +++ .../implementation/MappingService.java | 5 ++ .../implementation/MappingServiceShell.java | 5 ++ .../implementation/MappingSystem.java | 5 ++ .../lisp/authentication/LispKeyIDEnum.java | 2 +- .../lisp/util/Stringifier.java | 27 +++++++++-- .../lispflowmapping/mapcache/AuthKeyDb.java | 5 ++ .../lisp/LispMapCacheStringifier.java | 47 +++++++++++++++++++ .../lispflowmapping/shell/LispKeys.java | 10 +++- 12 files changed, 128 insertions(+), 6 deletions(-) diff --git a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IAuthKeyDb.java b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IAuthKeyDb.java index b25070ab6..99ef4be08 100644 --- a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IAuthKeyDb.java +++ b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IAuthKeyDb.java @@ -52,4 +52,11 @@ public interface IAuthKeyDb { * @return a String consisting of all the authentication keys in the database */ String printKeys(); + + /** + * Print keys in cache in a human friendly format. + * + * @return a String consisting of all the keys in the cache + */ + String prettyPrintKeys(); } diff --git a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java index 32ada32c6..556663ae5 100644 --- a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java +++ b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java @@ -234,6 +234,13 @@ public interface IMappingSystem { */ String printKeys(); + /** + * Print keys in cache in a human friendly format. + * + * @return a String consisting of all the keys in the cache + */ + String prettyPrintKeys(); + /** * Set cluster master status. * diff --git a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingService.java b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingService.java index 5f08aa619..d51522244 100644 --- a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingService.java +++ b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingService.java @@ -227,6 +227,13 @@ public interface IMappingService { */ String printKeys(); + /** + * Print keys in cache in a human friendly format. + * + * @return a String consisting of all the keys in the cache + */ + String prettyPrintKeys(); + /** * Cleans all cached mappings.Used for testing. */ diff --git a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingServiceShell.java b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingServiceShell.java index 54dbfc068..4399d9a3e 100644 --- a/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingServiceShell.java +++ b/mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingServiceShell.java @@ -36,6 +36,13 @@ public interface IMappingServiceShell { */ String printKeys(); + /** + * Print the full authentication key database in human readable form. + * + * @return the text to be printed on the Karaf console. + */ + String prettyPrintKeys(); + /** * Add the default key "password" for the IPv4 prefix 0.0.0.0/0. */ diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java index 0cd50e763..14acd328e 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java @@ -491,6 +491,11 @@ public class MappingService implements OdlMappingserviceService, IMappingService return mappingSystem.printKeys(); } + @Override + public String prettyPrintKeys() { + return mappingSystem.prettyPrintKeys(); + } + @Override public void close() throws Exception { LOG.info("Mapping Service is being destroyed!"); diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingServiceShell.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingServiceShell.java index e1b356cea..a8eac84c8 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingServiceShell.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingServiceShell.java @@ -48,6 +48,11 @@ public class MappingServiceShell implements IMappingServiceShell { return mappingService.printKeys(); } + @Override + public String prettyPrintKeys() { + return mappingService.prettyPrintKeys(); + } + @Override public void addDefaultKeyIPv4() { Eid eid = LispAddressUtil.toEid(new Ipv4Prefix("0.0.0.0/0"), null); diff --git a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java index ef6f94060..52d95e34b 100644 --- a/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java +++ b/mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java @@ -688,6 +688,11 @@ public class MappingSystem implements IMappingSystem { return akdb.printKeys(); } + @Override + public String prettyPrintKeys() { + return akdb.prettyPrintKeys(); + } + public void cleanCaches() { dao.removeAll(); buildMapCaches(); diff --git a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/authentication/LispKeyIDEnum.java b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/authentication/LispKeyIDEnum.java index d99cee78a..c0ded11be 100644 --- a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/authentication/LispKeyIDEnum.java +++ b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/authentication/LispKeyIDEnum.java @@ -8,7 +8,7 @@ package org.opendaylight.lispflowmapping.lisp.authentication; public enum LispKeyIDEnum { - NONE(0, null), + NONE(0, "_NONE_"), SHA1(1, "HmacSHA1"), SHA256(2, "HmacSHA256"), UNKNOWN(-1, null); diff --git a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/Stringifier.java b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/Stringifier.java index 1dad46164..4b8e92067 100644 --- a/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/Stringifier.java +++ b/mappingservice/lisp-proto/src/main/java/org/opendaylight/lispflowmapping/lisp/util/Stringifier.java @@ -8,6 +8,7 @@ package org.opendaylight.lispflowmapping.lisp.util; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey; import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord; /** @@ -20,12 +21,30 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.ma public class Stringifier { private static final String NEW_LINE = System.lineSeparator(); + public static String getSpacesAsString(int length) { + return new String(new char[length]).replace("\0", " "); + } + + public static String getString(MappingAuthkey key) { + return getString(key, 0); + } + + public static String getString(MappingAuthkey key, int indentation) { + final String indent = getSpacesAsString(indentation); + + StringBuilder masb = new StringBuilder(indent); + masb.append(key.getKeyString()); + masb.append(" "); + masb.append(key.getKeyType()); + return masb.toString(); + } + public static String getString(MappingRecord mapping) { return getString(mapping, 0); } public static String getString(MappingRecord mapping, int indentation) { - final String indent = new String(new char[indentation]).replace("\0", " "); + final String indent = getSpacesAsString(indentation); StringBuilder mrsb = new StringBuilder(indent); @@ -68,14 +87,14 @@ public class Stringifier { } public static String getString(LocatorRecord locator, int indentation) { - final String indent = new String(new char[indentation]).replace("\0", " "); + final String indent = getSpacesAsString(indentation); StringBuilder lrsb = new StringBuilder(indent); String rloc = LispAddressStringifier.getString(locator.getRloc()); - int padLen = Constants.INET6_ADDRSTRLEN + 2 - rloc.length(); + int padLen = Math.max(2, Constants.INET6_ADDRSTRLEN + 2 - rloc.length()); lrsb.append(rloc); - lrsb.append(new String(new char[padLen]).replace("\0", " ")); + lrsb.append(getSpacesAsString(padLen)); lrsb.append(locator.isRouted() ? "up " : "no-route "); lrsb.append(locator.getPriority().toString()); lrsb.append('/'); diff --git a/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/AuthKeyDb.java b/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/AuthKeyDb.java index c4b20e917..131da871f 100644 --- a/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/AuthKeyDb.java +++ b/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/AuthKeyDb.java @@ -121,4 +121,9 @@ public class AuthKeyDb implements IAuthKeyDb { public String printKeys() { return LispMapCacheStringifier.printKeys(dao); } + + @Override + public String prettyPrintKeys() { + return LispMapCacheStringifier.prettyPrintKeys(dao); + } } diff --git a/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/lisp/LispMapCacheStringifier.java b/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/lisp/LispMapCacheStringifier.java index 38d3fc0f7..505b12e63 100644 --- a/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/lisp/LispMapCacheStringifier.java +++ b/mappingservice/mapcache/src/main/java/org/opendaylight/lispflowmapping/mapcache/lisp/LispMapCacheStringifier.java @@ -12,10 +12,13 @@ import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO; import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor; import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys; import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber; +import org.opendaylight.lispflowmapping.lisp.authentication.LispKeyIDEnum; import org.opendaylight.lispflowmapping.lisp.type.MappingData; import org.opendaylight.lispflowmapping.lisp.util.Constants; import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier; import org.opendaylight.lispflowmapping.lisp.util.Stringifier; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey; public class LispMapCacheStringifier { public static String printKeys(ILispDAO dao) { @@ -57,6 +60,50 @@ public class LispMapCacheStringifier { return sb.toString(); } + @SuppressWarnings("unchecked") + public static String prettyPrintKeys(ILispDAO dao) { + final StringBuffer sb = new StringBuffer(); + + final IRowVisitor innerVisitor = (new IRowVisitor() { + public void visitRow(Object keyId, String valueKey, Object value) { + switch (valueKey) { + case SubKeys.AUTH_KEY: + String eid = LispAddressStringifier.getString((Eid) keyId); + sb.append(" "); + sb.append(eid); + int padLen = Math.max(2, Constants.INET6_ADDRSTRLEN - eid.length()); + sb.append(Stringifier.getSpacesAsString(padLen)); + MappingAuthkey authKey = (MappingAuthkey) value; + String hmac = LispKeyIDEnum.valueOf(authKey.getKeyType().shortValue()).getAuthenticationName(); + sb.append(hmac); + sb.append(Stringifier.getSpacesAsString(Math.max(2, 22 - hmac.length()))); + sb.append(authKey.getKeyString()); + sb.append("\n"); + break; + default: + break; + } + } + }); + + dao.getAll(new IRowVisitor() { + String lastKey = ""; + + public void visitRow(Object keyId, String valueKey, Object value) { + String key = keyId.getClass().getSimpleName() + "#" + keyId; + if (!lastKey.equals(key)) { + sb.append("Instance ID " + keyId + "\n"); + sb.append(" -> EID HMAC Algorithm Shared Key\n"); + } + if (valueKey.equals(SubKeys.VNI)) { + ((ILispDAO)value).getAll(innerVisitor); + } + lastKey = key; + } + }); + return sb.toString(); + } + public static String printFMCMappings(ILispDAO dao) { final StringBuffer sb = new StringBuffer(); sb.append("Keys\tValues\n"); diff --git a/mappingservice/shell/src/main/java/org/opendaylight/lispflowmapping/shell/LispKeys.java b/mappingservice/shell/src/main/java/org/opendaylight/lispflowmapping/shell/LispKeys.java index 34436e802..2a684e981 100644 --- a/mappingservice/shell/src/main/java/org/opendaylight/lispflowmapping/shell/LispKeys.java +++ b/mappingservice/shell/src/main/java/org/opendaylight/lispflowmapping/shell/LispKeys.java @@ -9,6 +9,7 @@ package org.opendaylight.lispflowmapping.shell; import org.apache.karaf.shell.commands.Command; +import org.apache.karaf.shell.commands.Option; import org.apache.karaf.shell.console.OsgiCommandSupport; import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingServiceShell; @@ -20,6 +21,9 @@ import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingServic */ @Command(scope = "mappingservice", name = "keys", description = "Print LISP authentication keys") public class LispKeys extends OsgiCommandSupport { + @Option(name = "-d", aliases = "--debug", description = "Debug output", required = false, multiValued = false) + private boolean debug; + private IMappingServiceShell mappingServiceShell; /* @@ -29,7 +33,11 @@ public class LispKeys extends OsgiCommandSupport { @Override @SuppressWarnings("checkstyle:RegexpSinglelineJava") protected Object doExecute() throws Exception { - System.out.print(mappingServiceShell.printKeys()); + if (debug) { + System.out.print(mappingServiceShell.printKeys()); + } else { + System.out.print(mappingServiceShell.prettyPrintKeys()); + } return null; } -- 2.36.6