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 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;
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.opendaylight.controller.md.sal.binding.api.DataBroker;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.genius.mdsalutil.MDSALUtil;
24 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
25 import org.opendaylight.genius.utils.hwvtep.HwvtepUtils;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacs;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
43 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 * Prints L2Gw devices and Elan details .
52 * Print result as per each elan instance , printing all Mcast , UCast macs and vlan binding
53 * for each l2Gw device .
55 @Command(scope = "l2gw", name = "dump", description = "Provide l2gw info per network")
56 public class NetworkL2gwDeviceInfoCli extends OsgiCommandSupport {
58 private static final String GAP = " ";
59 private static final String HEADINGUCAST = " Mac " + GAP + " Locator";
60 private static final String HEADINGMCAST = " Mac " + GAP + " Locator Set";
61 private static final String HEADINGVLAN = " TepId " + GAP + " Vlan ID";
63 @Option(name = "-elan", aliases = {"--elan"}, description = "elan name",
64 required = false, multiValued = false)
67 @Option(name = "-nodeId", aliases = {"--nodeId"}, description = "hwvtep node id",
68 required = false, multiValued = false)
71 private static InstanceIdentifier<Topology> createHwvtepTopologyInstanceIdentifier() {
72 return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
73 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID));
76 private static InstanceIdentifier<Node> createInstanceIdentifier(NodeId nodeId) {
77 return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
78 new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID)).child(Node.class, new NodeKey(nodeId));
81 Map<NodeId, Node> opNodes = new HashMap<>();
82 Map<NodeId, Node> configNodes = new HashMap<>();
83 Map<NodeId, Node> opPSNodes = new HashMap<>();
84 Map<NodeId, Node> configPSNodes = new HashMap<>();
86 private DataBroker dataBroker;
88 public void setDataBroker(DataBroker dataBroker) {
89 this.dataBroker = dataBroker;
93 protected Object doExecute() {
94 List<Node> nodes = new ArrayList<>();
95 Set<String> networks = new HashSet<>();
97 Optional<Topology> topologyOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
98 createHwvtepTopologyInstanceIdentifier());
99 if (topologyOptional.isPresent()) {
100 nodes = topologyOptional.get().getNode();
103 Optional<Node> nodeOptional = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
104 createInstanceIdentifier(new NodeId(new Uri(nodeId))));
105 if (nodeOptional.isPresent()) {
106 nodes.add(nodeOptional.get());
109 if (elanName == null) {
110 //get all elan instance
111 //get all device node id
113 Optional<ElanInstances> elanInstancesOptional = MDSALUtil.read(dataBroker,
114 LogicalDatastoreType.CONFIGURATION,
115 InstanceIdentifier.builder(ElanInstances.class).build());
116 if (elanInstancesOptional.isPresent()) {
117 List<ElanInstance> elans = elanInstancesOptional.get().getElanInstance();
119 for (ElanInstance elan : elans) {
120 networks.add(elan.getElanInstanceName());
125 networks.add(elanName);
128 for (Node node : nodes) {
129 if (node.getNodeId().getValue().contains("physicalswitch")) {
132 Node hwvtepConfigNode =
133 HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION, node.getNodeId());
134 Node hwvtepOpPsNode = getPSnode(node, LogicalDatastoreType.OPERATIONAL);
135 Node hwvtepConfigPsNode = null;
136 if (hwvtepOpPsNode != null) {
137 hwvtepConfigPsNode = HwvtepUtils.getHwVtepNode(dataBroker, LogicalDatastoreType.CONFIGURATION,
138 hwvtepOpPsNode.getNodeId());
139 opPSNodes.put(node.getNodeId(), hwvtepOpPsNode);
141 opNodes.put(node.getNodeId(), node);
142 configNodes.put(node.getNodeId(), hwvtepConfigNode);
144 if (hwvtepConfigPsNode != null) {
145 configPSNodes.put(node.getNodeId(), hwvtepConfigPsNode);
148 for (String network : networks) {
149 session.getConsole().println("Network info for " + network);
150 for (Node node : nodes) {
151 if (node.getNodeId().getValue().contains("physicalswitch")) {
154 session.getConsole().println("Printing for node " + node.getNodeId().getValue());
155 process(node.getNodeId(), network);
161 @SuppressWarnings("checkstyle:HiddenField")
162 void process(NodeId hwvtepNodeId, String elanName) {
163 Node hwvtepConfigNode = configNodes.get(hwvtepNodeId);
164 session.getConsole().println("Config Data >>");
165 printLocalUcastMacs(hwvtepConfigNode, elanName);
166 session.getConsole().println("Operational Data >>");
167 Node hwvtepOpNode = opNodes.get(hwvtepNodeId);
168 printLocalUcastMacs(hwvtepOpNode, elanName);
169 session.getConsole().println("Config Data >>");
170 printLocalMcastMacs(hwvtepConfigNode, elanName);
171 session.getConsole().println("Operational Data >>");
172 printLocalMcastMacs(hwvtepOpNode, elanName);
173 session.getConsole().println("Config Data >>");
174 printRemoteUcastMacs(hwvtepConfigNode, elanName);
175 session.getConsole().println("Operational Data >>");
176 printRemoteUcastMacs(hwvtepOpNode, elanName);
177 session.getConsole().println("Config Data >>");
178 printRemoteMcastMacs(hwvtepConfigNode, elanName);
179 session.getConsole().println("Operational Data >>");
180 printRemoteMcastMacs(hwvtepOpNode, elanName);
181 Node hwvtepConfigPsNode = configPSNodes.get(hwvtepNodeId);
182 session.getConsole().println("Config Data >>");
183 printVlanBindings(hwvtepConfigPsNode, elanName);
184 session.getConsole().println("Operational Data >>");
185 Node hwvtepOpPsNode = opPSNodes.get(hwvtepNodeId);
186 printVlanBindings(hwvtepOpPsNode, elanName);
189 @SuppressWarnings("checkstyle:HiddenField")
190 void printRemoteUcastMacs(Node hwvtepNode, String elanName) {
191 session.getConsole().println("RemoteUCast macs :");
192 session.getConsole().println(HEADINGUCAST);
193 if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
196 List<RemoteUcastMacs> remoteUcastMacs =
197 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteUcastMacs();
198 if (remoteUcastMacs == null || remoteUcastMacs.isEmpty()) {
201 for (RemoteUcastMacs remoteMac : remoteUcastMacs) {
202 String lsFromRemoteMac = getLogicalSwitchValue(remoteMac.getLogicalSwitchRef());
203 if (elanName.equals(lsFromRemoteMac)) {
204 String mac = remoteMac.getMacEntryKey().getValue();
205 String locator = getLocatorValue(remoteMac.getLocatorRef());
206 session.getConsole().println(mac + GAP + locator);
213 @SuppressWarnings("checkstyle:HiddenField")
214 void printLocalUcastMacs(Node hwvtepNode, String elanName) {
215 session.getConsole().println("LocalUCast macs :");
216 session.getConsole().println(HEADINGUCAST);
217 if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
220 List<LocalUcastMacs> localUcastMacs =
221 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getLocalUcastMacs();
222 if (localUcastMacs == null || localUcastMacs.isEmpty()) {
225 for (LocalUcastMacs localMac : localUcastMacs) {
226 String lsFromLocalMac = getLogicalSwitchValue(localMac.getLogicalSwitchRef());
227 if (elanName.equals(lsFromLocalMac)) {
228 String mac = localMac.getMacEntryKey().getValue();
229 String locator = getLocatorValue(localMac.getLocatorRef());
230 session.getConsole().println(mac + GAP + locator);
237 @SuppressWarnings("checkstyle:HiddenField")
238 void printLocalMcastMacs(Node hwvtepNode, String elanName) {
239 session.getConsole().println("LocalMcast macs :");
240 session.getConsole().println(HEADINGMCAST);
241 if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
244 List<LocalMcastMacs> localMcastMacs =
245 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getLocalMcastMacs();
246 if (localMcastMacs == null || localMcastMacs.isEmpty()) {
249 for (LocalMcastMacs localMac : localMcastMacs) {
250 String lsFromLocalMac = getLogicalSwitchValue(localMac.getLogicalSwitchRef());
251 if (elanName.equals(lsFromLocalMac)) {
252 String mac = localMac.getMacEntryKey().getValue();
253 List<String> locatorsets = new ArrayList<>();
254 for (LocatorSet locatorSet : localMac.getLocatorSet()) {
255 locatorsets.add(getLocatorValue(locatorSet.getLocatorRef()));
257 session.getConsole().println(mac + GAP + locatorsets.toString());
264 @SuppressWarnings("checkstyle:HiddenField")
265 void printRemoteMcastMacs(Node hwvtepNode, String elanName) {
266 session.getConsole().println("RemoteMCast macs :");
267 session.getConsole().println(HEADINGMCAST);
268 if (hwvtepNode == null || hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
271 List<RemoteMcastMacs> remoteMcastMacs =
272 hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteMcastMacs();
273 if (remoteMcastMacs == null || remoteMcastMacs.isEmpty()) {
276 for (RemoteMcastMacs remoteMac : remoteMcastMacs) {
277 String lsFromremoteMac = getLogicalSwitchValue(remoteMac.getLogicalSwitchRef());
278 if (elanName.equals(lsFromremoteMac)) {
279 String mac = remoteMac.getMacEntryKey().getValue();
280 List<String> locatorsets = new ArrayList<>();
281 for (LocatorSet locatorSet : remoteMac.getLocatorSet()) {
282 locatorsets.add(getLocatorValue(locatorSet.getLocatorRef()));
284 session.getConsole().println(mac + GAP + locatorsets.toString());
291 @SuppressWarnings("checkstyle:HiddenField")
292 void printVlanBindings(Node psNode, String elanName) {
293 session.getConsole().println("Vlan Bindings :");
294 session.getConsole().println(HEADINGVLAN);
295 if (psNode == null) {
298 List<TerminationPoint> terminationPoints = psNode.getTerminationPoint();
299 if (terminationPoints == null || terminationPoints.isEmpty()) {
302 for (TerminationPoint terminationPoint : terminationPoints) {
303 HwvtepPhysicalPortAugmentation aug =
304 terminationPoint.getAugmentation(HwvtepPhysicalPortAugmentation.class);
305 if (aug == null || aug.getVlanBindings() == null) {
308 for (VlanBindings vlanBindings : aug.getVlanBindings()) {
309 String lsFromremoteMac = getLogicalSwitchValue(vlanBindings.getLogicalSwitchRef());
310 if (elanName.equals(lsFromremoteMac)) {
311 session.getConsole().println(terminationPoint.getTpId().getValue()
312 + GAP + vlanBindings.getVlanIdKey().toString());
320 String getLocatorValue(HwvtepPhysicalLocatorRef locatorRef) {
321 if (locatorRef == null) {
324 return locatorRef.getValue()
325 .firstKeyOf(TerminationPoint.class).getTpId().getValue();
328 String getLogicalSwitchValue(HwvtepLogicalSwitchRef logicalSwitchRef) {
329 if (logicalSwitchRef == null) {
332 return logicalSwitchRef.getValue()
333 .firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue();
336 Node getPSnode(Node hwvtepNode, LogicalDatastoreType datastoreType) {
337 if (hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class) != null
338 && hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getSwitches() != null) {
339 for (Switches switches : hwvtepNode.getAugmentation(HwvtepGlobalAugmentation.class).getSwitches()) {
340 NodeId psNodeId = switches.getSwitchRef().getValue().firstKeyOf(Node.class).getNodeId();
341 return HwvtepUtils.getHwVtepNode(dataBroker, datastoreType, psNodeId);