2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.netvirt.elan.cli.l2gw;
11 import static org.opendaylight.mdsal.binding.util.Datastore.OPERATIONAL;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.List;
18 import java.util.Optional;
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;
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 .
66 @Command(scope = "l2gw", name = "dump", description = "Provide l2gw info per network")
67 public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
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";
74 @Option(name = "-elan", aliases = {"--elan"}, description = "elan name",
75 required = false, multiValued = false)
78 @Option(name = "-nodeId", aliases = {"--nodeId"}, description = "hwvtep node id",
79 required = false, multiValued = false)
82 private static InstanceIdentifier<Topology> createHwvtepTopologyInstanceIdentifier() {
83 return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
84 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
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));
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<>();
97 private DataBroker dataBroker;
99 public void setDataBroker(DataBroker dataBroker) {
100 this.dataBroker = dataBroker;
105 @SuppressWarnings("illegalcatch")
106 protected Object doExecute() {
107 ManagedNewTransactionRunner txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
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());
119 Optional<Node> nodeOptional = operTx
120 .read(createInstanceIdentifier(new NodeId(new Uri(nodeId)))).get();
121 if (nodeOptional.isPresent()) {
122 nodes.add(nodeOptional.get());
125 if (elanName == null) {
126 //get all elan instance
127 //get all device node id
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());
136 for (ElanInstance elan : elans) {
137 networks.add(elan.getElanInstanceName());
142 networks.add(elanName);
146 for (Node node : nodes) {
147 if (node.getNodeId().getValue().contains("physicalswitch")) {
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);
160 opNodes.put(node.getNodeId(), node);
161 configNodes.put(node.getNodeId(), hwvtepConfigNode);
163 if (hwvtepConfigPsNode != null) {
164 configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
168 if (!networks.isEmpty()) {
169 for (String network : networks) {
170 session.getConsole().println("Network info for " + network);
172 for (Node node : nodes) {
173 if (node.getNodeId().getValue().contains("physicalswitch")) {
176 session.getConsole().println("Printing for node " + node.getNodeId().getValue());
177 process(node.getNodeId(), network);
183 } catch (Exception e) {
184 session.getConsole().println("Failed with error " + e.getMessage());
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);
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) {
224 Map<RemoteUcastMacsKey, RemoteUcastMacs> remoteUcastMacs =
225 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullRemoteUcastMacs();
226 if (remoteUcastMacs == null || remoteUcastMacs.isEmpty()) {
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);
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) {
248 Map<LocalUcastMacsKey, LocalUcastMacs> localUcastMacs =
249 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullLocalUcastMacs();
250 if (localUcastMacs == null || localUcastMacs.isEmpty()) {
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);
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) {
272 Map<LocalMcastMacsKey, LocalMcastMacs> localMcastMacs =
273 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullLocalMcastMacs();
274 if (localMcastMacs == null || localMcastMacs.isEmpty()) {
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()));
285 session.getConsole().println(mac + GAP + locatorsets.toString());
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) {
299 Map<RemoteMcastMacsKey, RemoteMcastMacs> remoteMcastMacs =
300 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullRemoteMcastMacs();
301 if (remoteMcastMacs == null || remoteMcastMacs.isEmpty()) {
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()));
312 session.getConsole().println(mac + GAP + locatorsets.toString());
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) {
326 Map<TerminationPointKey, TerminationPoint> terminationPoints = psNode.nonnullTerminationPoint();
327 if (terminationPoints == null || terminationPoints.isEmpty()) {
330 for (TerminationPoint terminationPoint : terminationPoints.values()) {
331 HwvtepPhysicalPortAugmentation aug =
332 terminationPoint.augmentation(HwvtepPhysicalPortAugmentation.class);
333 if (aug == null || aug.getVlanBindings() == null) {
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());
347 String getLocatorValue(HwvtepPhysicalLocatorRef locatorRef) {
348 if (locatorRef == null) {
351 return locatorRef.getValue()
352 .firstKeyOf(TerminationPoint.class).getTpId().getValue();
356 String getLogicalSwitchValue(HwvtepLogicalSwitchRef logicalSwitchRef) {
357 if (logicalSwitchRef == null) {
360 return logicalSwitchRef.getValue()
361 .firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue();
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);