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