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 java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
16 import java.util.Optional;
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;
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 .
64 @Command(scope = "l2gw", name = "dump", description = "Provide l2gw info per network")
65 public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
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";
72 @Option(name = "-elan", aliases = {"--elan"}, description = "elan name",
73 required = false, multiValued = false)
76 @Option(name = "-nodeId", aliases = {"--nodeId"}, description = "hwvtep node id",
77 required = false, multiValued = false)
80 private static InstanceIdentifier<Topology> createHwvtepTopologyInstanceIdentifier() {
81 return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
82 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
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));
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<>();
95 private DataBroker dataBroker;
97 public void setDataBroker(DataBroker dataBroker) {
98 this.dataBroker = dataBroker;
103 protected Object doExecute() {
104 List<Node> nodes = new ArrayList<>();
105 Set<String> networks = new HashSet<>();
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());
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());
120 if (elanName == null) {
121 //get all elan instance
122 //get all device node id
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();
130 for (ElanInstance elan : elans.values()) {
131 networks.add(elan.getElanInstanceName());
136 networks.add(elanName);
140 for (Node node : nodes) {
141 if (node.getNodeId().getValue().contains("physicalswitch")) {
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);
153 opNodes.put(node.getNodeId(), node);
154 configNodes.put(node.getNodeId(), hwvtepConfigNode);
156 if (hwvtepConfigPsNode != null) {
157 configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
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")) {
168 session.getConsole().println("Printing for node " + node.getNodeId().getValue());
169 process(node.getNodeId(), network);
173 } catch (ExecutionException | InterruptedException e) {
174 session.getConsole().println("Failed with error " + e.getMessage());
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);
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) {
214 Map<RemoteUcastMacsKey, RemoteUcastMacs> remoteUcastMacs =
215 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullRemoteUcastMacs();
216 if (remoteUcastMacs == null || remoteUcastMacs.isEmpty()) {
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);
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) {
238 Map<LocalUcastMacsKey, LocalUcastMacs> localUcastMacs =
239 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullLocalUcastMacs();
240 if (localUcastMacs == null || localUcastMacs.isEmpty()) {
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);
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) {
262 Map<LocalMcastMacsKey, LocalMcastMacs> localMcastMacs =
263 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullLocalMcastMacs();
264 if (localMcastMacs == null || localMcastMacs.isEmpty()) {
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()));
275 session.getConsole().println(mac + GAP + locatorsets.toString());
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) {
289 Map<RemoteMcastMacsKey, RemoteMcastMacs> remoteMcastMacs =
290 hwvtepNode.augmentation(HwvtepGlobalAugmentation.class).nonnullRemoteMcastMacs();
291 if (remoteMcastMacs == null || remoteMcastMacs.isEmpty()) {
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()));
302 session.getConsole().println(mac + GAP + locatorsets.toString());
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) {
316 Map<TerminationPointKey, TerminationPoint> terminationPoints = psNode.nonnullTerminationPoint();
317 if (terminationPoints == null || terminationPoints.isEmpty()) {
320 for (TerminationPoint terminationPoint : terminationPoints.values()) {
321 HwvtepPhysicalPortAugmentation aug =
322 terminationPoint.augmentation(HwvtepPhysicalPortAugmentation.class);
323 if (aug == null || aug.getVlanBindings() == null) {
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());
339 String getLocatorValue(HwvtepPhysicalLocatorRef locatorRef) {
340 if (locatorRef == null) {
343 return locatorRef.getValue()
344 .firstKeyOf(TerminationPoint.class).getTpId().getValue();
348 String getLogicalSwitchValue(HwvtepLogicalSwitchRef logicalSwitchRef) {
349 if (logicalSwitchRef == null) {
352 return logicalSwitchRef.getValue()
353 .firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue();
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)
362 if (switches != null) {
363 return HwvtepUtils.getHwVtepNode(dataBroker, datastoreType,
364 switches.values().iterator().next().getSwitchRef().getValue().firstKeyOf(Node.class).getNodeId());