297c11244365394e6813a3853b2ea7e13d7a9ebc
[genius.git] / interfacemanager / interfacemanager-shell / src / main / java / org / opendaylight / genius / interfacemanager / shell / IfmCLIUtil.java
1 /*
2  * Copyright (c) 2016 - 2017 Ericsson India Global Services Pvt Ltd. and others.  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.genius.interfacemanager.shell;
9
10 import java.util.Formatter;
11 import org.apache.felix.service.command.CommandSession;
12 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
13 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo.InterfaceOpState;
14 import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
21 import org.opendaylight.yangtools.yang.common.Uint64;
22
23 public final class IfmCLIUtil {
24     private static final String VLAN_OUTPUT_FORMAT_LINE1 = "%-55s";
25     private static final String VLAN_OUTPUT_FORMAT = "%-24s %-20s %-15s %-24s";
26     private static final String VXLAN_OUTPUT_FORMAT = "%-24s %-24s %-18s %-5s";
27     private static final String VXLAN_OUTPUT_FORMAT_LINE1 = "%-49s %-45s";
28     private static final String IF_TP_OUTPUT_FORMAT = "%-24s";
29     private static final String TP_OUTPUT_FORMAT = "%-24s %-20s %-8s";
30     private static final String BFD_OUTPUT_FORMAT = "%-24s %-8s";
31     private static final String TP_VXLAN_OUTPUT_FORMAT_LINE1 = "local_ip:%-24s remote_ip:%-24s key:%-12s";
32     private static final String BRIDGE_PORTS_OUTPUT_FORMAT_HEADER = "%-8s %-20s";
33     private static final String TP_OUTPUT_FORMAT_LINE2 = "%-12s";
34     private static final String UNSET = "N/A";
35     private static final int IFTYPE_LEN = "InterfaceType".length();
36
37     private IfmCLIUtil() {
38     }
39
40     static void showVlanHeaderOutput(CommandSession session) {
41         StringBuilder sb = new StringBuilder();
42         Formatter fmt = new Formatter(sb);
43         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT_LINE1, "Name"));
44         sb.setLength(0);
45         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT, "", "Dpn", "PortName",
46                 "Vlan-Id"));
47         sb.setLength(0);
48         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT, "Tag", "PortNo",
49                 "AdmState", "OpState"));
50         sb.setLength(0);
51         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT, "Description", "", "", ""));
52         sb.setLength(0);
53         session.getConsole().println(fmt
54             .format("--------------------------------------------------------------------------------"));
55         sb.setLength(0);
56         fmt.close();
57     }
58
59     static void showVlanOutput(InterfaceInfo ifaceInfo, Interface iface, CommandSession session) {
60         StringBuilder sb = new StringBuilder();
61         Formatter fmt = new Formatter(sb);
62         IfL2vlan l2vlan = iface.augmentation(IfL2vlan.class);
63         int vlanId = l2vlan != null ? l2vlan.getVlanId() != null ? l2vlan.getVlanId().getValue().toJava() : 0 : 0;
64         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT_LINE1,
65                 iface.getName()));
66         sb.setLength(0);
67         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT,
68                 "", ifaceInfo == null ? UNSET : ifaceInfo.getDpId(),
69                 ifaceInfo == null ? UNSET : ifaceInfo.getPortName(), vlanId));
70         sb.setLength(0);
71         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT,
72                 ifaceInfo == null ? UNSET : ifaceInfo.getInterfaceTag(),
73                 ifaceInfo == null ? UNSET  : ifaceInfo.getPortNo(),
74                 ifaceInfo == null ? UNSET : ifaceInfo.getAdminState(),
75                 ifaceInfo == null ? UNSET : ifaceInfo.getOpState()));
76         sb.setLength(0);
77         session.getConsole().println(fmt.format(VLAN_OUTPUT_FORMAT + "%n",
78                 iface.getDescription(), "", "", ""));
79         sb.setLength(0);
80         fmt.close();
81     }
82
83     static void showVxlanHeaderOutput(CommandSession session) {
84         StringBuilder sb = new StringBuilder();
85         Formatter fmt = new Formatter(sb);
86         session.getConsole().println(fmt
87                 .format(VXLAN_OUTPUT_FORMAT_LINE1, "Name", "Description"));
88         sb.setLength(0);
89         session.getConsole().println(fmt.format(VXLAN_OUTPUT_FORMAT, "Local IP",
90                 "Remote IP", "Gateway IP", "AdmState"));
91         sb.setLength(0);
92         session.getConsole().println(fmt.format(VXLAN_OUTPUT_FORMAT, "OpState", "Parent",
93                 "Tag", ""));
94         sb.setLength(0);
95         session.getConsole().println(fmt
96                 .format("--------------------------------------------------------------------------------"));
97         fmt.close();
98     }
99
100     static void showVxlanOutput(Interface iface, InterfaceInfo interfaceInfo, CommandSession session) {
101         StringBuilder sb = new StringBuilder();
102         Formatter fmt = new Formatter(sb);
103         session.getConsole().println(fmt.format(VXLAN_OUTPUT_FORMAT_LINE1,
104                 iface.getName(),
105                 iface.getDescription() == null ? UNSET : iface.getDescription()));
106         sb.setLength(0);
107         IfTunnel ifTunnel = iface.augmentation(IfTunnel.class);
108         session.getConsole().println(fmt.format(VXLAN_OUTPUT_FORMAT,
109                 ifTunnel.getTunnelSource().stringValue(),
110                 ifTunnel.getTunnelDestination().stringValue(),
111                 ifTunnel.getTunnelGateway() == null ? UNSET : ifTunnel.getTunnelGateway().stringValue(),
112                 interfaceInfo == null ? InterfaceInfo.InterfaceAdminState.DISABLED : interfaceInfo.getAdminState()));
113         sb.setLength(0);
114         ParentRefs parentRefs = iface.augmentation(ParentRefs.class);
115         session.getConsole().println(fmt.format(VXLAN_OUTPUT_FORMAT + "\n",
116                 interfaceInfo == null ? InterfaceOpState.DOWN : interfaceInfo.getOpState(),
117                 String.format("%s/%s", parentRefs.getDatapathNodeIdentifier(),
118                         iface.getName()),
119                 interfaceInfo == null ? UNSET : interfaceInfo.getInterfaceTag(), ""));
120         fmt.close();
121     }
122
123     //TODO: Capture more information and cleaner display for TerminationPoint
124     static void showInterfaceToTpHeader(CommandSession session) {
125         StringBuilder sb = new StringBuilder();
126         Formatter fmt = new Formatter(sb);
127         session.getConsole().println(fmt
128                         .format(TP_OUTPUT_FORMAT, "PortName", "Type", "OFPort"));
129         sb.setLength(0);
130         session.getConsole().println(fmt
131                 .format(IF_TP_OUTPUT_FORMAT, "InterfaceName"));
132         sb.setLength(0);
133         session.getConsole().println(fmt
134                 .format("--------------------------------------------------------------------------------"));
135         fmt.close();
136     }
137
138     static void showInterfaceToTpOutput(String ifName, OvsdbTerminationPointAugmentation port,
139                                         CommandSession session) {
140         StringBuilder sb = new StringBuilder();
141         Formatter fmt = new Formatter(sb);
142         session.getConsole().println(fmt
143                 .format(TP_OUTPUT_FORMAT, port.getName(), getPortTypeStr(port), port.getOfport()));
144         sb.setLength(0);
145         session.getConsole().println(fmt.format(IF_TP_OUTPUT_FORMAT, ifName));
146         sb.setLength(0);
147         fmt.close();
148     }
149
150     static void printBfdCachesHeader(CommandSession session) {
151         StringBuilder sb = new StringBuilder();
152         Formatter fmt = new Formatter(sb);
153         session.getConsole().println(fmt.format(BFD_OUTPUT_FORMAT, "InterfaceName", "OperStatus"));
154         sb.setLength(0);
155         session.getConsole().println(fmt
156                 .format("--------------------------------------------------------------------------------"));
157         fmt.close();
158     }
159
160     static void printBfdCachesOutput(String ifName, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
161             .interfaces.rev140508.interfaces.state.Interface.OperStatus st,
162                                        CommandSession session) {
163         StringBuilder sb = new StringBuilder();
164         Formatter fmt = new Formatter(sb);
165         session.getConsole().println(fmt.format(BFD_OUTPUT_FORMAT, ifName, st.getName()));
166         fmt.close();
167     }
168
169     static void showBridgePortsHeader(CommandSession session, Uint64 dpnId) {
170         StringBuilder sb = new StringBuilder();
171         Formatter fmt = new Formatter(sb);
172         session.getConsole().println(fmt
173                 .format(BRIDGE_PORTS_OUTPUT_FORMAT_HEADER, "DPN-ID", dpnId));
174         sb.setLength(0);
175         session.getConsole().println(fmt
176                 .format("--------------------------------------------------------------------------------"));
177         sb.setLength(0);
178         session.getConsole().println(fmt
179                         .format(TP_OUTPUT_FORMAT, "PortName", "Type", "OFPort"));
180         sb.setLength(0);
181         session.getConsole().println(fmt
182                         .format(TP_OUTPUT_FORMAT_LINE2, "PortDetails"));
183         sb.setLength(0);
184         session.getConsole().println(fmt
185                         .format("--------------------------------------------------------------------------------"));
186         fmt.close();
187     }
188
189     static void showBridgePortsOutput(CommandSession session, OvsdbTerminationPointAugmentation port) {
190         StringBuilder sb = new StringBuilder();
191         Formatter fmt = new Formatter(sb);
192         session.getConsole().println(fmt
193             .format(TP_OUTPUT_FORMAT, port.getName(), getPortTypeStr(port), port.getOfport()));
194         sb.setLength(0);
195         session.getConsole().println(getPortDetails(port));
196         sb.setLength(0);
197         fmt.close();
198     }
199
200     private static String getPortTypeStr(OvsdbTerminationPointAugmentation port) {
201         String portType = port.getInterfaceType().getSimpleName();
202         // Skip the InterfaceType part
203         if (portType.startsWith("InterfaceType")) {
204             return portType.substring(IFTYPE_LEN);
205         } else {
206             return portType;
207         }
208     }
209
210     private static String getPortDetails(OvsdbTerminationPointAugmentation port) {
211         if (SouthboundUtils.isInterfaceTypeTunnel(port.getInterfaceType())) {
212             String remoteIp = UNSET;
213             String localIp = UNSET;
214             String key = UNSET;
215             for (Options portOption: port.nonnullOptions()) {
216                 switch (portOption.getOption()) {
217                     case "local_ip":
218                         localIp = portOption.getValue();
219                         break;
220                     case "remote_ip":
221                         remoteIp = portOption.getValue();
222                         break;
223                     case "key":
224                         key = portOption.getValue();
225                         break;
226                     default:
227                         break;
228                 }
229             }
230             return String.format(TP_VXLAN_OUTPUT_FORMAT_LINE1, localIp, remoteIp, key);
231         }
232         return String.format(TP_OUTPUT_FORMAT_LINE2, UNSET);
233     }
234 }