926ec7bcf590ca2795c2456e247b6bef76dc7d76
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / cli / l2gw / NetworkL2gwDeviceInfoCli.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.netvirt.elan.cli.l2gw;
10
11 import com.google.common.base.Optional;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18 import org.apache.karaf.shell.commands.Command;
19 import org.apache.karaf.shell.commands.Option;
20 import org.apache.karaf.shell.console.OsgiCommandSupport;
21 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.genius.mdsalutil.MDSALUtil;
24 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
25 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacs;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
49
50 /**
51  * Prints L2Gw devices and Elan details .
52  * Print result as per each elan instance , printing all Mcast , UCast macs and vlan binding
53  * for each l2Gw device .
54  */
55 @Command(scope = "l2gw", name = "dump", description = "Provide l2gw info per network")
56 public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
57
58     private static final String GAP = "                              ";
59     private static final String HEADINGUCAST = "    Mac " + GAP + "          Locator";
60     private static final String HEADINGMCAST = "    Mac " + GAP + "          Locator Set";
61     private static final String HEADINGVLAN = "    TepId " + GAP + "          Vlan ID";
62
63     @Option(name = "-elan", aliases = {"--elan"}, description = "elan name",
64             required = false, multiValued = false)
65     String elanName;
66
67     @Option(name = "-nodeId", aliases = {"--nodeId"}, description = "hwvtep node id",
68             required = false, multiValued = false)
69     String nodeId;
70
71     private static InstanceIdentifier<Topology> createHwvtepTopologyInstanceIdentifier() {
72         return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
73                 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
74     }
75
76     private static InstanceIdentifier<Node> createInstanceIdentifier(NodeId nodeId) {
77         return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
78                 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class, new NodeKey(nodeId));
79     }
80
81     Map<NodeId, Node> opNodes = new HashMap<>();
82     Map<NodeId, Node> configNodes = new HashMap<>();
83     Map<NodeId, Node> opPSNodes = new HashMap<>();
84     Map<NodeId, Node> configPSNodes = new HashMap<>();
85
86     private DataBroker dataBroker;
87
88     public void setDataBroker(DataBroker dataBroker) {
89         this.dataBroker = dataBroker;
90     }
91
92     @Override
93     protected Object doExecute() {
94         List<Node> nodes = new ArrayList<>();
95         Set<String> networks = new HashSet<>();
96         if (nodeId == null) {
97             Optional<Topology> topologyOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
98                     createHwvtepTopologyInstanceIdentifier());
99             if (topologyOptional.isPresent()) {
100                 nodes = topologyOptional.get().getNode();
101             }
102         } else {
103             Optional<Node> nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
104                     createInstanceIdentifier(new NodeId(new Uri(nodeId))));
105             if (nodeOptional.isPresent()) {
106                 nodes.add(nodeOptional.get());
107             }
108         }
109         if (elanName == null) {
110             //get all elan instance
111             //get all device node id
112             //print result
113             Optional<ElanInstances> elanInstancesOptional = MDSALUtil.read(dataBroker,
114                     LogicalDatastoreType.CONFIGURATION,
115                     InstanceIdentifier.builder(ElanInstances.class).build());
116             if (elanInstancesOptional.isPresent()) {
117                 List<ElanInstance> elans = elanInstancesOptional.get().getElanInstance();
118                 if (elans != null) {
119                     for (ElanInstance elan : elans) {
120                         networks.add(elan.getElanInstanceName());
121                     }
122                 }
123             }
124         } else {
125             networks.add(elanName);
126         }
127
128         for (Node node : nodes) {
129             if (node.getNodeId().getValue().contains("physicalswitch")) {
130                 continue;
131             }
132             Node hwvtepConfigNode =
133                     HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION, node.getNodeId());
134             Node hwvtepOpPsNode = getPSnode(node, LogicalDatastoreType.OPERATIONAL);
135             Node hwvtepConfigPsNode = null;
136             if (hwvtepOpPsNode != null) {
137                 hwvtepConfigPsNode = HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION,
138                         hwvtepOpPsNode.getNodeId());
139                 opPSNodes.put(node.getNodeId(), hwvtepOpPsNode);
140             }
141             opNodes.put(node.getNodeId(), node);
142             configNodes.put(node.getNodeId(), hwvtepConfigNode);
143
144             if (hwvtepConfigPsNode != null) {
145                 configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
146             }
147         }
148         for (String network : networks) {
149             session.getConsole().println("Network info for " + network);
150             for (Node node : nodes) {
151                 if (node.getNodeId().getValue().contains("physicalswitch")) {
152                     continue;
153                 }
154                 session.getConsole().println("Printing for node " + node.getNodeId().getValue());
155                 process(node.getNodeId(), network);
156             }
157         }
158         return null;
159     }
160
161     @SuppressWarnings("checkstyle:HiddenField")
162     void process(NodeId hwvtepNodeId, String elanName) {
163         Node hwvtepConfigNode = configNodes.get(hwvtepNodeId);
164         session.getConsole().println("Config Data >>");
165         printLocalUcastMacs(hwvtepConfigNode, elanName);
166         session.getConsole().println("Operational Data >>");
167         Node hwvtepOpNode = opNodes.get(hwvtepNodeId);
168         printLocalUcastMacs(hwvtepOpNode, elanName);
169         session.getConsole().println("Config Data >>");
170         printLocalMcastMacs(hwvtepConfigNode, elanName);
171         session.getConsole().println("Operational Data >>");
172         printLocalMcastMacs(hwvtepOpNode, elanName);
173         session.getConsole().println("Config Data >>");
174         printRemoteUcastMacs(hwvtepConfigNode, elanName);
175         session.getConsole().println("Operational Data >>");
176         printRemoteUcastMacs(hwvtepOpNode, elanName);
177         session.getConsole().println("Config Data >>");
178         printRemoteMcastMacs(hwvtepConfigNode, elanName);
179         session.getConsole().println("Operational Data >>");
180         printRemoteMcastMacs(hwvtepOpNode, elanName);
181         Node hwvtepConfigPsNode = configPSNodes.get(hwvtepNodeId);
182         session.getConsole().println("Config Data >>");
183         printVlanBindings(hwvtepConfigPsNode, elanName);
184         session.getConsole().println("Operational Data >>");
185         Node hwvtepOpPsNode = opPSNodes.get(hwvtepNodeId);
186         printVlanBindings(hwvtepOpPsNode, elanName);
187     }
188
189     @SuppressWarnings("checkstyle:HiddenField")
190     void printRemoteUcastMacs(Node hwvtepNode, String elanName) {
191         session.getConsole().println("RemoteUCast macs :");
192         session.getConsole().println(HEADINGUCAST);
193         if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
194             return;
195         }
196         List<RemoteUcastMacs> remoteUcastMacs =
197                 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteUcastMacs();
198         if (remoteUcastMacs == null || remoteUcastMacs.isEmpty()) {
199             return;
200         }
201         for (RemoteUcastMacs remoteMac : remoteUcastMacs) {
202             String lsFromRemoteMac = getLogicalSwitchValue(remoteMac.getLogicalSwitchRef());
203             if (elanName.equals(lsFromRemoteMac)) {
204                 String mac = remoteMac.getMacEntryKey().getValue();
205                 String locator = getLocatorValue(remoteMac.getLocatorRef());
206                 session.getConsole().println(mac + GAP + locator);
207             }
208         }
209
210
211     }
212
213     @SuppressWarnings("checkstyle:HiddenField")
214     void printLocalUcastMacs(Node hwvtepNode, String elanName) {
215         session.getConsole().println("LocalUCast macs :");
216         session.getConsole().println(HEADINGUCAST);
217         if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
218             return;
219         }
220         List<LocalUcastMacs> localUcastMacs =
221                 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getLocalUcastMacs();
222         if (localUcastMacs == null || localUcastMacs.isEmpty()) {
223             return;
224         }
225         for (LocalUcastMacs localMac : localUcastMacs) {
226             String lsFromLocalMac = getLogicalSwitchValue(localMac.getLogicalSwitchRef());
227             if (elanName.equals(lsFromLocalMac)) {
228                 String mac = localMac.getMacEntryKey().getValue();
229                 String locator = getLocatorValue(localMac.getLocatorRef());
230                 session.getConsole().println(mac + GAP + locator);
231             }
232         }
233
234
235     }
236
237     @SuppressWarnings("checkstyle:HiddenField")
238     void printLocalMcastMacs(Node hwvtepNode, String elanName) {
239         session.getConsole().println("LocalMcast macs :");
240         session.getConsole().println(HEADINGMCAST);
241         if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
242             return;
243         }
244         List<LocalMcastMacs> localMcastMacs =
245                 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getLocalMcastMacs();
246         if (localMcastMacs == null || localMcastMacs.isEmpty()) {
247             return;
248         }
249         for (LocalMcastMacs localMac : localMcastMacs) {
250             String lsFromLocalMac = getLogicalSwitchValue(localMac.getLogicalSwitchRef());
251             if (elanName.equals(lsFromLocalMac)) {
252                 String mac = localMac.getMacEntryKey().getValue();
253                 List<String> locatorsets = new ArrayList<>();
254                 for (LocatorSet locatorSet : localMac.getLocatorSet()) {
255                     locatorsets.add(getLocatorValue(locatorSet.getLocatorRef()));
256                 }
257                 session.getConsole().println(mac + GAP + locatorsets.toString());
258             }
259         }
260
261
262     }
263
264     @SuppressWarnings("checkstyle:HiddenField")
265     void printRemoteMcastMacs(Node hwvtepNode, String elanName) {
266         session.getConsole().println("RemoteMCast macs :");
267         session.getConsole().println(HEADINGMCAST);
268         if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
269             return;
270         }
271         List<RemoteMcastMacs> remoteMcastMacs =
272                 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteMcastMacs();
273         if (remoteMcastMacs == null || remoteMcastMacs.isEmpty()) {
274             return;
275         }
276         for (RemoteMcastMacs remoteMac : remoteMcastMacs) {
277             String lsFromremoteMac = getLogicalSwitchValue(remoteMac.getLogicalSwitchRef());
278             if (elanName.equals(lsFromremoteMac)) {
279                 String mac = remoteMac.getMacEntryKey().getValue();
280                 List<String> locatorsets = new ArrayList<>();
281                 for (LocatorSet locatorSet : remoteMac.getLocatorSet()) {
282                     locatorsets.add(getLocatorValue(locatorSet.getLocatorRef()));
283                 }
284                 session.getConsole().println(mac + GAP + locatorsets.toString());
285             }
286         }
287
288
289     }
290
291     @SuppressWarnings("checkstyle:HiddenField")
292     void printVlanBindings(Node psNode, String elanName) {
293         session.getConsole().println("Vlan Bindings :");
294         session.getConsole().println(HEADINGVLAN);
295         if (psNode == null) {
296             return;
297         }
298         List<TerminationPoint> terminationPoints = psNode.getTerminationPoint();
299         if (terminationPoints == null || terminationPoints.isEmpty()) {
300             return;
301         }
302         for (TerminationPoint terminationPoint : terminationPoints) {
303             HwvtepPhysicalPortAugmentation aug =
304                     terminationPoint.getAugmentation(HwvtepPhysicalPortAugmentation.class);
305             if (aug == null || aug.getVlanBindings() == null) {
306                 continue;
307             }
308             for (VlanBindings vlanBindings : aug.getVlanBindings()) {
309                 String lsFromremoteMac = getLogicalSwitchValue(vlanBindings.getLogicalSwitchRef());
310                 if (elanName.equals(lsFromremoteMac)) {
311                     session.getConsole().println(terminationPoint.getTpId().getValue()
312                             + GAP + vlanBindings.getVlanIdKey().toString());
313                 }
314             }
315         }
316
317
318     }
319
320     String getLocatorValue(HwvtepPhysicalLocatorRef locatorRef) {
321         if (locatorRef == null) {
322             return null;
323         }
324         return locatorRef.getValue()
325                 .firstKeyOf(TerminationPoint.class).getTpId().getValue();
326     }
327
328     String getLogicalSwitchValue(HwvtepLogicalSwitchRef logicalSwitchRef) {
329         if (logicalSwitchRef == null) {
330             return null;
331         }
332         return logicalSwitchRef.getValue()
333                 .firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue();
334     }
335
336     Node getPSnode(Node hwvtepNode, LogicalDatastoreType datastoreType) {
337         if (hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) != null
338                 && hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getSwitches() != null) {
339             for (Switches switches : hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getSwitches()) {
340                 NodeId psNodeId = switches.getSwitchRef().getValue().firstKeyOf(Node.class).getNodeId();
341                 return HwvtepUtils.getHwVtepNode(dataBroker, datastoreType, psNodeId);
342             }
343         }
344         return null;
345     }
346 }