import java.util.Date;
import java.util.concurrent.TimeUnit;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
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.rloc.container.Rloc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.subscriber.data.grouping.SubscriberData;
return "_rloc=" + data.getRloc().toString() + ", _eid=" + data.getEid().toString()
+ ", _ttl=" + data.getTtl().toString() + ", last request @ " + lastRequestDate.toString();
}
+
+ public String getString() {
+ return "[" + LispAddressStringifier.getString(data.getRloc())
+ + ", " + LispAddressStringifier.getString(data.getEid()) + "]";
+ }
}
* @return a String consisting of all the mappings in the cache
*/
String printMappings();
+
+ /**
+ * Print mappings in cache in a human friendly format.
+ *
+ * @return a String consisting of all the mappings in the cache
+ */
+ String prettyPrintMappings();
}
*/
String printMappings();
+ /**
+ * Print mappings in cache in a human friendly format.
+ *
+ * @return a String consisting of all the mappings in the cache
+ */
+ String prettyPrintMappings();
+
/**
* Print all authentication keys. Used for testing, debugging and the karaf shell.
*
*/
String printMappings();
+ /**
+ * Print mappings in cache in a human friendly format.
+ *
+ * @return a String consisting of all the mappings in the cache
+ */
+ String prettyPrintMappings();
+
/**
* Print all authentication keys. Used for testing, debugging and the karaf shell.
*
*/
String printMappings();
+ /**
+ * Print the full mapping database in human readable form.
+ *
+ * @return the text to be printed on the Karaf console.
+ */
+ String prettyPrintMappings();
+
/**
* Print the full authentication key database.
*
return mappingSystem.printMappings();
}
+ @Override
+ public String prettyPrintMappings() {
+ return mappingSystem.prettyPrintMappings();
+ }
+
@Override
public String printKeys() {
return mappingSystem.printKeys();
return mappingService.printMappings();
}
+ @Override
+ public String prettyPrintMappings() {
+ return mappingService.prettyPrintMappings();
+ }
+
@Override
public String printKeys() {
return mappingService.printKeys();
@Override
public String printMappings() {
final StringBuffer sb = new StringBuffer();
- sb.append("PolicyMapCache\n--------------\n");
+ sb.append("Policy map-cache\n----------------\n");
sb.append(pmc.printMappings());
- sb.append("SbMapCache\n----------\n");
+ sb.append("\nSouthbound map-cache\n--------------------\n");
sb.append(smc.printMappings());
return sb.toString();
}
+ @Override
+ public String prettyPrintMappings() {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("Policy map-cache\n----------------\n");
+ sb.append(pmc.prettyPrintMappings());
+ sb.append("\nSouthbound map-cache\n--------------------\n");
+ sb.append(smc.prettyPrintMappings());
+ return sb.toString();
+ }
+
@Override
public String printKeys() {
return akdb.printKeys();
import com.google.common.base.Optional;
import java.util.Date;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
import org.opendaylight.lispflowmapping.lisp.util.MappingRecordUtil;
+import org.opendaylight.lispflowmapping.lisp.util.Stringifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
return sb.append(']').toString();
}
+
+ public String getString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("Merge: ");
+ sb.append(mergeEnabled ? "on" : "off");
+
+ if (xtrId != null) {
+ sb.append(", xTR-ID: ");
+ sb.append(LispAddressStringifier.getString(xtrId));
+ }
+
+ if (timestamp != null) {
+ sb.append(", timestamp: ");
+ sb.append(timestamp.toString());
+ }
+
+ if (record != null) {
+ sb.append("\n");
+ sb.append(Stringifier.getString(record));
+ sb.append("\n");
+ }
+
+ return sb.append(']').toString();
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.lispflowmapping.lisp.util;
+
+/**
+ * Constants that we can/need to use in several places throughout the project.
+ *
+ * @author Lorand Jakab
+ *
+ */
+public final class Constants {
+ public static final int INET6_ADDRSTRLEN = 46;
+
+ // TODO Move constants from other files that don't clearly belong there into this file.
+}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+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.record.container.MappingRecord;
+
+/**
+ * Utility class with static methods returning user friendly string
+ * representations of certain model based auto-generated classes.
+ *
+ * @author Lorand Jakab
+ *
+ */
+public class Stringifier {
+ private static final String NEW_LINE = System.lineSeparator();
+
+ 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", " ");
+
+ StringBuilder mrsb = new StringBuilder(indent);
+
+ // Main information, EID prefix and TTL (for now)
+ mrsb.append(LispAddressStringifier.getString(mapping.getEid()));
+ mrsb.append(", TTL: ");
+ mrsb.append(mapping.getRecordTtl().toString());
+ mrsb.append(NEW_LINE);
+
+ // Locator records
+ // Regular indentation for the mapping record
+ mrsb.append(indent);
+ // Extra indentation for locator records
+ mrsb.append(indent);
+ if (mapping.getLocatorRecord() == null || mapping.getLocatorRecord().isEmpty()) {
+ // We only print the action for negative mappings (0 locator records)
+ mrsb.append("-> Negative entry, action: ");
+ mrsb.append(mapping.getAction().getName());
+ } else {
+ mrsb.append("-> Locator State Pri/Wgt");
+ mrsb.append(NEW_LINE);
+ mrsb.append(indent);
+ boolean first = true;
+ for (LocatorRecord record : mapping.getLocatorRecord()) {
+ if (first) {
+ first = false;
+ } else {
+ mrsb.append(NEW_LINE);
+ mrsb.append(indent);
+ }
+ mrsb.append(getString(record, indentation + 3));
+ }
+ }
+
+ return mrsb.toString();
+ }
+
+ public static String getString(LocatorRecord locator) {
+ return getString(locator, 0);
+ }
+
+ public static String getString(LocatorRecord locator, int indentation) {
+ final String indent = new String(new char[indentation]).replace("\0", " ");
+
+ StringBuilder lrsb = new StringBuilder(indent);
+
+ String rloc = LispAddressStringifier.getString(locator.getRloc());
+ int padLen = Constants.INET6_ADDRSTRLEN + 2 - rloc.length();
+ lrsb.append(rloc);
+ lrsb.append(new String(new char[padLen]).replace("\0", " "));
+ lrsb.append(locator.isRouted() ? "up " : "no-route ");
+ lrsb.append(locator.getPriority().toString());
+ lrsb.append('/');
+ lrsb.append(locator.getWeight().toString());
+
+ return lrsb.toString();
+ }
+}
package org.opendaylight.lispflowmapping.mapcache;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
-import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IAuthKeyDb;
import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
+import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
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;
@Override
public String printKeys() {
- final StringBuffer sb = new StringBuffer();
- sb.append("Keys\tValues\n");
-
- final IRowVisitor innerVisitor = (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("\n" + key + "\t");
- }
- sb.append(valueKey + "=" + value + "\t");
- lastKey = key;
- }
- });
-
- 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("\n" + key + "\t");
- }
- if (valueKey.equals(SubKeys.VNI)) {
- sb.append(valueKey + "= { ");
- ((ILispDAO)value).getAll(innerVisitor);
- sb.append("}\t");
- } else {
- sb.append(valueKey + "=" + value + "\t");
- }
- lastKey = key;
- }
- });
- sb.append("\n");
- return sb.toString();
+ return LispMapCacheStringifier.printKeys(dao);
}
}
package org.opendaylight.lispflowmapping.mapcache;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
-import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
+import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
/**
@Override
public String printMappings() {
- final StringBuffer sb = new StringBuffer();
- sb.append("Keys\tValues\n");
- dao.getAll(new IRowVisitor() {
- String lastKey = "";
+ return LispMapCacheStringifier.printFMCMappings(dao);
+ }
- public void visitRow(Object keyId, String valueKey, Object value) {
- String key = keyId.getClass().getSimpleName() + "#" + keyId;
- if (!lastKey.equals(key)) {
- sb.append("\n" + key + "\t");
- }
- sb.append(valueKey + "=" + value + "\t");
- lastKey = key;
- }
- });
- sb.append("\n");
- return sb.toString();
+ @Override
+ public String prettyPrintMappings() {
+ return LispMapCacheStringifier.prettyPrintFMCMappings(dao);
}
}
import java.util.Map;
import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
-import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
import org.opendaylight.lispflowmapping.interfaces.dao.MappingEntry;
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.mapcache.IMapCache;
import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
+import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
return (ILispDAO) mappingsDb.getSpecific(SourceDestKeyHelper.getDstBinary(address), SubKeys.LCAF_SRCDST);
}
- public String printMappings() {
- final StringBuffer sb = new StringBuffer();
- sb.append("Keys\tValues\n");
- final IRowVisitor innerVisitor = (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("\n" + key + "\t");
- }
- sb.append(valueKey + "=" + value + "\t");
- lastKey = key;
- }
- });
- final IRowVisitor vniVisitor = (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(key + "\t");
- }
- if ((valueKey.equals(SubKeys.LCAF_SRCDST))) {
- sb.append(valueKey + "= { ");
- ((ILispDAO)value).getAll(innerVisitor);
- sb.append("}\t");
- } else {
- sb.append(valueKey + "=" + value + "\t");
- }
- lastKey = key;
- }
- });
- 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("\n" + key + "\t");
- }
- if (valueKey.equals(SubKeys.VNI)) {
- sb.append(valueKey + "= { ");
- ((ILispDAO)value).getAll(vniVisitor);
- sb.append("}\t");
- } else {
- sb.append(valueKey + "=" + value + "\t");
- }
- lastKey = key;
- }
- });
- sb.append("\n");
- return sb.toString();
- }
-
@Override
public void addData(Eid eid, String subKey, Object data) {
Eid key = MaskUtil.normalize(eid);
table.removeSpecific(key, subKey);
}
}
+
+ @Override
+ public String printMappings() {
+ return LispMapCacheStringifier.printMTMCMappings(dao);
+ }
+
+ @Override
+ public String prettyPrintMappings() {
+ return LispMapCacheStringifier.prettyPrintMTMCMappings(dao);
+ }
}
import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
import org.opendaylight.lispflowmapping.interfaces.mapcache.ILispMapCache;
import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
+import org.opendaylight.lispflowmapping.mapcache.lisp.LispMapCacheStringifier;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
@Override
public String printMappings() {
- final StringBuffer sb = new StringBuffer();
- sb.append("Keys\tValues\n");
-
- final IRowVisitor innerVisitor = (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("\n" + key + "\t");
- }
- sb.append(valueKey + "=" + value + "\t");
- lastKey = key;
- }
- });
-
- dao.getAll(new IRowVisitor() {
- String lastKey = "";
+ return LispMapCacheStringifier.printSMCMappings(dao);
+ }
- public void visitRow(Object keyId, String valueKey, Object value) {
- String key = keyId.getClass().getSimpleName() + "#" + keyId;
- if (!lastKey.equals(key)) {
- sb.append("\n" + key + "\t");
- }
- if (valueKey.equals(SubKeys.VNI)) {
- sb.append(valueKey + "= { ");
- ((ILispDAO)value).getAll(innerVisitor);
- sb.append("}\t");
- } else {
- sb.append(valueKey + "=" + value + "\t");
- }
- lastKey = key;
- }
- });
- sb.append("\n");
- return sb.toString();
+ @Override
+ public String prettyPrintMappings() {
+ return LispMapCacheStringifier.prettyPrintSMCMappings(dao);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2017 Cisco Systems, Inc. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.lispflowmapping.mapcache.lisp;
+
+import java.util.Set;
+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.type.MappingData;
+import org.opendaylight.lispflowmapping.lisp.util.Constants;
+import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
+import org.opendaylight.lispflowmapping.lisp.util.Stringifier;
+
+public class LispMapCacheStringifier {
+ public static String printKeys(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("Keys\tValues\n");
+
+ final IRowVisitor innerVisitor = (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("\n" + key + "\t");
+ }
+ sb.append(valueKey + "=" + value + "\t");
+ lastKey = key;
+ }
+ });
+
+ 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("\n" + key + "\t");
+ }
+ if (valueKey.equals(SubKeys.VNI)) {
+ sb.append(valueKey + "= { ");
+ ((ILispDAO)value).getAll(innerVisitor);
+ sb.append("}\t");
+ } else {
+ sb.append(valueKey + "=" + value + "\t");
+ }
+ lastKey = key;
+ }
+ });
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ public static String printFMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("Keys\tValues\n");
+ 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("\n" + key + "\t");
+ }
+ sb.append(valueKey + "=" + value + "\t");
+ lastKey = key;
+ }
+ });
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ public static String prettyPrintFMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+ dao.getAll(new IRowVisitor() {
+ public void visitRow(Object keyId, String valueKey, Object value) {
+ switch (valueKey) {
+ case SubKeys.RECORD:
+ MappingData md = (MappingData) value;
+ sb.append(Stringifier.getString(md.getRecord(), 2));
+ sb.append("\n");
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ public static String printMTMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("Keys\tValues\n");
+ final IRowVisitor innerVisitor = (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("\n" + key + "\t");
+ }
+ sb.append(valueKey + "=" + value + "\t");
+ lastKey = key;
+ }
+ });
+ final IRowVisitor vniVisitor = (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(key + "\t");
+ }
+ if ((valueKey.equals(SubKeys.LCAF_SRCDST))) {
+ sb.append(valueKey + "= { ");
+ ((ILispDAO)value).getAll(innerVisitor);
+ sb.append("}\t");
+ } else {
+ sb.append(valueKey + "=" + value + "\t");
+ }
+ lastKey = key;
+ }
+ });
+ 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("\n" + key + "\t");
+ }
+ if (valueKey.equals(SubKeys.VNI)) {
+ sb.append(valueKey + "= { ");
+ ((ILispDAO)value).getAll(vniVisitor);
+ sb.append("}\t");
+ } else {
+ sb.append(valueKey + "=" + value + "\t");
+ }
+ lastKey = key;
+ }
+ });
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ public static String prettyPrintMTMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+
+ final IRowVisitor mappingVisitor = (new IRowVisitor() {
+ public void visitRow(Object keyId, String valueKey, Object value) {
+ switch (valueKey) {
+ case SubKeys.RECORD:
+ MappingData md = (MappingData) value;
+ sb.append(Stringifier.getString(md.getRecord(), 2));
+ sb.append("\n");
+ break;
+ case SubKeys.SUBSCRIBERS:
+ Set<Subscriber> subscribers = (Set<Subscriber>) value;
+ sb.append(prettyPrintSubscriberSet(subscribers, 4));
+ sb.append("\n");
+ break;
+ case SubKeys.LCAF_SRCDST:
+ ((ILispDAO)value).getAll(this);
+ 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");
+ }
+ if (valueKey.equals(SubKeys.VNI)) {
+ ((ILispDAO)value).getAll(mappingVisitor);
+ }
+ lastKey = key;
+ }
+ });
+ return sb.toString();
+ }
+
+ public static String printSMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+ sb.append("Keys\tValues\n");
+
+ final IRowVisitor innerVisitor = (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("\n" + key + "\t");
+ }
+ sb.append(valueKey + "=" + value + "\t");
+ lastKey = key;
+ }
+ });
+
+ 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("\n" + key + "\t");
+ }
+ if (valueKey.equals(SubKeys.VNI)) {
+ sb.append(valueKey + "= { ");
+ ((ILispDAO)value).getAll(innerVisitor);
+ sb.append("}\t");
+ } else {
+ sb.append(valueKey + "=" + value + "\t");
+ }
+ lastKey = key;
+ }
+ });
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ public static String prettyPrintSMCMappings(ILispDAO dao) {
+ final StringBuffer sb = new StringBuffer();
+
+ final IRowVisitor mappingVisitor = (new IRowVisitor() {
+ public void visitRow(Object keyId, String valueKey, Object value) {
+ switch (valueKey) {
+ case SubKeys.RECORD:
+ MappingData md = (MappingData) value;
+ sb.append(Stringifier.getString(md.getRecord(), 2));
+ sb.append("\n");
+ break;
+ case SubKeys.SUBSCRIBERS:
+ Set<Subscriber> subscribers = (Set<Subscriber>) value;
+ sb.append(prettyPrintSubscriberSet(subscribers, 4));
+ 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");
+ }
+ if (valueKey.equals(SubKeys.VNI)) {
+ ((ILispDAO)value).getAll(mappingVisitor);
+ }
+ lastKey = key;
+ }
+ });
+ return sb.toString();
+ }
+
+ /**
+ * Given a Set of Subscriber objects, and the level of indentation, create a nicely formatted String to be added
+ * to a map-cache print-out in a tabular form.
+ *
+ * @param subscribers the Set of Subscriber objects to be printed
+ * @param indentation indentation level
+ * @return the formatted String
+ */
+ public static String prettyPrintSubscriberSet(Set<Subscriber> subscribers, int indentation) {
+ final String indent = new String(new char[indentation]).replace("\0", " ");
+
+ StringBuilder sb = new StringBuilder(indent);
+ sb.append(" -----------------------------------------------------------------\n");
+ sb.append(indent);
+ sb.append("-> Subscriber RLOC Subscriber EID\n ");
+ sb.append(indent);
+ boolean first = true;
+ for (Subscriber subscriber : subscribers) {
+ if (first) {
+ first = false;
+ } else {
+ sb.append("\n ");
+ sb.append(indent);
+ }
+ String srcRloc = LispAddressStringifier.getString(subscriber.getSrcRloc());
+ int padLen = Constants.INET6_ADDRSTRLEN + 2 - srcRloc.length();
+ sb.append(srcRloc);
+ sb.append(new String(new char[padLen]).replace("\0", " "));
+ sb.append(LispAddressStringifier.getString(subscriber.getSrcEid()));
+ }
+ return sb.toString();
+ }
+}
/*
- * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2015, 2017 Cisco Systems, Inc. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
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;
*/
@Command(scope = "mappingservice", name = "mappings", description = "Print mapping database")
public class LispMappings extends OsgiCommandSupport {
+ @Option(name = "-d", aliases = "--debug", description = "Debug output", required = false, multiValued = false)
+ private boolean debug;
+
private IMappingServiceShell mappingServiceShell;
@Override
@SuppressWarnings("checkstyle:RegexpSinglelineJava")
protected Object doExecute() throws Exception {
- System.out.print(mappingServiceShell.printMappings());
+ if (debug) {
+ System.out.print(mappingServiceShell.printMappings());
+ } else {
+ System.out.print(mappingServiceShell.prettyPrintMappings());
+ }
return null;
}