Bulk merge of l2gw changes
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / cli / l2gw / L2GwUtilsCacheCli.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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 package org.opendaylight.netvirt.elan.cli.l2gw;
9
10 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11 import java.io.File;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.io.PrintStream;
15 import java.util.Collection;
16 import java.util.Map;
17 import java.util.Map.Entry;
18 import java.util.concurrent.ConcurrentMap;
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.utils.hwvtep.HwvtepHACache;
24 import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
25 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayCache;
26 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
28 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
29
30 @Command(scope = "l2gw", name = "show-cache", description = "display l2gateways cache")
31 public class L2GwUtilsCacheCli extends OsgiCommandSupport {
32     private static final String L2GATEWAY_CACHE_NAME = "L2GW";
33     private static final String L2GATEWAY_CONN_CACHE_NAME = "L2GWCONN";
34
35     private static final String DEMARCATION = "=================================";
36
37     @Option(name = "-cache", aliases = {"--cache"}, description = "cache name",
38             required = false, multiValued = false)
39     String cacheName;
40
41     @Option(name = "-elan", aliases = {"--elan"}, description = "elan name",
42         required = false, multiValued = false)
43     String elanName;
44
45     private final L2GatewayCache l2GatewayCache;
46
47     public L2GwUtilsCacheCli(L2GatewayCache l2GatewayCache) {
48         this.l2GatewayCache = l2GatewayCache;
49     }
50
51     @Override
52     @Nullable
53     protected Object doExecute() throws IOException {
54         if (cacheName == null) {
55             session.getConsole().println("Available caches");
56             session.getConsole().println(L2GATEWAY_CONN_CACHE_NAME);
57             session.getConsole().println(L2GATEWAY_CACHE_NAME);
58             session.getConsole().println("HA");
59             session.getConsole().println("HA_EVENTS");
60             return null;
61         }
62         switch (cacheName) {
63             case L2GATEWAY_CONN_CACHE_NAME:
64                 dumpElanL2GwCache();
65                 break;
66             case L2GATEWAY_CACHE_NAME:
67                 dumpL2GwCache();
68                 break;
69             case "HA":
70                 dumpHACache(session.getConsole());
71                 break;
72             case "HA_EVENTS":
73                 dumpHACacheEvents();
74                 break;
75             default:
76                 break;
77         }
78         return null;
79     }
80
81     @SuppressFBWarnings("DM_DEFAULT_ENCODING")
82     private void dumpHACacheEvents() throws IOException {
83         try (FileOutputStream fileOutputStream = new FileOutputStream(new File("hwvtep.events.txt"))) {
84             session.getConsole().println("Dumping to file hwvtep.events.txt");
85             PrintStream fos = new PrintStream(fileOutputStream);
86             dumpHACache(fos);
87             fos.close();
88             session.getConsole().println("Dumped to file " + new File("hwvtep.events.txt").getAbsolutePath());
89         }
90     }
91
92     private void dumpHACache(PrintStream printStream) {
93
94         printStream.println("HA enabled nodes");
95         for (InstanceIdentifier<Node> id : HwvtepHACache.getInstance().getHAChildNodes()) {
96             String nodeId = id.firstKeyOf(Node.class).getNodeId().getValue();
97             printStream.println(nodeId);
98         }
99
100         printStream.println("HA parent nodes");
101         for (InstanceIdentifier<Node> id : HwvtepHACache.getInstance().getHAParentNodes()) {
102             String nodeId = id.firstKeyOf(Node.class).getNodeId().getValue();
103             printStream.println(nodeId);
104             for (InstanceIdentifier<Node> childId : HwvtepHACache.getInstance().getChildrenForHANode(id)) {
105                 nodeId = childId.firstKeyOf(Node.class).getNodeId().getValue();
106                 printStream.println("    " + nodeId);
107             }
108         }
109
110         printStream.println("Connected Nodes");
111         Map<String, Boolean> nodes = HwvtepHACache.getInstance().getConnectedNodes();
112         for (Entry<String, Boolean> entry : nodes.entrySet()) {
113             printStream.print(entry.getKey());
114             printStream.print("    : connected : ");
115             printStream.println(entry.getValue());
116         }
117     }
118
119     private void dumpL2GwCache() {
120         Collection<L2GatewayDevice> devices = l2GatewayCache.getAll();
121         if (devices.isEmpty()) {
122             session.getConsole().println("no devices are present in cache");
123             return;
124         }
125         for (L2GatewayDevice device : devices) {
126             session.getConsole().println("device " + device);
127         }
128     }
129
130     private void dumpElanL2GwCache() {
131         if (elanName == null) {
132             for (Entry<String, ConcurrentMap<String, L2GatewayDevice>> entry : ElanL2GwCacheUtils.getCaches()) {
133                 print(entry.getKey(), entry.getValue());
134                 session.getConsole().println(DEMARCATION);
135                 session.getConsole().println(DEMARCATION);
136             }
137         } else {
138             print(elanName, ElanL2GwCacheUtils.getInvolvedL2GwDevices(elanName));
139         }
140     }
141
142     private void print(String elan, ConcurrentMap<String, L2GatewayDevice> devices) {
143         session.getConsole().println("Elan name : " + elan);
144         session.getConsole().println("No of devices in elan " + devices.keySet().size());
145         for (L2GatewayDevice device : devices.values()) {
146             session.getConsole().println("device " + device);
147         }
148     }
149 }