2 * Copyright (c) 2017 Red Hat, Inc. 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.natservice.cli;
11 import com.google.common.base.Optional;
12 import java.io.PrintStream;
13 import java.math.BigInteger;
14 import javax.annotation.Nonnull;
15 import org.apache.karaf.shell.commands.Command;
16 import org.apache.karaf.shell.console.OsgiCommandSupport;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeRefInfo;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.napt.switches.RouterToNaptSwitch;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 @Command(scope = "odl", name = "display-napt-switches", description = "Display the napt switch for the routers.")
32 public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
34 private DataBroker dataBroker;
35 private static final String LOCAL_IP = "local_ip";
37 public void setDataBroker(DataBroker dataBroker) {
38 this.dataBroker = dataBroker;
42 protected Object doExecute() throws Exception {
43 PrintStream ps = session.getConsole();
44 Optional<NaptSwitches> npatSwitches = SingleTransactionDataBroker.syncReadOptional(dataBroker,
45 LogicalDatastoreType.CONFIGURATION, getNaptSwitchesIdentifier());
46 ps.printf(String.format(" %-36s %-20s %-20s %n", "Router Id ", "Datapath Node Id", "Managment Ip Address"));
47 ps.printf("-------------------------------------------------------------------------------------------%n");
48 if (npatSwitches.isPresent()) {
49 for (RouterToNaptSwitch routerToNaptSwitch : npatSwitches.get().getRouterToNaptSwitch()) {
50 ps.printf(String.format(" %-36s %-20s %-20s %n", routerToNaptSwitch.getRouterName(),
51 routerToNaptSwitch.getPrimarySwitchId(), getDpnLocalIp(routerToNaptSwitch.getPrimarySwitchId())));
57 private InstanceIdentifier<NaptSwitches> getNaptSwitchesIdentifier() {
58 return InstanceIdentifier.builder(NaptSwitches.class).build();
61 @SuppressWarnings("unchecked")
62 private Optional<Node> getPortsNode(BigInteger dpnId) {
63 InstanceIdentifier<BridgeRefEntry> bridgeRefInfoPath = InstanceIdentifier.create(BridgeRefInfo.class)
64 .child(BridgeRefEntry.class, new BridgeRefEntryKey(dpnId));
66 Optional<BridgeRefEntry> bridgeRefEntry =
67 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
68 LogicalDatastoreType.OPERATIONAL, bridgeRefInfoPath);
69 if (!bridgeRefEntry.isPresent()) {
70 return Optional.absent();
73 InstanceIdentifier<Node> nodeId =
74 bridgeRefEntry.get().getBridgeReference().getValue().firstIdentifierOf(Node.class);
76 return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
77 LogicalDatastoreType.OPERATIONAL, nodeId);
80 private String getDpnLocalIp(BigInteger dpId) {
81 return getPortsNode(dpId).toJavaUtil().map(node -> getOpenvswitchOtherConfig(node, LOCAL_IP)).orElse(null);
84 private String getOpenvswitchOtherConfig(Node node, String key) {
85 OvsdbNodeAugmentation ovsdbNode = node.getAugmentation(OvsdbNodeAugmentation.class);
86 if (ovsdbNode == null) {
87 Optional<Node> nodeFromReadOvsdbNode = readOvsdbNode(node);
88 if (nodeFromReadOvsdbNode.isPresent()) {
89 ovsdbNode = nodeFromReadOvsdbNode.get().getAugmentation(OvsdbNodeAugmentation.class);
93 if (ovsdbNode != null && ovsdbNode.getOpenvswitchOtherConfigs() != null) {
94 for (OpenvswitchOtherConfigs openvswitchOtherConfigs : ovsdbNode.getOpenvswitchOtherConfigs()) {
95 if (openvswitchOtherConfigs.getOtherConfigKey().equals(key)) {
96 return openvswitchOtherConfigs.getOtherConfigValue();
105 private Optional<Node> readOvsdbNode(Node bridgeNode) {
106 OvsdbBridgeAugmentation bridgeAugmentation = extractBridgeAugmentation(bridgeNode);
107 if (bridgeAugmentation != null) {
108 InstanceIdentifier<Node> ovsdbNodeIid =
109 (InstanceIdentifier<Node>) bridgeAugmentation.getManagedBy().getValue();
110 return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
111 LogicalDatastoreType.OPERATIONAL, ovsdbNodeIid);
113 return Optional.absent();
117 private OvsdbBridgeAugmentation extractBridgeAugmentation(Node node) {
121 return node.getAugmentation(OvsdbBridgeAugmentation.class);