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