Command line added to display the current NAPT switches configured.
[netvirt.git] / vpnservice / natservice / natservice-impl / src / main / java / org / opendaylight / netvirt / natservice / cli / DisplayNaptSwithcesCli.java
1 /*
2  * Copyright (c) 2017 Red Hat, Inc. 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.natservice.cli;
10
11 import com.google.common.base.Optional;
12 import java.io.PrintStream;
13 import java.math.BigInteger;
14
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.netvirt.natservice.internal.NatUtil;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeRefInfo;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.napt.switches.RouterToNaptSwitch;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31
32 @Command(scope = "odl", name = "display-napt-switches", description = "Display the napt switch for the routers.")
33 public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
34
35     private DataBroker dataBroker;
36     private static final String LOCAL_IP = "local_ip";
37
38     public void setDataBroker(DataBroker dataBroker) {
39         this.dataBroker = dataBroker;
40     }
41
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                 "IP Address"));
48         ps.printf("-------------------------------------------------------------------------------------------\n");
49         if (npatSwitches.isPresent()) {
50             for (RouterToNaptSwitch routerToNaptSwitch : npatSwitches.get().getRouterToNaptSwitch()) {
51                 ps.printf(String.format(" %-36s  %-20s  %-20s \n", routerToNaptSwitch.getRouterName(),
52                      routerToNaptSwitch.getPrimarySwitchId(), getDpnLocalIp(routerToNaptSwitch.getPrimarySwitchId())));
53             }
54         }
55         return null;
56     }
57
58     private InstanceIdentifier<NaptSwitches> getNaptSwitchesIdentifier() {
59         return InstanceIdentifier.builder(NaptSwitches.class).build();
60     }
61
62     @SuppressWarnings("unchecked")
63     private Optional<Node> getPortsNode(BigInteger dpnId) {
64         InstanceIdentifier<BridgeRefEntry> bridgeRefInfoPath = InstanceIdentifier.create(BridgeRefInfo.class)
65                 .child(BridgeRefEntry.class, new BridgeRefEntryKey(dpnId));
66
67         Optional<BridgeRefEntry> bridgeRefEntry = NatUtil.read(dataBroker,LogicalDatastoreType.OPERATIONAL,
68                 bridgeRefInfoPath);
69         if (!bridgeRefEntry.isPresent()) {
70             return Optional.absent();
71         }
72
73         InstanceIdentifier<Node> nodeId =
74                 ((InstanceIdentifier<OvsdbBridgeAugmentation>) bridgeRefEntry.get().getBridgeReference().getValue())
75                         .firstIdentifierOf(Node.class);
76
77         Optional<Node> node = NatUtil.read(dataBroker,LogicalDatastoreType.OPERATIONAL, nodeId);
78         return node;
79     }
80
81     private String getDpnLocalIp(BigInteger dpId) {
82         Optional<Node> node = getPortsNode(dpId);
83
84         if (node.isPresent()) {
85             String localIp = getOpenvswitchOtherConfig(node.get(), LOCAL_IP);
86             if (localIp != null) {
87                 return localIp;
88             }
89         }
90
91         return null;
92     }
93
94     private String getOpenvswitchOtherConfig(Node node, String key) {
95         OvsdbNodeAugmentation ovsdbNode = node.getAugmentation(OvsdbNodeAugmentation.class);
96         if (ovsdbNode == null) {
97             Optional<Node> nodeFromReadOvsdbNode = readOvsdbNode(node);
98             if (nodeFromReadOvsdbNode.isPresent()) {
99                 ovsdbNode = nodeFromReadOvsdbNode.get().getAugmentation(OvsdbNodeAugmentation.class);
100             }
101         }
102
103         if (ovsdbNode != null && ovsdbNode.getOpenvswitchOtherConfigs() != null) {
104             for (OpenvswitchOtherConfigs openvswitchOtherConfigs : ovsdbNode.getOpenvswitchOtherConfigs()) {
105                 if (openvswitchOtherConfigs.getOtherConfigKey().equals(key)) {
106                     return openvswitchOtherConfigs.getOtherConfigValue();
107                 }
108             }
109         }
110
111         return null;
112     }
113
114     private Optional<Node> readOvsdbNode(Node bridgeNode) {
115         Optional<Node>  node =  null;
116         OvsdbBridgeAugmentation bridgeAugmentation = extractBridgeAugmentation(bridgeNode);
117         if (bridgeAugmentation != null) {
118             InstanceIdentifier<Node> ovsdbNodeIid =
119                     (InstanceIdentifier<Node>) bridgeAugmentation.getManagedBy().getValue();
120             node = NatUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, ovsdbNodeIid);
121         }
122         return node;
123
124     }
125
126     private OvsdbBridgeAugmentation extractBridgeAugmentation(Node node) {
127         if (node == null) {
128             return null;
129         }
130         return node.getAugmentation(OvsdbBridgeAugmentation.class);
131     }
132
133 }