2 * Copyright © 2016, 2017 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
8 package org.opendaylight.netvirt.vpnmanager.shell;
10 import com.google.common.base.Optional;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
16 import java.util.Objects;
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.controller.md.sal.binding.api.DataBroker;
24 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInterfaceOpData;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn._interface.op.data.VpnInterfaceOpDataEntry;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInstances;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInterfaces;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.VpnInstance;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterface;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNames;
34 import org.opendaylight.yangtools.yang.binding.DataObject;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
39 @Command(scope = "vpnservice", name = "vpn-show", description = "Display all present vpnInstances with their "
40 + "respective count of oper and config vpnInterfaces")
41 public class ShowVpn extends OsgiCommandSupport {
43 @Option(name = "--detail", aliases = {"--vpninstance"}, description = "Display oper and config interfaces for "
44 + "given vpnInstanceName", required = false, multiValued = false)
45 private String detail;
47 private static final Logger LOG = LoggerFactory.getLogger(ShowVpn.class);
48 private DataBroker dataBroker;
49 private int configCount = 0;
50 private int operCount = 0;
51 private int totalOperCount = 0;
52 private int totalConfigCount = 0;
53 private Integer ifPresent;
54 private List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances
55 .VpnInstance> vpnInstanceList = new ArrayList<>();
56 private List<VpnInterface> vpnInterfaceConfigList = new ArrayList<>();
57 private List<VpnInterfaceOpDataEntry> vpnInterfaceOpList = new ArrayList<>();
59 public void setDataBroker(DataBroker broker) {
60 this.dataBroker = broker;
65 protected Object doExecute() {
66 Map<String, Integer> vpnNameToConfigInterfaceMap = new HashMap<>();
67 Map<String, Integer> vpnNameToOperInterfaceMap = new HashMap<>();
70 Set<String> vpnInstances = new HashSet<>();
71 for (VpnInterface vpnInterface : vpnInterfaceConfigList) {
72 if (vpnInterface.getVpnInstanceNames() != null) {
73 for (VpnInstanceNames vpnInterfaceVpnInstance : vpnInterface.getVpnInstanceNames()) {
74 String vpnName = vpnInterfaceVpnInstance.getVpnName();
75 if (vpnName != null) {
76 vpnInstances.add(vpnName);
81 for (String routerId : vpnInstances) {
82 ifPresent = vpnNameToConfigInterfaceMap.get(routerId);
83 if (ifPresent == null) {
84 vpnNameToConfigInterfaceMap.put(routerId, 1);
86 vpnNameToConfigInterfaceMap.put(routerId,
87 vpnNameToConfigInterfaceMap.get(routerId) + 1);
90 for (VpnInterfaceOpDataEntry vpnInterfaceOp : vpnInterfaceOpList) {
91 ifPresent = vpnNameToOperInterfaceMap.get(vpnInterfaceOp.getVpnInstanceName());
92 if (ifPresent == null) {
93 vpnNameToOperInterfaceMap.put(vpnInterfaceOp.getVpnInstanceName(), 1);
95 vpnNameToOperInterfaceMap.put(vpnInterfaceOp.getVpnInstanceName(),
96 vpnNameToOperInterfaceMap.get(vpnInterfaceOp.getVpnInstanceName()) + 1);
99 session.getConsole().println("-----------------------------------------------------------------------");
100 session.getConsole().println(
101 String.format(" %s %14s %5s %5s", "VpnInstanceName", "RD", "Config Count",
103 session.getConsole().println(
104 "\n-----------------------------------------------------------------------");
105 for (VpnInstance vpnInstance : vpnInstanceList) {
108 Integer count = vpnNameToConfigInterfaceMap.get(vpnInstance.getVpnInstanceName());
110 configCount = vpnNameToConfigInterfaceMap.get(vpnInstance.getVpnInstanceName());
111 totalConfigCount = totalConfigCount + configCount;
113 count = vpnNameToOperInterfaceMap.get(vpnInstance.getVpnInstanceName());
115 operCount = vpnNameToOperInterfaceMap.get(vpnInstance.getVpnInstanceName());
116 totalOperCount = totalOperCount + operCount;
118 session.getConsole().println(
119 String.format("%-32s %-10s %-10s %-10s", vpnInstance.getVpnInstanceName(),
120 vpnInstance.getRouteDistinguisher(), configCount, operCount));
122 session.getConsole().println("-----------------------------------------------------------------------");
123 session.getConsole().println(
124 String.format("Total Count: %19s %8s", totalConfigCount, totalOperCount));
125 session.getConsole().println(getshowVpnCLIHelp());
128 session.getConsole().println("Present Config VpnInterfaces are:");
129 for (VpnInterface vpnInterface : vpnInterfaceConfigList) {
130 if (VpnHelper.doesVpnInterfaceBelongToVpnInstance(detail, vpnInterface.getVpnInstanceNames())) {
131 session.getConsole().println(vpnInterface.getName());
134 session.getConsole().println("Present Oper VpnInterfaces are:");
135 for (VpnInterfaceOpDataEntry vpnInterfaceOp : vpnInterfaceOpList) {
136 if (Objects.equals(vpnInterfaceOp.getVpnInstanceName(), detail)) {
137 session.getConsole().println(vpnInterfaceOp.getName());
144 private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
145 InstanceIdentifier<T> path) {
146 try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction()) {
147 return tx.read(datastoreType, path).get();
148 } catch (InterruptedException | ExecutionException e) {
149 throw new RuntimeException(e);
153 private void showVpn() {
154 InstanceIdentifier<VpnInstances> vpnsIdentifier = InstanceIdentifier.builder(VpnInstances.class).build();
155 InstanceIdentifier<VpnInterfaces> vpnInterfacesIdentifier = InstanceIdentifier.builder(VpnInterfaces
157 Optional<VpnInstances> optionalVpnInstances = read(LogicalDatastoreType.CONFIGURATION, vpnsIdentifier);
159 if (!optionalVpnInstances.isPresent()) {
160 LOG.trace("No VPNInstances configured.");
161 session.getConsole().println("No VPNInstances configured.");
163 vpnInstanceList = optionalVpnInstances.get().getVpnInstance();
166 Optional<VpnInterfaces> optionalVpnInterfacesConfig =
167 read(LogicalDatastoreType.CONFIGURATION, vpnInterfacesIdentifier);
169 if (!optionalVpnInterfacesConfig.isPresent()) {
170 LOG.trace("No Config VpnInterface is present");
171 session.getConsole().println("No Config VpnInterface is present");
173 vpnInterfaceConfigList = optionalVpnInterfacesConfig.get().getVpnInterface();
177 InstanceIdentifier<VpnInterfaceOpData> id = InstanceIdentifier.create(VpnInterfaceOpData.class);
178 Optional<VpnInterfaceOpData> optionalVpnInterfacesOper = read(LogicalDatastoreType.OPERATIONAL, id);
180 if (!optionalVpnInterfacesOper.isPresent()) {
181 LOG.trace("No Oper VpnInterface is present");
182 session.getConsole().println("No Oper VpnInterface is present");
184 vpnInterfaceOpList = optionalVpnInterfacesOper.get().getVpnInterfaceOpDataEntry();
188 private String getshowVpnCLIHelp() {
189 StringBuilder help = new StringBuilder("\nUsage:");
190 help.append("To display vpn-interfaces for a particular vpnInstance vpn-show --detail [<vpnInstanceName>]");
191 return help.toString();