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;
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;
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;
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;
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;
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;
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)
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<Neighbors> nbrList = new ArrayList<>();
private int bgpKaTime = 0;
private int bgpHoldTime = 0;
private int bgpGrRestartTime = 0;
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.
// map<rd, map<tep-ip, map<mac, l2vni>>>
private final Map<String, Map<String, Map<String, Uint32>>> rt2TepMap = new ConcurrentHashMap<>();
+ //map<rd+prefix/plen, list (nexthop)>
+ private final Map<String,List> fibMap = new HashMap<>();
+
private final List<AutoCloseable> listeners = new ArrayList<>();
private final EntityOwnershipUtils entityOwnershipUtils;
private final MetricProvider metricProvider;
private final TransactionHistory bgpUpdatesHistory;
+ private volatile AtomicBoolean eorSupressedDuetoUpgradeFlag = new AtomicBoolean(false);
+
@Inject
public BgpConfigurationManager(final DataBroker dataBroker,
final EntityOwnershipService entityOwnershipService,
//disconnect the CONFIG SERVER port (which was )opened during I was Owner
bgpRouter.disconnect();
}
+ stopBgpCountersTask();
+ stopBgpAlarmsTask();
}
});
}
}
LOG.debug("Removing external routes from FIB");
deleteExternalFibRoutes();
- List<Neighbors> nbrs = conf.getNeighbors();
+ List<Neighbors> 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) {
@Override
protected void add(InstanceIdentifier<Neighbors> 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<AddressFamilies> afs = val.getAddressFamilies();
long as = val.getRemoteAs().toJava();
final String md5Secret = extractMd5Secret(val);
BgpRouter br = getClient(YANG_OBJ);
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);
@Override
protected InstanceIdentifier<Neighbors> 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<Neighbors> 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;
}
@Override
protected InstanceIdentifier<EbgpMultihop> 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
@Override
protected InstanceIdentifier<UpdateSource> 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
@Override
protected InstanceIdentifier<AddressFamilies> 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
@Override
protected InstanceIdentifier<Networks> getWildCardPath() {
- return InstanceIdentifier.create(Bgp.class).child(Networks.class);
+ return InstanceIdentifier.create(Bgp.class).child(NetworksContainer.class).child(Networks.class);
}
@Override
@Override
protected InstanceIdentifier<Vrfs> getWildCardPath() {
- return InstanceIdentifier.create(Bgp.class).child(Vrfs.class);
+ return InstanceIdentifier.create(Bgp.class).child(VrfsContainer.class).child(Vrfs.class);
}
@Override
@Override
protected InstanceIdentifier<Multipath> getWildCardPath() {
- return InstanceIdentifier.create(Bgp.class).child(Multipath.class);
+ return InstanceIdentifier.create(Bgp.class).child(MultipathContainer.class).child(Multipath.class);
}
@Override
@Override
protected InstanceIdentifier<VrfMaxpath> getWildCardPath() {
- return InstanceIdentifier.create(Bgp.class).child(VrfMaxpath.class);
+ return InstanceIdentifier.create(Bgp.class).child(VrfMaxpathContainer.class).child(VrfMaxpath.class);
}
class VrfMaxPathConfigurator implements Runnable {
public long getStalePathtime(int defValue, AsId asId) {
long spt = 0;
try {
- spt = getConfig().getGracefulRestart().getStalepathTime().toJava();
+ InstanceIdentifier<GracefulRestart> id =
+ InstanceIdentifier.create(Bgp.class).child(GracefulRestart.class);
+ Optional<GracefulRestart> gracefulRestartOptional = MDSALUtil.read(dataBroker,
+ LogicalDatastoreType.CONFIGURATION, id);
+ if (gracefulRestartOptional.isPresent()) {
+ spt = gracefulRestartOptional.get().getStalepathTime().toJava();
+ }
} catch (NullPointerException e) {
try {
spt = asId.getStalepathTime().toJava();
}
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) {
}
Iterator<Update> updates = routes.getUpdatesIterator();
while (updates.hasNext()) {
+ noUpdates++;
Update update = updates.next();
String rd = update.getRd();
String nexthop = update.getNexthop();
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);
}
}
}
}
- List<Neighbors> neighbors = config.getNeighbors();
+ List<Neighbors> 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);
} catch (Exception e) {
LOG.error("Replay:addGr() received exception: ", e);
}
- List<Vrfs> vrfs = config.getVrfs();
+ List<Vrfs> vrfs = config.getVrfsContainer() == null ? null
+ : config.getVrfsContainer().getVrfs();
if (vrfs == null) {
vrfs = new ArrayList<>();
}
}
}
- List<Networks> ln = config.getNetworks();
+
+ List<Networks> ln = config.getNetworksContainer() == null ? null
+ : config.getNetworksContainer().getNetworks();
if (ln != null) {
for (Networks net : ln) {
String rd = net.getRd();
}
- List<Multipath> multipaths = config.getMultipath();
+ List<Multipath> multipaths = config.getMultipathContainer() == null ? null
+ : config.getMultipathContainer().getMultipath();
if (multipaths != null) {
for (Multipath multipath : multipaths) {
}
}
}
- List<VrfMaxpath> vrfMaxpaths = config.getVrfMaxpath();
+ List<VrfMaxpath> vrfMaxpaths = config.getVrfMaxpathContainer() == null ? null
+ : config.getVrfMaxpathContainer().getVrfMaxpath();
if (vrfMaxpaths != null) {
for (VrfMaxpath vrfMaxpath : vrfMaxpaths) {
try {
String nbrIp, long remoteAs, @Nullable final TcpMd5SignaturePasswordType md5Secret) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<Neighbors> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr));
InstanceIdentifier<Neighbors> iid = iib.build();
TcpSecurityOption tcpSecOption = null;
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
Ipv4Address srcAddr = new Ipv4Address(srcIp);
InstanceIdentifier.InstanceIdentifierBuilder<UpdateSource> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr))
.child(UpdateSource.class);
InstanceIdentifier<UpdateSource> iid = iib.build();
public void addEbgpMultihop(String nbrIp, int hops) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<EbgpMultihop> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr))
.child(EbgpMultihop.class);
InstanceIdentifier<EbgpMultihop> iid = iib.build();
public void addAddressFamily(String nbrIp, int afi, int safi) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<AddressFamilies> 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<AddressFamilies> iid = iib.build();
Ipv4Address nexthop = nh != null ? new Ipv4Address(nh) : null;
Uint32 label = lbl;
InstanceIdentifier<Networks> 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);
AddressFamiliesVrf adf = adfBuilder.build();
adfList.add(adf);
InstanceIdentifier.InstanceIdentifierBuilder<Vrfs> iib = InstanceIdentifier.builder(Bgp.class)
+ .child(VrfsContainer.class)
.child(Vrfs.class, new VrfsKey(rd));
InstanceIdentifier<Vrfs> iid = iib.build();
Vrfs dto = new VrfsBuilder().setRd(rd).setImportRts(irts)
public void delNeighbor(String nbrIp) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<Neighbors> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr));
InstanceIdentifier<Neighbors> iid = iib.build();
delete(iid);
public void delUpdateSource(String nbrIp) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<UpdateSource> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr))
.child(UpdateSource.class);
InstanceIdentifier<UpdateSource> iid = iib.build();
public void delEbgpMultihop(String nbrIp) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<EbgpMultihop> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NeighborsContainer.class)
.child(Neighbors.class, new NeighborsKey(nbrAddr))
.child(EbgpMultihop.class);
InstanceIdentifier<EbgpMultihop> iid = iib.build();
public void delAddressFamily(String nbrIp, int afi, int safi) {
Ipv4Address nbrAddr = new Ipv4Address(nbrIp);
InstanceIdentifier.InstanceIdentifierBuilder<AddressFamilies> 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<AddressFamilies> iid = iib.build();
public void delPrefix(String rd, String pfx) {
InstanceIdentifier.InstanceIdentifierBuilder<Networks> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(NetworksContainer.class)
.child(Networks.class, new NetworksKey(pfx, rd));
InstanceIdentifier<Networks> iid = iib.build();
delete(iid);
}
InstanceIdentifier.InstanceIdentifierBuilder<Vrfs> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(VrfsContainer.class)
.child(Vrfs.class, new VrfsKey(rd));
InstanceIdentifier<Vrfs> iid = iib.build();
@SuppressWarnings("static-access")
InstanceIdentifier<Bgp> iid6 = iid.builder(Bgp.class).build()
+ .child(MultipathContainer.class)
.child(Multipath.class, new MultipathKey(adfBuilder.getAfi(), adfBuilder.getSafi())).create(Bgp.class);
- InstanceIdentifierBuilder<Vrfs> iib3 = iid6.child(Vrfs.class, new VrfsKey(rd)).builder();
+ InstanceIdentifierBuilder<Vrfs> iib3 =
+ iid6.child(VrfsContainer.class).child(Vrfs.class, new VrfsKey(rd)).builder();
InstanceIdentifier<Vrfs> iidFinal = iib3.build();
//** update or delete the vrfs with the rest of AddressFamilies already present in the last list
InstanceIdentifier.InstanceIdentifierBuilder<Multipath> iib =
InstanceIdentifier
- .builder(Bgp.class)
+ .builder(Bgp.class).child(MultipathContainer.class)
.child(Multipath.class,
new MultipathKey(Long.valueOf(afi.getValue()), Long.valueOf(safi.getValue())));
public void setMultipaths(String rd, int maxpath) {
InstanceIdentifier.InstanceIdentifierBuilder<VrfMaxpath> 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();
public void delMultipaths(String rd) {
InstanceIdentifier.InstanceIdentifierBuilder<VrfMaxpath> iib =
- InstanceIdentifier.builder(Bgp.class)
+ InstanceIdentifier.builder(Bgp.class).child(VrfMaxpathContainer.class)
.child(VrfMaxpath.class, new VrfMaxpathKey(rd));
InstanceIdentifier<VrfMaxpath> iid = iib.build();
delete(iid);
totalStaledCount = 0;
try {
staledFibEntriesMap.clear();
+ fibDSWriter.clearFibMap();
InstanceIdentifier<FibEntries> id = InstanceIdentifier.create(FibEntries.class);
Optional<FibEntries> fibEntries = SingleTransactionDataBroker.syncReadOptional(dataBroker,
//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);
}
return totalCleared;
}
+ public static List<Neighbors> getNbrList() {
+ return nbrList;
+ }
+
public BgpCounters getBgpCounters() {
return bgpCountersReference.get();
}
}
return md5Secret;
} // private method extractMd5Secret
+
+ @SuppressWarnings("checkstyle:IllegalCatch")
+ @Override
+ public ListenableFuture<RpcResult<InitiateEorOutput>> 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.<InitiateEorOutput>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.<InitiateEorOutput>failed().withError(RpcError.ErrorType.APPLICATION,
+ msg).build());
+ }
+ InitiateEorOutput initiateEorOutput =
+ new InitiateEorOutputBuilder().setRetVal(0L).build();
+ return Futures.immediateFuture(RpcResultBuilder.<InitiateEorOutput>success()
+ .withResult(initiateEorOutput).build());
+ }
}