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