2 * Copyright (c) 2015 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
9 package org.opendaylight.netvirt.bgpmanager;
11 import java.lang.management.ManagementFactory;
13 import java.util.concurrent.CountDownLatch;
14 import java.util.concurrent.ExecutionException;
15 import java.util.concurrent.TimeoutException;
16 import javax.management.*;
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;
38 public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpManager {
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;
51 private long qBGPrestartTS = 0;
53 EntityOwnershipService entityOwnershipService;
54 public BgpCounters bgpCounters;
55 public Timer bgpCountersTimer;
58 public void onSessionInitiated(ProviderContext session) {
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);
72 // Set up the Infra for Posting BGP Alarms as JMX notifications.
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());
84 public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
85 this.entityOwnershipService = entityOwnershipService;
89 public void close() throws Exception {
91 LOGGER.info("BgpManager Closed");
94 /*public void setITMProvider(IITMProvider itmProvider) {
95 this.itmProvider = itmProvider;
98 public IITMProvider getItmProvider() { return this.itmProvider; } */
100 public Bgp getConfig() {
101 //TODO cleanup this cache code
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);
112 public void configureGR(int stalepathTime) throws TException {
113 bcm.addGracefulRestart(stalepathTime);
116 public void delGracefulRestart() throws Exception {
117 bcm.delGracefulRestart();
120 public void addNeighbor(String ipAddress, long asNum) throws TException {
121 bcm.addNeighbor(ipAddress, (int) asNum);
124 public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
125 bcm.addEbgpMultihop(ipAddress, nhops);
128 public void addUpdateSource(String ipAddress, String srcIp) throws TException {
129 bcm.addUpdateSource(ipAddress, srcIp);
132 public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
133 bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
136 public void deleteNeighbor(String ipAddress) throws TException {
137 bcm.delNeighbor(ipAddress);
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));
146 public void deleteVrf(String rd) throws Exception {
147 fibDSWriter.removeVrfFromDS(rd);
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);
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);
163 public void deletePrefix(String rd, String prefix) throws Exception {
164 fibDSWriter.removeFibEntryFromDS(rd, prefix);
165 bcm.delPrefix(rd, prefix);
169 public void advertisePrefix(String rd, String prefix, List<String> nextHopList, int vpnLabel) throws Exception {
170 bcm.addPrefix(rd, prefix, nextHopList, vpnLabel);
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);
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);
187 public void setQbgpLog(String fileName, String debugLevel) throws Exception {
188 bcm.addLogging(fileName, debugLevel);
191 public void delLogging() throws Exception {
195 public void startBgp(int asn, String routerId, int spt, boolean fbit) {
196 bcm.startBgp(asn, routerId, spt, fbit);
199 public void stopBgp() {
203 public void startConfig(String host, int port) {
204 bcm.startConfig(host, port);
207 public void stopConfig() {
212 public String getDCGwIP() {
213 Bgp conf = getConfig();
217 List<Neighbors> nbrs = conf.getNeighbors();
221 return nbrs.get(0).getAddress().getValue();
224 public MBeanServer getBgpAlarmServer() {
225 return qbgpAlarmServer;
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.
236 errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
237 if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
238 // Need to report only those subcodes, defined in
239 // BgpAlarmErrorCodes enum class.
242 String alarmString = "";
243 alarmString = "Alarm (" + code + "," + subcode + ") from neighbor " + pfx;
244 qbgpAlarmProducer.sendBgpAlarmInfo(pfx, code, subcode);
247 public Timer getBgpCountersTimer() {
248 return bgpCountersTimer;
251 public BgpCounters getBgpCounters() {
255 public void setBgpCountersTimer (Timer t) {
256 bgpCountersTimer = t;
259 public void startBgpCountersTask() {
260 if (getBgpCounters() == null) {
263 bgpCounters = new BgpCounters();
264 setBgpCountersTimer(new Timer(true));
265 getBgpCountersTimer().scheduleAtFixedRate(bgpCounters, 0, 120 * 1000);
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.");
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");
282 public void stopBgpCountersTask() {
283 Timer t = getBgpCountersTimer();
284 if (getBgpCounters() != null) {
286 setBgpCountersTimer(null);
291 public FibDSWriter getFibWriter() {
295 public DataBroker getBroker() {
299 public String getConfigHost() {
300 return bcm.getConfigHost();
303 public int getConfigPort() {
304 return bcm.getConfigPort();
307 public void bgpRestarted() {
311 public boolean isBgpConnected() {
312 return bcm.isBgpConnected();
315 public long getLastConnectedTS() {
316 return bcm.getLastConnectedTS();
318 public long getConnectTS() {
319 return bcm.getConnectTS();
321 public long getStartTS() {
322 return bcm.getStartTS();
325 public long getqBGPrestartTS() {
326 return qBGPrestartTS;
329 public void setqBGPrestartTS(long qBGPrestartTS) {
330 this.qBGPrestartTS = qBGPrestartTS;
332 public long getStaleStartTime() {
333 return bcm.getStaleStartTime();
335 public long getStaleEndTime() {
336 return bcm.getStaleEndTime();
338 public long getCfgReplayStartTime() {
339 return bcm.getCfgReplayStartTime();
341 public long getCfgReplayEndTime() {
342 return bcm.getCfgReplayEndTime();
344 public long getStaleCleanupTime() {
345 return bcm.getStaleCleanupTime();