cb80a10492bf992966050c3e3339665549c28dba
[lispflowmapping.git] / mappingservice / mapcache / src / main / java / org / opendaylight / lispflowmapping / mapcache / lisp / LispMapCacheStringifier.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.lispflowmapping.mapcache.lisp;
9
10 import java.util.Set;
11 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
12 import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
13 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
14 import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
15 import org.opendaylight.lispflowmapping.lisp.authentication.LispKeyIDEnum;
16 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
17 import org.opendaylight.lispflowmapping.lisp.util.Constants;
18 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
19 import org.opendaylight.lispflowmapping.lisp.util.Stringifier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
22
23 public class LispMapCacheStringifier {
24     public static String printKeys(ILispDAO dao) {
25         final StringBuilder sb = new StringBuilder();
26         sb.append("Keys\tValues\n");
27
28         final IRowVisitor innerVisitor = (new IRowVisitor() {
29             String lastKey = "";
30
31             public void visitRow(Object keyId, String valueKey, Object value) {
32                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
33                 if (!lastKey.equals(key)) {
34                     sb.append("\n" + key + "\t");
35                 }
36                 sb.append(valueKey + "=" + value + "\t");
37                 lastKey = key;
38             }
39         });
40
41         dao.getAll(new IRowVisitor() {
42             String lastKey = "";
43
44             public void visitRow(Object keyId, String valueKey, Object value) {
45                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
46                 if (!lastKey.equals(key)) {
47                     sb.append("\n" + key + "\t");
48                 }
49                 if (valueKey.equals(SubKeys.VNI)) {
50                     sb.append(valueKey + "= { ");
51                     ((ILispDAO)value).getAll(innerVisitor);
52                     sb.append("}\t");
53                 } else {
54                     sb.append(valueKey + "=" + value + "\t");
55                 }
56                 lastKey = key;
57             }
58         });
59         sb.append("\n");
60         return sb.toString();
61     }
62
63     @SuppressWarnings("unchecked")
64     public static String prettyPrintKeys(ILispDAO dao) {
65         final StringBuilder sb = new StringBuilder();
66
67         final IRowVisitor innerVisitor = (new IRowVisitor() {
68             public void visitRow(Object keyId, String valueKey, Object value) {
69                 switch (valueKey) {
70                     case SubKeys.AUTH_KEY:
71                         String eid = LispAddressStringifier.getString((Eid) keyId);
72                         sb.append("     ");
73                         sb.append(eid);
74                         int padLen = Math.max(2, Constants.INET6_ADDRSTRLEN - eid.length());
75                         sb.append(Stringifier.getSpacesAsString(padLen));
76                         MappingAuthkey authKey = (MappingAuthkey) value;
77                         String hmac = LispKeyIDEnum.valueOf(authKey.getKeyType().shortValue()).getAuthenticationName();
78                         sb.append(hmac);
79                         sb.append(Stringifier.getSpacesAsString(Math.max(2, 22 - hmac.length())));
80                         sb.append(authKey.getKeyString());
81                         sb.append("\n");
82                         break;
83                     default:
84                         break;
85                 }
86             }
87         });
88
89         dao.getAll(new IRowVisitor() {
90             String lastKey = "";
91
92             public void visitRow(Object keyId, String valueKey, Object value) {
93                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
94                 if (!lastKey.equals(key)) {
95                     sb.append("Instance ID " + keyId + "\n");
96                     sb.append("  -> EID                                           HMAC Algorithm        Shared Key\n");
97                 }
98                 if (valueKey.equals(SubKeys.VNI)) {
99                     ((ILispDAO)value).getAll(innerVisitor);
100                 }
101                 lastKey = key;
102             }
103         });
104         return sb.toString();
105     }
106
107     public static String printFMCMappings(ILispDAO dao) {
108         final StringBuilder sb = new StringBuilder();
109         sb.append("Keys\tValues\n");
110         dao.getAll(new IRowVisitor() {
111             String lastKey = "";
112
113             public void visitRow(Object keyId, String valueKey, Object value) {
114                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
115                 if (!lastKey.equals(key)) {
116                     sb.append("\n" + key + "\t");
117                 }
118                 sb.append(valueKey + "=" + value + "\t");
119                 lastKey = key;
120             }
121         });
122         sb.append("\n");
123         return sb.toString();
124     }
125
126     public static String prettyPrintFMCMappings(ILispDAO dao) {
127         final StringBuilder sb = new StringBuilder();
128         dao.getAll(new IRowVisitor() {
129             public void visitRow(Object keyId, String valueKey, Object value) {
130                 switch (valueKey) {
131                     case SubKeys.RECORD:
132                         MappingData md = (MappingData) value;
133                         sb.append(Stringifier.getString(md.getRecord(), 2));
134                         sb.append("\n");
135                         break;
136                     default:
137                         break;
138                 }
139             }
140         });
141         sb.append("\n");
142         return sb.toString();
143     }
144
145     public static String printMTMCMappings(ILispDAO dao) {
146         final StringBuilder sb = new StringBuilder();
147         sb.append("Keys\tValues\n");
148         final IRowVisitor innerVisitor = (new IRowVisitor() {
149             String lastKey = "";
150
151             public void visitRow(Object keyId, String valueKey, Object value) {
152                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
153                 if (!lastKey.equals(key)) {
154                     sb.append("\n" + key + "\t");
155                 }
156                 sb.append(valueKey + "=" + value + "\t");
157                 lastKey = key;
158             }
159         });
160         final IRowVisitor vniVisitor = (new IRowVisitor() {
161             String lastKey = "";
162
163             public void visitRow(Object keyId, String valueKey, Object value) {
164                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
165                 if (!lastKey.equals(key)) {
166                     sb.append(key + "\t");
167                 }
168                 if ((valueKey.equals(SubKeys.LCAF_SRCDST))) {
169                     sb.append(valueKey + "= { ");
170                     ((ILispDAO)value).getAll(innerVisitor);
171                     sb.append("}\t");
172                 } else {
173                     sb.append(valueKey + "=" + value + "\t");
174                 }
175                 lastKey = key;
176             }
177         });
178         dao.getAll(new IRowVisitor() {
179             String lastKey = "";
180
181             public void visitRow(Object keyId, String valueKey, Object value) {
182                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
183                 if (!lastKey.equals(key)) {
184                     sb.append("\n" + key + "\t");
185                 }
186                 if (valueKey.equals(SubKeys.VNI)) {
187                     sb.append(valueKey + "= { ");
188                     ((ILispDAO)value).getAll(vniVisitor);
189                     sb.append("}\t");
190                 } else {
191                     sb.append(valueKey + "=" + value + "\t");
192                 }
193                 lastKey = key;
194             }
195         });
196         sb.append("\n");
197         return sb.toString();
198     }
199
200     @SuppressWarnings("unchecked")
201     public static String prettyPrintMTMCMappings(ILispDAO dao) {
202         final StringBuilder sb = new StringBuilder();
203
204         final IRowVisitor mappingVisitor = (new IRowVisitor() {
205             public void visitRow(Object keyId, String valueKey, Object value) {
206                 switch (valueKey) {
207                     case SubKeys.RECORD:
208                         MappingData md = (MappingData) value;
209                         sb.append(Stringifier.getString(md.getRecord(), 2));
210                         sb.append("\n");
211                         break;
212                     case SubKeys.SUBSCRIBERS:
213                         Set<Subscriber> subscribers = (Set<Subscriber>) value;
214                         sb.append(prettyPrintSubscriberSet(subscribers, 4));
215                         sb.append("\n");
216                         break;
217                     case SubKeys.LCAF_SRCDST:
218                         ((ILispDAO)value).getAll(this);
219                         break;
220                     default:
221                         break;
222                 }
223             }
224         });
225
226         dao.getAll(new IRowVisitor() {
227             String lastKey = "";
228
229             public void visitRow(Object keyId, String valueKey, Object value) {
230                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
231                 if (!lastKey.equals(key)) {
232                     sb.append("Instance ID " + keyId + "\n");
233                 }
234                 if (valueKey.equals(SubKeys.VNI)) {
235                     ((ILispDAO)value).getAll(mappingVisitor);
236                 }
237                 lastKey = key;
238             }
239         });
240         return sb.toString();
241     }
242
243     public static String printSMCMappings(ILispDAO dao) {
244         final StringBuilder sb = new StringBuilder();
245         sb.append("Keys\tValues\n");
246
247         final IRowVisitor innerVisitor = (new IRowVisitor() {
248             String lastKey = "";
249
250             public void visitRow(Object keyId, String valueKey, Object value) {
251                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
252                 if (!lastKey.equals(key)) {
253                     sb.append("\n" + key + "\t");
254                 }
255                 sb.append(valueKey + "=" + value + "\t");
256                 lastKey = key;
257             }
258         });
259
260         dao.getAll(new IRowVisitor() {
261             String lastKey = "";
262
263             public void visitRow(Object keyId, String valueKey, Object value) {
264                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
265                 if (!lastKey.equals(key)) {
266                     sb.append("\n" + key + "\t");
267                 }
268                 if (valueKey.equals(SubKeys.VNI)) {
269                     sb.append(valueKey + "= { ");
270                     ((ILispDAO)value).getAll(innerVisitor);
271                     sb.append("}\t");
272                 } else {
273                     sb.append(valueKey + "=" + value + "\t");
274                 }
275                 lastKey = key;
276             }
277         });
278         sb.append("\n");
279         return sb.toString();
280     }
281
282     @SuppressWarnings("unchecked")
283     public static String prettyPrintSMCMappings(ILispDAO dao) {
284         final StringBuilder sb = new StringBuilder();
285
286         final IRowVisitor mappingVisitor = (new IRowVisitor() {
287             public void visitRow(Object keyId, String valueKey, Object value) {
288                 switch (valueKey) {
289                     case SubKeys.RECORD:
290                         MappingData md = (MappingData) value;
291                         sb.append(Stringifier.getString(md.getRecord(), 2));
292                         sb.append("\n");
293                         break;
294                     case SubKeys.SUBSCRIBERS:
295                         Set<Subscriber> subscribers = (Set<Subscriber>) value;
296                         sb.append(prettyPrintSubscriberSet(subscribers, 4));
297                         sb.append("\n");
298                         break;
299                     default:
300                         break;
301                 }
302             }
303         });
304
305         dao.getAll(new IRowVisitor() {
306             String lastKey = "";
307
308             public void visitRow(Object keyId, String valueKey, Object value) {
309                 String key = keyId.getClass().getSimpleName() + "#" + keyId;
310                 if (!lastKey.equals(key)) {
311                     sb.append("Instance ID " + keyId + "\n");
312                 }
313                 if (valueKey.equals(SubKeys.VNI)) {
314                     ((ILispDAO)value).getAll(mappingVisitor);
315                 }
316                 lastKey = key;
317             }
318         });
319         return sb.toString();
320     }
321
322     /**
323      * Given a Set of Subscriber objects, and the level of indentation, create a nicely formatted String to be added
324      * to a map-cache print-out in a tabular form.
325      *
326      * @param subscribers the Set of Subscriber objects to be printed
327      * @param indentation indentation level
328      * @return the formatted String
329      */
330     public static String prettyPrintSubscriberSet(Set<Subscriber> subscribers, int indentation) {
331         final String indent = new String(new char[indentation]).replace("\0", " ");
332
333         StringBuilder sb = new StringBuilder(indent);
334         sb.append("   -----------------------------------------------------------------\n");
335         sb.append(indent);
336
337         if (subscribers == null) {
338             return sb.append("   No subscribers").toString();
339         }
340
341         sb.append("-> Subscriber RLOC                                 Subscriber EID\n   ");
342         sb.append(indent);
343         boolean first = true;
344         for (Subscriber subscriber : subscribers) {
345             if (first) {
346                 first = false;
347             } else {
348                 sb.append("\n   ");
349                 sb.append(indent);
350             }
351             String srcRloc = LispAddressStringifier.getString(subscriber.getSrcRloc());
352             int padLen = Constants.INET6_ADDRSTRLEN + 2 - srcRloc.length();
353             sb.append(srcRloc);
354             sb.append(new String(new char[padLen]).replace("\0", " "));
355             sb.append(LispAddressStringifier.getString(subscriber.getSrcEid()));
356         }
357         return sb.toString();
358     }
359 }