BGPManager module sync up
[netvirt.git] / vpnservice / bgpmanager / bgpmanager-impl / src / main / java / org / opendaylight / netvirt / bgpmanager / BgpManager.java
1 /*
2  * Copyright (c) 2015 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
9 package org.opendaylight.netvirt.bgpmanager;
10
11 import java.lang.management.ManagementFactory;
12 import java.util.*;
13 import java.util.concurrent.CountDownLatch;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.TimeoutException;
16 import javax.management.*;
17
18 import com.google.common.base.*;
19 import com.google.common.base.Optional;
20 import org.apache.thrift.TException;
21 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
22 import org.opendaylight.netvirt.bgpmanager.api.RouteOrigin;
23 import org.opendaylight.netvirt.bgpmanager.commands.Commands;
24 import org.opendaylight.netvirt.bgpmanager.oam.*;
25 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
26 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
29 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
30 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
31 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
32 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
33 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpManager {
39
40     private static final Logger LOGGER = LoggerFactory.getLogger(BgpManager.class);
41     private BgpConfigurationManager bcm;
42     private FibDSWriter fibDSWriter;
43     //private IITMProvider        itmProvider;
44     private DataBroker dataBroker;
45     private BgpAlarmBroadcaster     qbgpAlarmProducer = null;
46     private MBeanServer qbgpAlarmServer = null;
47     private NotificationFilter  qbgpAlarmFilter = null;
48     final static int DEFAULT_STALEPATH_TIME = 210;
49     final static boolean DEFAULT_FBIT = true;
50
51     private long qBGPrestartTS = 0;
52
53     EntityOwnershipService entityOwnershipService;
54     public BgpCounters bgpCounters;
55     public Timer bgpCountersTimer;
56
57     @Override
58     public void onSessionInitiated(ProviderContext session) {
59         try {
60             dataBroker = session.getSALService(DataBroker.class);
61             fibDSWriter = new FibDSWriter(dataBroker);
62             BgpUtil.setBroker(dataBroker);
63             bcm = new BgpConfigurationManager(this);
64             bcm.setEntityOwnershipService(entityOwnershipService);
65             Commands commands = new Commands(this);
66             ConfigureBgpCli.setBgpManager(this);
67             LOGGER.info("BgpManager started");
68         } catch (Exception e) {
69             LOGGER.error("Failed to start BgpManager: "+e);
70         }
71
72         // Set up the Infra for Posting BGP Alarms as JMX notifications.
73         try {
74             qbgpAlarmProducer = new BgpAlarmBroadcaster();
75             MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
76             ObjectName alarmObj = new ObjectName("SDNC.FM:name=BgpAlarmObj");
77             mbs.registerMBean(qbgpAlarmProducer, alarmObj);
78         } catch (JMException e) {
79             LOGGER.error("Adding a NotificationBroadcaster failed." + e.toString());
80             e.printStackTrace();
81         }
82     }
83
84     public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
85         this.entityOwnershipService = entityOwnershipService;
86     }
87
88     @Override
89     public void close() throws Exception {
90         bcm.close();
91         LOGGER.info("BgpManager Closed");
92     }
93
94     /*public void setITMProvider(IITMProvider itmProvider) {
95         this.itmProvider = itmProvider;
96     }
97
98     public IITMProvider getItmProvider() { return this.itmProvider; } */
99
100     public Bgp getConfig() {
101         //TODO cleanup this cache code
102         try {
103             Optional<Bgp> optional = BgpUtil.read(dataBroker,
104                     LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Bgp.class));
105             return optional.get();
106         } catch (Exception e) {
107             LOGGER.error("failed to get bgp config",e);
108         }
109         return null;
110     }
111
112     public void configureGR(int stalepathTime) throws TException {
113         bcm.addGracefulRestart(stalepathTime);
114     }
115
116     public void delGracefulRestart() throws Exception {
117         bcm.delGracefulRestart();
118     }
119
120     public void addNeighbor(String ipAddress, long asNum) throws TException {
121         bcm.addNeighbor(ipAddress, (int) asNum);
122     }
123
124     public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
125         bcm.addEbgpMultihop(ipAddress, nhops);
126     }
127
128     public void addUpdateSource(String ipAddress, String srcIp) throws TException {
129         bcm.addUpdateSource(ipAddress, srcIp);
130     }
131
132     public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
133         bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
134     }
135
136     public void deleteNeighbor(String ipAddress) throws TException {
137         bcm.delNeighbor(ipAddress);
138     }
139
140     @Override
141     public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts) throws Exception {
142         bcm.addVrf(rd, new ArrayList<String>(importRts), new ArrayList<String>(exportRts));
143     }
144
145     @Override
146     public void deleteVrf(String rd) throws Exception {
147         fibDSWriter.removeVrfFromDS(rd);
148         bcm.delVrf(rd);
149     }
150
151     @Override
152     public void addPrefix(String rd, String prefix, List<String> nextHopList, int vpnLabel, RouteOrigin origin) throws Exception {
153         fibDSWriter.addFibEntryToDS(rd, prefix, nextHopList, vpnLabel, origin);
154         bcm.addPrefix(rd, prefix, nextHopList, vpnLabel);
155     }
156
157     @Override
158     public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel, RouteOrigin origin) throws Exception {
159         addPrefix(rd, prefix, Arrays.asList(nextHop), vpnLabel, origin);
160     }
161
162     @Override
163     public void deletePrefix(String rd, String prefix) throws Exception {
164         fibDSWriter.removeFibEntryFromDS(rd, prefix);
165         bcm.delPrefix(rd, prefix);
166     }
167
168     @Override
169     public void advertisePrefix(String rd, String prefix, List<String> nextHopList, int vpnLabel) throws Exception {
170         bcm.addPrefix(rd, prefix, nextHopList, vpnLabel);
171     }
172
173     @Override
174     public void advertisePrefix(String rd, String prefix, String nextHop, int vpnLabel) throws Exception {
175         LOGGER.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
176         bcm.addPrefix(rd, prefix, Arrays.asList(nextHop), vpnLabel);
177         LOGGER.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
178     }
179
180     @Override
181     public void withdrawPrefix(String rd, String prefix) throws Exception {
182         LOGGER.info("WITHDRAW: Removing Prefix rd {} prefix {}", rd, prefix);
183         bcm.delPrefix(rd, prefix);
184         LOGGER.info("WITHDRAW: Removed Prefix rd {} prefix {}", rd, prefix);
185     }
186
187     public void setQbgpLog(String fileName, String debugLevel) throws Exception {
188         bcm.addLogging(fileName, debugLevel);
189     }
190
191     public void delLogging() throws Exception {
192         bcm.delLogging();
193     }
194
195     public void startBgp(int asn, String routerId, int spt, boolean fbit) {
196         bcm.startBgp(asn, routerId, spt, fbit);
197     }
198
199     public void stopBgp() {
200         bcm.stopBgp();
201     }
202
203     public void startConfig(String host, int port) {
204         bcm.startConfig(host, port);
205     }
206
207     public void stopConfig() {
208         bcm.stopConfig();
209     }
210
211     @Override
212     public String getDCGwIP() {
213         Bgp conf = getConfig();
214         if (conf == null) {
215             return null;
216         }
217         List<Neighbors> nbrs = conf.getNeighbors();
218         if (nbrs == null) {
219             return null;
220         }
221         return nbrs.get(0).getAddress().getValue();
222     }
223
224     public MBeanServer getBgpAlarmServer() {
225         return qbgpAlarmServer;
226     }
227
228     public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
229         BgpAlarmErrorCodes errorSubCode;
230         if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
231             // CEASE Notifications alone have to be reported to the CBA.
232             // Silently return here. No need to log because tons
233             // of non-alarm notifications will be sent to the SDNc.
234             return;
235         }
236         errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
237         if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
238             // Need to report only those subcodes, defined in
239             // BgpAlarmErrorCodes enum class.
240             return;
241         }
242         String alarmString = "";
243         alarmString = "Alarm (" + code + "," + subcode + ") from neighbor " + pfx;
244         qbgpAlarmProducer.sendBgpAlarmInfo(pfx, code, subcode);
245     }
246
247     public Timer getBgpCountersTimer() {
248         return bgpCountersTimer;
249     }
250
251     public BgpCounters getBgpCounters() {
252         return bgpCounters;
253     }
254
255     public  void setBgpCountersTimer (Timer t) {
256         bgpCountersTimer = t;
257     }
258
259     public void startBgpCountersTask() {
260         if (getBgpCounters() == null) {
261
262             try {
263                 bgpCounters = new BgpCounters();
264                 setBgpCountersTimer(new Timer(true));
265                 getBgpCountersTimer().scheduleAtFixedRate(bgpCounters, 0, 120 * 1000);
266
267
268                 LOGGER.info("Bgp Counters task scheduled for every two minutes.");
269             } catch (Exception e) {
270                 System.out.println("Could not start the timertask for Bgp Counters.");
271                 e.printStackTrace();
272             }
273
274             try {
275                 setQbgpLog(BgpConstants.BGP_DEF_LOG_FILE, BgpConstants.BGP_DEF_LOG_LEVEL);
276             } catch (Exception e) {
277                 System.out.println("Could not set the default options for logging");
278             }
279         }
280     }
281
282     public void stopBgpCountersTask() {
283         Timer t = getBgpCountersTimer();
284         if (getBgpCounters() != null) {
285             t.cancel();
286             setBgpCountersTimer(null);
287             bgpCounters = null;
288         }
289     }
290
291     public FibDSWriter getFibWriter() {
292         return fibDSWriter;
293     }
294
295     public DataBroker getBroker() {
296         return dataBroker;
297     }
298
299     public String getConfigHost() {
300         return bcm.getConfigHost();
301     }
302
303     public int getConfigPort() {
304         return bcm.getConfigPort();
305     }
306
307     public void bgpRestarted() {
308         bcm.bgpRestarted();
309     }
310
311     public boolean isBgpConnected() {
312         return bcm.isBgpConnected();
313     }
314
315     public long getLastConnectedTS() {
316         return bcm.getLastConnectedTS();
317     }
318     public long getConnectTS() {
319         return bcm.getConnectTS();
320     }
321     public long getStartTS() {
322         return bcm.getStartTS();
323     }
324
325     public long getqBGPrestartTS() {
326         return qBGPrestartTS;
327     }
328
329     public void setqBGPrestartTS(long qBGPrestartTS) {
330         this.qBGPrestartTS = qBGPrestartTS;
331     }
332     public long getStaleStartTime() {
333         return bcm.getStaleStartTime();
334     }
335     public long getStaleEndTime() {
336         return bcm.getStaleEndTime();
337     }
338     public long getCfgReplayStartTime() {
339         return bcm.getCfgReplayStartTime();
340     }
341     public long getCfgReplayEndTime() {
342         return bcm.getCfgReplayEndTime();
343     }
344     public long getStaleCleanupTime() {
345         return bcm.getStaleCleanupTime();
346     }
347
348 }