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