/*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.bgpmanager;
+package org.opendaylight.bgpmanager;
-import java.net.SocketTimeoutException;
+import java.lang.management.ManagementFactory;
import java.util.*;
-import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CountDownLatch;
-
+import javax.management.*;
import org.apache.thrift.TException;
-import org.opendaylight.bgpmanager.thrift.client.globals.Route;
-import org.opendaylight.bgpmanager.thrift.client.implementation.BgpRouter;
-import org.opendaylight.bgpmanager.thrift.server.implementation.BgpThriftService;
-import org.opendaylight.bgpmanager.thrift.exceptions.BgpRouterException;
import org.opendaylight.bgpmanager.api.IBgpManager;
-import org.opendaylight.bgpmanager.globals.BgpConfiguration;
-import org.opendaylight.bgpmanager.globals.BgpConstants;
-
+import org.opendaylight.bgpmanager.commands.Commands;
+import org.opendaylight.bgpmanager.oam.*;
+import org.opendaylight.bgpmanager.thrift.gen.af_afi;
+import org.opendaylight.bgpmanager.thrift.gen.af_safi;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
-
+//import org.opendaylight.vpnservice.itm.api.IITMProvider;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpManager {
private static final Logger LOGGER = LoggerFactory.getLogger(BgpManager.class);
- private BgpConfigurationManager bgpConfigurationMgr;
+ private BgpConfigurationManager bcm;
private FibDSWriter fibDSWriter;
- private BgpConfiguration bgpConfiguration = new BgpConfiguration();
- private BgpRouter bgpThriftClient;
- private BgpThriftService bgpThriftService;
- private boolean isBgpInitialized = false;
- private boolean hasBgpServiceStarted = false;
- private String bgpHost;
- private int bgpPort;
-
-
- private String getCustomConfig(String var, String def) {
- Bundle b = FrameworkUtil.getBundle(this.getClass());
- BundleContext context = null;
- if (b != null) {
- context = b.getBundleContext();
- }
- if (context != null)
- return context.getProperty(var);
- else
- return def;
-
- }
+ //private IITMProvider itmProvider;
+ private DataBroker dataBroker;
+ private BgpAlarmBroadcaster qbgpAlarmProducer = null;
+ private MBeanServer qbgpAlarmServer = null;
+ private NotificationFilter qbgpAlarmFilter = null;
+ final static int DEFAULT_STALEPATH_TIME = 210;
+ final static boolean DEFAULT_FBIT = true;
- private void initializeBGPCommunication() {
- //start our side of thrift server
- bgpThriftService = new BgpThriftService(this, fibDSWriter);
- bgpThriftService.start();
+ public BgpCounters bgpCounters;
+ public Timer bgpCountersTimer;
- //start bgp thrift client connection
- bgpThriftClient = new BgpRouter();
-
- bgpHost = getCustomConfig(BgpConstants.BGP_SPEAKER_HOST_NAME, BgpConstants.DEFAULT_BGP_HOST_NAME);
- bgpPort = BgpConstants.DEFAULT_BGP_THRIFT_PORT;
-
- configureBgpServer(bgpHost, bgpPort);
+ @Override
+ public void onSessionInitiated(ProviderContext session) {
try {
- connectToServer(bgpHost, bgpPort);
+ dataBroker = session.getSALService(DataBroker.class);
+ fibDSWriter = new FibDSWriter(dataBroker);
+ BgpUtil.setBroker(dataBroker);
+ bcm = new BgpConfigurationManager(this);
+ Commands commands = new Commands(this);
+ ConfigureBgpCli.setBgpManager(this);
+ LOGGER.info("BgpManager started");
} catch (Exception e) {
- return;
+ LOGGER.error("Failed to start BgpManager: "+e);
}
- isBgpInitialized = true;
- //notify(); //notify all threads waiting for bgp init
-
- }
-
- public synchronized void waitForBgpInit() {
- if(!isBgpInitialized) {
- try {
- wait();
- } catch (InterruptedException e) {
- LOGGER.error("InterruptedException while waiting for Bgp connection to initialize");
- return;
- }
+ // Set up the Infra for Posting BGP Alarms as JMX notifications.
+ try {
+ qbgpAlarmProducer = new BgpAlarmBroadcaster();
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ ObjectName alarmObj = new ObjectName("SDNC.FM:name=BgpAlarmObj");
+ mbs.registerMBean(qbgpAlarmProducer, alarmObj);
+ } catch (JMException e) {
+ LOGGER.error("Adding a NotificationBroadcaster failed." + e.toString());
+ e.printStackTrace();
}
}
- public void startBgpService() throws TException {
- if(bgpThriftClient == null) {
- LOGGER.error("Start Bgp Service - bgpThriftClient is null. Unable to start BGP service.");
- return;
- }
+ @Override
+ public void close() throws Exception {
+ bcm.close();
+ LOGGER.info("BgpManager Closed");
+ }
- // Now try start bgp - if bgp is already Active, it will tell us, nothing to do then
- try {
- bgpThriftClient.startBgp((int)bgpConfiguration.getAsNum(), bgpConfiguration.getRouterId());
- LOGGER.debug("Started BGP with AS number " + (int)bgpConfiguration.getAsNum() + " and router id " + bgpConfiguration.getRouterId());
- } catch (BgpRouterException be) {
- if(be.getErrorCode() == BgpRouterException.BGP_ERR_ACTIVE) {
- LOGGER.info("bgp server already active");
- return;
- }
- else if(be.getErrorCode() == BgpRouterException.BGP_ERR_NOT_INITED) {
- LOGGER.error("bgp server connection not initialized.");
- reInitConn();
- return;
- }
- else {
- LOGGER.error("application error while starting bgp server " + be.getErrorCode());
- return;
- }
+ /*public void setITMProvider(IITMProvider itmProvider) {
+ this.itmProvider = itmProvider;
+ }
- } catch (TException t) {
- LOGGER.error("Could not set up thrift connection with bgp server");
- LOGGER.debug("Transport error while starting bgp server ", t);
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error("Error while starting bgp server");
- LOGGER.debug("Bgp Service not started due to exception", e);
- return;
- }
+ public IITMProvider getItmProvider() { return this.itmProvider; } */
- hasBgpServiceStarted = true;
+ public Bgp getConfig() {
+ return bcm.get();
+ }
+ public void configureGR(int stalepathTime) throws TException {
+ bcm.addGracefulRestart(stalepathTime);
}
- @Override
- public void onSessionInitiated(ProviderContext session) {
- LOGGER.info("BgpManager Session Initiated");
- try {
- final DataBroker dataBroker = session.getSALService(DataBroker.class);
- bgpConfigurationMgr = new BgpConfigurationManager(dataBroker, bgpConfiguration, this);
- fibDSWriter = new FibDSWriter(dataBroker);
- } catch (Exception e) {
- LOGGER.error("Error initializing services", e);
- }
+ public void delGracefulRestart() throws Exception {
+ bcm.delGracefulRestart();
+ }
- initializeBGPCommunication();
+ public void addNeighbor(String ipAddress, long asNum) throws TException {
+ bcm.addNeighbor(ipAddress, (int) asNum);
}
+ public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
+ bcm.addEbgpMultihop(ipAddress, nhops);
+ }
+
+ public void addUpdateSource(String ipAddress, String srcIp) throws TException {
+ bcm.addUpdateSource(ipAddress, srcIp);
+ }
- @Override
- public void close() throws Exception {
- LOGGER.info("BgpManager Closed");
+ public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
+ bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
+ }
- //close the client and server ends of the thrift communication
- if(bgpThriftClient != null)
- bgpThriftClient.disconnect();
- bgpThriftService.stop();
+ public void deleteNeighbor(String ipAddress) throws TException {
+ bcm.delNeighbor(ipAddress);
+ }
+ @Override
+ public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts) throws Exception {
+ bcm.addVrf(rd, new ArrayList<String>(importRts),
+ new ArrayList<String>(exportRts));
+ }
- }
+ @Override
+ public void deleteVrf(String rd) throws Exception {
+ bcm.delVrf(rd);
+ }
- private void setBgpServerDetails() {
- if(bgpThriftClient != null)
- bgpThriftClient.setBgpServer(bgpHost, bgpPort);
+ @Override
+ public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel) throws Exception {
+ fibDSWriter.addFibEntryToDS(rd, prefix, nextHop, vpnLabel);
+ bcm.addPrefix(rd, prefix, nextHop, vpnLabel);
}
- private void configureBgpServer(String bgpServer, int bgpPort) {
- bgpConfiguration.setBgpServer(bgpServer);
- bgpConfiguration.setBgpPort(bgpPort);
- setBgpServerDetails();
+ @Override
+ public void deletePrefix(String rd, String prefix) throws Exception {
+ fibDSWriter.removeFibEntryFromDS(rd, prefix);
+ bcm.delPrefix(rd, prefix);
}
- protected void addNeighbor(String ipAddress, long asNum) throws TException {
- if(bgpThriftClient == null) {
- LOGGER.error("Add BGP Neighbor - bgpThriftClient is null. Unable to add BGP Neighbor.");
- return;
- }
+ @Override
+ public void advertisePrefix(String rd, String prefix, String nextHop, int vpnLabel) throws Exception {
+ bcm.addPrefix(rd, prefix, nextHop, vpnLabel);
+ }
- try {
- bgpThriftClient.addNeighbor(ipAddress, (int) asNum);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to add BGP neighbor " + ipAddress + " due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- } catch (TException t) {
- LOGGER.error(String.format("Failed adding neighbor %s due to Transport error", ipAddress));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed adding neighbor %s", ipAddress));
- }
+ @Override
+ public void withdrawPrefix(String rd, String prefix) throws Exception {
+ bcm.delPrefix(rd, prefix);
}
+ public void setQbgpLog(String fileName, String debugLevel) throws Exception {
+ bcm.addLogging(fileName, debugLevel);
+ }
- protected void deleteNeighbor(String ipAddress) throws TException {
- if(bgpThriftClient == null) {
- LOGGER.error("Delete BGP Neighbor - bgpThriftClient is null. Unable to delete BGP Neighbor.");
- return;
- }
+ public void delLogging() throws Exception {
+ bcm.delLogging();
+ }
- try {
- bgpThriftClient.delNeighbor(ipAddress);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to delete BGP neighbor " + ipAddress + "due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- }catch (TException t) {
- LOGGER.error(String.format("Failed deleting neighbor %s due to Transport error", ipAddress));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed deleting neighbor %s", ipAddress));
- }
+ public void startBgp(int asn, String routerId, int spt, boolean fbit) {
+ bcm.startBgp(asn, routerId, spt, fbit);
}
+ public void stopBgp() {
+ bcm.stopBgp();
+ }
- @Override
- public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts) throws Exception {
- if(bgpThriftClient == null) {
- LOGGER.error("Add BGP vrf - bgpThriftClient is null. Unable to add BGP vrf.");
- return;
- }
- try {
- bgpThriftClient.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts));
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to add BGP vrf " + rd + "due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- throw b;
- } catch (TException t) {
- LOGGER.error(String.format("Failed adding vrf %s due to Transport error", rd));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed adding vrf %s", rd));
- throw e;
- }
+ public void startConfig(String host, int port) {
+ bcm.startConfig(host, port);
+ }
+
+ public void stopConfig() {
+ bcm.stopConfig();
}
@Override
- public void deleteVrf(String rd) throws Exception {
- if(bgpThriftClient == null || !hasBgpServiceStarted) {
- LOGGER.debug("Delete BGP vrf - Unable to delete BGP vrf in BGP Server. Removing Vrf from local DS");
- fibDSWriter.removeVrfFromDS(rd);
- return;
+ public String getDCGwIP() {
+ Bgp conf = getConfig();
+ if (conf == null) {
+ return null;
}
-
- try {
- bgpThriftClient.delVrf(rd);
- fibDSWriter.removeVrfFromDS(rd);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to delete BGP vrf " + rd + "due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- throw b;
- } catch (TException t) {
- LOGGER.error(String.format("Failed deleting vrf %s due to Transport error", rd));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed deleting vrf %s", rd));
- throw e;
+ List<Neighbors> nbrs = conf.getNeighbors();
+ if (nbrs == null) {
+ return null;
}
+ return nbrs.get(0).getAddress().getValue();
}
- @Override
- public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel) throws Exception {
+ public MBeanServer getBgpAlarmServer() {
+ return qbgpAlarmServer;
+ }
- if(bgpThriftClient == null || !hasBgpServiceStarted) {
- fibDSWriter.addFibEntryToDS(rd, prefix, nextHop, vpnLabel);
+ public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
+ BgpAlarmErrorCodes errorSubCode;
+ if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
+ // CEASE Notifications alone have to be reported to the CBA.
+ // Silently return here. No need to log because tons
+ // of non-alarm notifications will be sent to the SDNc.
return;
}
-
- try {
- bgpThriftClient.addPrefix(rd, prefix, nextHop, vpnLabel);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to add BGP prefix " + prefix + "due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- throw b;
- } catch (TException t) {
- LOGGER.error(String.format("Failed adding prefix entry <vrf:prefix:nexthop:vpnlabel> %s:%s:%s:%d due to Transport error",
- rd, prefix, nextHop, vpnLabel));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed adding prefix entry <vrf:prefix:nexthop:vpnlabel> %s:%s:%s:%d",
- rd, prefix, nextHop, vpnLabel));
- throw e;
+ errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
+ if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
+ // Need to report only those subcodes, defined in
+ // BgpAlarmErrorCodes enum class.
+ return;
}
+ String alarmString = "";
+ alarmString = "Alarm (" + code + "," + subcode + ") from neighbor " + pfx;
+ qbgpAlarmProducer.sendBgpAlarmInfo(pfx, code, subcode);
}
+ public Timer getBgpCountersTimer() {
+ return bgpCountersTimer;
+ }
- @Override
- public void deletePrefix(String rd, String prefix) throws Exception {
- if(bgpThriftClient == null || !hasBgpServiceStarted) {
- fibDSWriter.removeFibEntryFromDS(rd, prefix);
- return;
- }
+ public BgpCounters getBgpCounters() {
+ return bgpCounters;
+ }
- try {
- bgpThriftClient.delPrefix(rd, prefix);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to delete BGP prefix " + prefix + "due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- throw b;
- } catch (TException t) {
- LOGGER.error(String.format("Failed deleting prefix entry <vrf:prefix> %s:%s due to Transport error",
- rd, prefix));
- reInitConn();
- throw t;
- } catch (Exception e) {
- LOGGER.error(String.format("Failed deleting prefix entry <vrf:prefix> %s:%s",
- rd, prefix));
- throw e;
- }
+ public void setBgpCountersTimer (Timer t) {
+ bgpCountersTimer = t;
}
- private void connectToServer(String host, int port) throws Exception {
+ public void startBgpCountersTask() {
+ if (getBgpCounters() == null) {
- bgpHost = host;
- bgpPort = port;
+ try {
+ bgpCounters = new BgpCounters();
+ setBgpCountersTimer(new Timer(true));
+ getBgpCountersTimer().scheduleAtFixedRate(bgpCounters, 0, 120 * 1000);
- if(bgpThriftClient == null) {
- LOGGER.error("Failed to connect to BGP server since Bgp Thrift Client is not initialized yet.");
- return;
- }
- try {
- bgpThriftClient.connect(host, port);
- LOGGER.debug("Connected to BGP server {} on port {} ", host, port);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to connect to BGP server " + host + " on port " + port + " due to BgpRouter Exception number " + b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- throw b;
- } catch (TException t) {
- LOGGER.error("Failed to initialize BGP Connection due to Transport error ");
- throw t;
- }
- catch (Exception e) {
- LOGGER.error("Failed to initialize BGP Connection ");
- throw e;
+
+ LOGGER.info("Bgp Counters task scheduled for every two minutes.");
+ } catch (Exception e) {
+ System.out.println("Could not start the timertask for Bgp Counters.");
+ e.printStackTrace();
+ }
+
+ try {
+ setQbgpLog(BgpConstants.BGP_DEF_LOG_FILE, BgpConstants.BGP_DEF_LOG_LEVEL);
+ } catch (Exception e) {
+ System.out.println("Could not set the default options for logging");
+ }
}
}
- public void configureBgp(long asNum, String routerId) {
- try {
- bgpConfiguration.setAsNum(asNum);
- bgpConfiguration.setRouterId(routerId);
- } catch(Exception e) {
- LOGGER.error("failed configuring bgp ",e);
+ public void stopBgpCountersTask() {
+ Timer t = getBgpCountersTimer();
+ if (getBgpCounters() != null) {
+ t.cancel();
+ setBgpCountersTimer(null);
+ bgpCounters = null;
}
}
- public synchronized void reInitConn() {
+ public FibDSWriter getFibWriter() {
+ return fibDSWriter;
+ }
- try {
- bgpThriftClient.reInit();
- LOGGER.debug("Reinitialized connection to BGP Server {}", bgpHost);
- } catch (BgpRouterException b) {
- LOGGER.error("Failed to reinitialize connection to BGP server {} on port {} due to BgpRouter Exception number {}", bgpHost, bgpPort, b.getErrorCode());
- LOGGER.debug("BgpRouterException trace ", b);
- } catch (TException t) {
- LOGGER.error("Failed to reinitialize BGP Connection due to Transport error.");
- }
- catch (Exception e) {
- LOGGER.error("Failed to reinitialize BGP Connection.", e);
- }
- }
+ public DataBroker getBroker() {
+ return dataBroker;
+ }
- public void disconnect() {
- bgpThriftClient.disconnect();
+ public String getConfigHost() {
+ return bcm.getConfigHost();
}
+ public int getConfigPort() {
+ return bcm.getConfigPort();
+ }
+ public void bgpRestarted() {
+ bcm.bgpRestarted();
+ }
}