X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgpmanager%2Fbgpmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fbgpmanager%2FBgpManager.java;h=6e9a1a5b2eee44a0f4c491dbcb73989533c6f520;hb=c1736b3363a0c2824fd994fd2a0098f6f03ddab0;hp=d8e387eaf58e52478b4e2d215045a37b2bf8bcf3;hpb=743924cc48deb9dc595b93f999335411d78a96f1;p=vpnservice.git diff --git a/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpManager.java b/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpManager.java index d8e387ea..6e9a1a5b 100644 --- a/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpManager.java +++ b/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/bgpmanager/BgpManager.java @@ -1,32 +1,29 @@ /* - * 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; @@ -36,334 +33,243 @@ import org.slf4j.LoggerFactory; 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 importRts, Collection exportRts) throws Exception { + bcm.addVrf(rd, new ArrayList(importRts), + new ArrayList(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 importRts, Collection 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) { - LOGGER.info("Delete BGP vrf - bgpThriftClient is null. Unable to delete BGP vrf."); - return; + public String getDCGwIP() { + Bgp conf = getConfig(); + if (conf == null) { + return null; } - try { - bgpThriftClient.delVrf(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 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 %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 %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 %s:%s due to Transport error", - rd, prefix)); - reInitConn(); - throw t; - } catch (Exception e) { - LOGGER.error(String.format("Failed deleting prefix entry %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(); + } }