X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgpmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fbgpmanager%2FBgpConfigurationManager.java;h=926fe55528b3a26e56885cebdb19246c5d049a0d;hb=ade415d93537e044ba7a13338f416b65d3c72f65;hp=a1cc34fd88a3a64a6bf35da9e938c1c12c83db04;hpb=a40d33532409acae8373ae215b4eb70f6786688a;p=netvirt.git diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java index a1cc34fd88..926fe55528 100755 --- a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java +++ b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java @@ -13,6 +13,8 @@ import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_THRES import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.net.InetAddresses; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ThreadFactoryBuilder; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.netty.util.concurrent.GlobalEventExecutor; @@ -42,6 +44,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import javax.annotation.PreDestroy; @@ -58,6 +61,7 @@ import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker; +import org.opendaylight.genius.mdsalutil.MDSALUtil; import org.opendaylight.genius.mdsalutil.NwConstants; import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils; import org.opendaylight.infrautils.metrics.MetricProvider; @@ -91,8 +95,13 @@ import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebfd.rev1902 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily; 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.BgpControlPlaneType; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.EbgpService; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.EncapType; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.InitiateEorInput; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.InitiateEorOutput; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.InitiateEorOutputBuilder; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.TcpMd5SignaturePasswordType; +//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.AsId; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.AsIdBuilder; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.ConfigServer; @@ -102,33 +111,38 @@ import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev1509 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.GracefulRestartBuilder; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Logging; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.LoggingBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Multipath; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.MultipathBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.MultipathKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NeighborsBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NeighborsKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Networks; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfMaxpath; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfMaxpathBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfMaxpathKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Vrfs; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfsBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfsKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.MultipathContainer; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NeighborsContainer; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksContainer; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfMaxpathContainer; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfsContainer; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.dcgw.tep.list.DcgwTep; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.dcgw.tep.list.DcgwTepBuilder; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.dcgw.tep.list.DcgwTepKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamilies; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamiliesBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamiliesKey; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.EbgpMultihop; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.EbgpMultihopBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.UpdateSource; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.UpdateSourceBuilder; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfs.AddressFamiliesVrf; -import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfs.AddressFamiliesVrfBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.multipathcontainer.Multipath; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.multipathcontainer.MultipathBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.multipathcontainer.MultipathKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.Neighbors; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.NeighborsBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.NeighborsKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.AddressFamilies; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.AddressFamiliesBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.AddressFamiliesKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.EbgpMultihop; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.EbgpMultihopBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.UpdateSource; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighborscontainer.neighbors.UpdateSourceBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.Networks; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.NetworksBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.networkscontainer.NetworksKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfmaxpathcontainer.VrfMaxpath; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfmaxpathcontainer.VrfMaxpathBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfmaxpathcontainer.VrfMaxpathKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfscontainer.Vrfs; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfscontainer.VrfsBuilder; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfscontainer.VrfsKey; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfscontainer.vrfs.AddressFamiliesVrf; +import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.vrfscontainer.vrfs.AddressFamiliesVrfBuilder; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.tcp.security.option.grouping.TcpSecurityOption; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.tcp.security.option.grouping.tcp.security.option.TcpMd5SignatureOption; import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.tcp.security.option.grouping.tcp.security.option.TcpMd5SignatureOptionBuilder; @@ -143,6 +157,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.common.Uint32; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; @@ -150,7 +167,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class BgpConfigurationManager { +public class BgpConfigurationManager implements EbgpService { private static final Logger LOG = LoggerFactory.getLogger(BgpConfigurationManager.class); // to have stale FIB map (RD, Prefix) @@ -184,6 +201,7 @@ public class BgpConfigurationManager { private static final String UPD_WARN = "Update operation not supported; Config store updated;" + " restore with another Update if needed."; private static long bgp_as_num = 0; + private static List nbrList = new ArrayList<>(); private int bgpKaTime = 0; private int bgpHoldTime = 0; private int bgpGrRestartTime = 0; @@ -234,7 +252,7 @@ public class BgpConfigurationManager { private int totalExternalMacRoutes; private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor( - new ThreadFactoryBuilder().setNameFormat("BgpConfigurationManager-%d").setDaemon(true).build()); + new ThreadFactoryBuilder().setNameFormat("bgp-config-%d").setDaemon(true).build()); /** * this map store the new address families to send to quagga. When it is sended you must clear it. @@ -248,6 +266,9 @@ public class BgpConfigurationManager { // map>> private final Map>> rt2TepMap = new ConcurrentHashMap<>(); + //map + private final Map fibMap = new HashMap<>(); + private final List listeners = new ArrayList<>(); private final EntityOwnershipUtils entityOwnershipUtils; @@ -256,6 +277,8 @@ public class BgpConfigurationManager { private final MetricProvider metricProvider; private final TransactionHistory bgpUpdatesHistory; + private volatile AtomicBoolean eorSupressedDuetoUpgradeFlag = new AtomicBoolean(false); + @Inject public BgpConfigurationManager(final DataBroker dataBroker, final EntityOwnershipService entityOwnershipService, @@ -473,6 +496,8 @@ public class BgpConfigurationManager { //disconnect the CONFIG SERVER port (which was )opened during I was Owner bgpRouter.disconnect(); } + stopBgpCountersTask(); + stopBgpAlarmsTask(); } }); } @@ -653,7 +678,8 @@ public class BgpConfigurationManager { } LOG.debug("Removing external routes from FIB"); deleteExternalFibRoutes(); - List nbrs = conf.getNeighbors(); + List nbrs = conf.getNeighborsContainer() == null ? null + : conf.getNeighborsContainer().getNeighbors(); if (nbrs != null && nbrs.size() > 0) { LOG.error("Tring to remove the as-id when neighbor config is already present"); for (Neighbors nbr : nbrs) { @@ -855,12 +881,21 @@ public class BgpConfigurationManager { @Override protected void add(InstanceIdentifier iid, Neighbors val) { + if (nbrList != null && !nbrList.contains(val)) { + LOG.trace("Adding nbr {} to nbrlist", val.getAddress().getValue()); + nbrList.add(val); + } if (!isBGPEntityOwner()) { return; } LOG.debug("received add Neighbors config val {}", val.getAddress().getValue()); synchronized (BgpConfigurationManager.this) { String peerIp = val.getAddress().getValue(); + String sourceIp = (val.getUpdateSource() == null) ? null : + val.getUpdateSource().getSourceIp().getValue(); + int nhops = (val.getEbgpMultihop() == null) ? 0 : + val.getEbgpMultihop().getNhops().intValue(); + List afs = val.getAddressFamilies(); long as = val.getRemoteAs().toJava(); final String md5Secret = extractMd5Secret(val); BgpRouter br = getClient(YANG_OBJ); @@ -872,6 +907,19 @@ public class BgpConfigurationManager { try { //itmProvider.buildTunnelsToDCGW(new IpAddress(peerIp.toCharArray())); br.addNeighbor(peerIp, as, md5Secret); + if (nhops != 0) { + br.addEbgpMultihop(peerIp, nhops); + } + if (sourceIp != null) { + br.addUpdateSource(peerIp, sourceIp); + } + if (afs != null) { + for (AddressFamilies af : afs) { + af_afi afi = af_afi.findByValue(af.getAfi().intValue()); + af_safi safi = af_safi.findByValue(af.getSafi().intValue()); + br.addAddressFamily(af.getPeerIp().getValue(), afi, safi); + } + } } catch (TException | BgpRouterException e) { LOG.error("{} Add received exception; {}", YANG_OBJ, ADD_WARN, e); @@ -886,11 +934,15 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Neighbors.class); + return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class); } @Override protected void remove(InstanceIdentifier iid, Neighbors val) { + if (nbrList != null && nbrList.contains(val)) { + LOG.trace("Removing nbr {} from nbr list", val.getAddress().getValue()); + nbrList.remove(val); + } if (!isBGPEntityOwner()) { return; } @@ -973,7 +1025,8 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Neighbors.class).child(EbgpMultihop.class); + return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) + .child(EbgpMultihop.class); } @Override @@ -1047,7 +1100,8 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Neighbors.class).child(UpdateSource.class); + return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) + .child(UpdateSource.class); } @Override @@ -1123,7 +1177,8 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Neighbors.class).child(AddressFamilies.class); + return InstanceIdentifier.create(Bgp.class).child(NeighborsContainer.class).child(Neighbors.class) + .child(AddressFamilies.class); } @Override @@ -1217,7 +1272,7 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Networks.class); + return InstanceIdentifier.create(Bgp.class).child(NetworksContainer.class).child(Networks.class); } @Override @@ -1356,7 +1411,7 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Vrfs.class); + return InstanceIdentifier.create(Bgp.class).child(VrfsContainer.class).child(Vrfs.class); } @Override @@ -1536,7 +1591,7 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(Multipath.class); + return InstanceIdentifier.create(Bgp.class).child(MultipathContainer.class).child(Multipath.class); } @Override @@ -1614,7 +1669,7 @@ public class BgpConfigurationManager { @Override protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Bgp.class).child(VrfMaxpath.class); + return InstanceIdentifier.create(Bgp.class).child(VrfMaxpathContainer.class).child(VrfMaxpath.class); } class VrfMaxPathConfigurator implements Runnable { @@ -1798,7 +1853,13 @@ public class BgpConfigurationManager { public long getStalePathtime(int defValue, AsId asId) { long spt = 0; try { - spt = getConfig().getGracefulRestart().getStalepathTime().toJava(); + InstanceIdentifier id = + InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class); + Optional gracefulRestartOptional = MDSALUtil.read(dataBroker, + LogicalDatastoreType.CONFIGURATION, id); + if (gracefulRestartOptional.isPresent()) { + spt = gracefulRestartOptional.get().getStalepathTime().toJava(); + } } catch (NullPointerException e) { try { spt = asId.getStalepathTime().toJava(); @@ -1893,16 +1954,17 @@ public class BgpConfigurationManager { } private void doRouteSync() { - LOG.error("Starting BGP route sync"); - try { - bgpRouter.initRibSync(bgpSyncHandle); - } catch (BgpRouterException e) { - LOG.error("Route sync aborted, exception when initializing", e); - return; - } - while (bgpSyncHandle.getState() != BgpSyncHandle.DONE) { - for (af_afi afi : af_afi.values()) { + for (af_afi afi : af_afi.values()) { + try { + bgpRouter.initRibSync(bgpSyncHandle); + } catch (BgpRouterException e) { + LOG.error("Route sync aborted, exception when initializing", e); + return; + } + LOG.error("Starting BGP route sync for afi {}", afi.getValue()); + while (bgpSyncHandle.getState() != BgpSyncHandle.DONE) { Routes routes = null; + int noUpdates = 0; try { routes = bgpRouter.doRibSync(bgpSyncHandle, afi); } catch (TException | BgpRouterException e) { @@ -1911,6 +1973,7 @@ public class BgpConfigurationManager { } Iterator updates = routes.getUpdatesIterator(); while (updates.hasNext()) { + noUpdates++; Update update = updates.next(); String rd = update.getRd(); String nexthop = update.getNexthop(); @@ -1938,13 +2001,14 @@ public class BgpConfigurationManager { update.getRoutermac(), afi); } + LOG.error("No of updates for afi {} is {}", afi.getValue(), noUpdates); } } try { LOG.error("Ending BGP route-sync"); bgpRouter.endRibSync(bgpSyncHandle); } catch (BgpRouterException e) { - // Ignored? + LOG.error("Route sync aborted, exception when ending", e); } } @@ -2396,7 +2460,8 @@ public class BgpConfigurationManager { } } - List neighbors = config.getNeighbors(); + List neighbors = config.getNeighborsContainer() == null ? null + : config.getNeighborsContainer().getNeighbors(); if (neighbors != null) { LOG.error("configuring existing Neighbors present for replay total neighbors {}", neighbors.size()); boolean neighborConfigReplayResult = replayNbrConfig(neighbors, br); @@ -2424,7 +2489,8 @@ public class BgpConfigurationManager { } catch (Exception e) { LOG.error("Replay:addGr() received exception: ", e); } - List vrfs = config.getVrfs(); + List vrfs = config.getVrfsContainer() == null ? null + : config.getVrfsContainer().getVrfs(); if (vrfs == null) { vrfs = new ArrayList<>(); } @@ -2439,7 +2505,9 @@ public class BgpConfigurationManager { } } - List ln = config.getNetworks(); + + List ln = config.getNetworksContainer() == null ? null + : config.getNetworksContainer().getNetworks(); if (ln != null) { for (Networks net : ln) { String rd = net.getRd(); @@ -2472,7 +2540,8 @@ public class BgpConfigurationManager { } - List multipaths = config.getMultipath(); + List multipaths = config.getMultipathContainer() == null ? null + : config.getMultipathContainer().getMultipath(); if (multipaths != null) { for (Multipath multipath : multipaths) { @@ -2492,7 +2561,8 @@ public class BgpConfigurationManager { } } } - List vrfMaxpaths = config.getVrfMaxpath(); + List vrfMaxpaths = config.getVrfMaxpathContainer() == null ? null + : config.getVrfMaxpathContainer().getVrfMaxpath(); if (vrfMaxpaths != null) { for (VrfMaxpath vrfMaxpath : vrfMaxpaths) { try { @@ -2607,7 +2677,7 @@ public class BgpConfigurationManager { String nbrIp, long remoteAs, @Nullable final TcpMd5SignaturePasswordType md5Secret) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)); InstanceIdentifier iid = iib.build(); TcpSecurityOption tcpSecOption = null; @@ -2623,7 +2693,7 @@ public class BgpConfigurationManager { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); Ipv4Address srcAddr = new Ipv4Address(srcIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(UpdateSource.class); InstanceIdentifier iid = iib.build(); @@ -2635,7 +2705,7 @@ public class BgpConfigurationManager { public void addEbgpMultihop(String nbrIp, int hops) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(EbgpMultihop.class); InstanceIdentifier iid = iib.build(); @@ -2647,7 +2717,7 @@ public class BgpConfigurationManager { public void addAddressFamily(String nbrIp, int afi, int safi) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(AddressFamilies.class, new AddressFamiliesKey((long) afi, (long) safi)); InstanceIdentifier iid = iib.build(); @@ -2662,6 +2732,7 @@ public class BgpConfigurationManager { Ipv4Address nexthop = nh != null ? new Ipv4Address(nh) : null; Uint32 label = lbl; InstanceIdentifier iid = InstanceIdentifier.builder(Bgp.class) + .child(NetworksContainer.class) .child(Networks.class, new NetworksKey(pfx, rd)).build(); NetworksBuilder networksBuilder = new NetworksBuilder().setRd(rd).setPrefixLen(pfx).setNexthop(nexthop) .setLabel(label).setEthtag(BgpConstants.DEFAULT_ETH_TAG); @@ -2702,6 +2773,7 @@ public class BgpConfigurationManager { AddressFamiliesVrf adf = adfBuilder.build(); adfList.add(adf); InstanceIdentifier.InstanceIdentifierBuilder iib = InstanceIdentifier.builder(Bgp.class) + .child(VrfsContainer.class) .child(Vrfs.class, new VrfsKey(rd)); InstanceIdentifier iid = iib.build(); Vrfs dto = new VrfsBuilder().setRd(rd).setImportRts(irts) @@ -2801,7 +2873,7 @@ public class BgpConfigurationManager { public void delNeighbor(String nbrIp) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)); InstanceIdentifier iid = iib.build(); delete(iid); @@ -2810,7 +2882,7 @@ public class BgpConfigurationManager { public void delUpdateSource(String nbrIp) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(UpdateSource.class); InstanceIdentifier iid = iib.build(); @@ -2820,7 +2892,7 @@ public class BgpConfigurationManager { public void delEbgpMultihop(String nbrIp) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(EbgpMultihop.class); InstanceIdentifier iid = iib.build(); @@ -2830,7 +2902,7 @@ public class BgpConfigurationManager { public void delAddressFamily(String nbrIp, int afi, int safi) { Ipv4Address nbrAddr = new Ipv4Address(nbrIp); InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class) .child(Neighbors.class, new NeighborsKey(nbrAddr)) .child(AddressFamilies.class, new AddressFamiliesKey((long) afi, (long) safi)); InstanceIdentifier iid = iib.build(); @@ -2839,7 +2911,7 @@ public class BgpConfigurationManager { public void delPrefix(String rd, String pfx) { InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(NetworksContainer.class) .child(Networks.class, new NetworksKey(pfx, rd)); InstanceIdentifier iid = iib.build(); delete(iid); @@ -2872,15 +2944,17 @@ public class BgpConfigurationManager { } InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(VrfsContainer.class) .child(Vrfs.class, new VrfsKey(rd)); InstanceIdentifier iid = iib.build(); @SuppressWarnings("static-access") InstanceIdentifier iid6 = iid.builder(Bgp.class).build() + .child(MultipathContainer.class) .child(Multipath.class, new MultipathKey(adfBuilder.getAfi(), adfBuilder.getSafi())).create(Bgp.class); - InstanceIdentifierBuilder iib3 = iid6.child(Vrfs.class, new VrfsKey(rd)).builder(); + InstanceIdentifierBuilder iib3 = + iid6.child(VrfsContainer.class).child(Vrfs.class, new VrfsKey(rd)).builder(); InstanceIdentifier iidFinal = iib3.build(); //** update or delete the vrfs with the rest of AddressFamilies already present in the last list @@ -2918,7 +2992,7 @@ public class BgpConfigurationManager { InstanceIdentifier.InstanceIdentifierBuilder iib = InstanceIdentifier - .builder(Bgp.class) + .builder(Bgp.class).child(MultipathContainer.class) .child(Multipath.class, new MultipathKey(Long.valueOf(afi.getValue()), Long.valueOf(safi.getValue()))); @@ -2929,7 +3003,7 @@ public class BgpConfigurationManager { public void setMultipaths(String rd, int maxpath) { InstanceIdentifier.InstanceIdentifierBuilder iib = InstanceIdentifier - .builder(Bgp.class) + .builder(Bgp.class).child(VrfMaxpathContainer.class) .child(VrfMaxpath.class, new VrfMaxpathKey(rd)); VrfMaxpath dto = new VrfMaxpathBuilder().setRd(rd).setMaxpaths(maxpath).build(); @@ -2938,7 +3012,7 @@ public class BgpConfigurationManager { public void delMultipaths(String rd) { InstanceIdentifier.InstanceIdentifierBuilder iib = - InstanceIdentifier.builder(Bgp.class) + InstanceIdentifier.builder(Bgp.class).child(VrfMaxpathContainer.class) .child(VrfMaxpath.class, new VrfMaxpathKey(rd)); InstanceIdentifier iid = iib.build(); delete(iid); @@ -2992,6 +3066,7 @@ public class BgpConfigurationManager { totalStaledCount = 0; try { staledFibEntriesMap.clear(); + fibDSWriter.clearFibMap(); InstanceIdentifier id = InstanceIdentifier.create(FibEntries.class); Optional fibEntries = SingleTransactionDataBroker.syncReadOptional(dataBroker, @@ -3012,9 +3087,15 @@ public class BgpConfigurationManager { //Create MAP from staleVrfTables. vrfEntry.getRoutePaths() .forEach( - routePath -> staleFibEntMap.put( - appendNextHopToPrefix(vrfEntry.getDestPrefix(), - routePath.getNexthopAddress()), routePath.getLabel())); + routePath -> { + staleFibEntMap.put( + appendNextHopToPrefix(vrfEntry.getDestPrefix(), + routePath.getNexthopAddress()), routePath.getLabel()); + fibDSWriter.addEntryToFibMap( + vrfTable.getRouteDistinguisher(), vrfEntry.getDestPrefix(), + routePath.getNexthopAddress()); + + }); } staledFibEntriesMap.put(vrfTable.getRouteDistinguisher(), staleFibEntMap); } @@ -3160,6 +3241,10 @@ public class BgpConfigurationManager { return totalCleared; } + public static List getNbrList() { + return nbrList; + } + public BgpCounters getBgpCounters() { return bgpCountersReference.get(); } @@ -3242,4 +3327,67 @@ public class BgpConfigurationManager { } return md5Secret; } // private method extractMd5Secret + + @SuppressWarnings("checkstyle:IllegalCatch") + @Override + public ListenableFuture> initiateEor(InitiateEorInput input) { + boolean returnError = false; + String msg = null; + String neighborIp = null; + if (!isBGPEntityOwner()) { + msg = String.format("RPC triggered in Non-EoS Owner"); + return Futures.immediateFuture( + RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, + msg).build()); + } + if (input == null) { + msg = String.format("BGP invalid input for EoR"); + LOG.error("Error : {}", msg); + returnError = true; + } else { + neighborIp = input.getNeighborIp(); + } + if (eorSupressedDuetoUpgradeFlag.get() == false) { + msg = String.format("EoR triggerd by RBU-RPC call before replay" + + "of BGP configuration (or) BGP not restarted"); + LOG.error("Error : {}", msg); + } + if ("ALL".compareToIgnoreCase(neighborIp) == 0) { + //send EoR for all the neighbor + LOG.error("EoR trigger received to ALL neighbors"); + final int numberOfEORRetries = 3; + RetryOnException eorRetry = new RetryOnException(numberOfEORRetries); + do { + try { + BgpRouter br = bgpRouter; + br.sendEOR(); + LOG.debug("RPC: sendEOR {} successful", br); + break; + } catch (Exception e) { + eorRetry.errorOccured(); + LOG.error("Replay:sedEOR() received exception:", e); + } + } while (eorRetry.shouldRetry()); + eorSupressedDuetoUpgradeFlag.set(false); + } else if (InetAddresses.isInetAddress(neighborIp)) { + //send EoR for only one neighbor + msg = String.format("Inidividual neighbors EoR is not supported"); + LOG.warn("Error : {}", msg); + returnError = true; + } else { + //error + msg = String.format("RPC: initiateEor: Invalid input "); + LOG.warn("Error : {}", msg); + returnError = true; + } + if (returnError) { + return Futures.immediateFuture( + RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, + msg).build()); + } + InitiateEorOutput initiateEorOutput = + new InitiateEorOutputBuilder().setRetVal(0L).build(); + return Futures.immediateFuture(RpcResultBuilder.success() + .withResult(initiateEorOutput).build()); + } }