<artifactId>mdsalutil-api</artifactId>
<version>${genius.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.ovsdb</groupId>
+ <artifactId>utils.mdsal-utils</artifactId>
+ <version>${ovsdb.version}</version>
+ </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>model-bgp</artifactId>
<artifactId>metrics-api</artifactId>
<version>${infrautils.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.ovsdb</groupId>
+ <artifactId>utils.mdsal-utils</artifactId>
+ <version>1.9.0-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
<build>
*/
package org.opendaylight.netvirt.bgpmanager;
+import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_LIMIT;
+import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_THRESHOLD;
+
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.net.InetAddresses;
import org.opendaylight.netvirt.bgpmanager.thrift.server.BgpThriftService;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.IVpnLinkService;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebfd.rev190219.BfdConfig;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebfd.rev190219.BfdConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
private final EntityOwnershipCandidateRegistration candidateRegistration;
private final EntityOwnershipListenerRegistration entityListenerRegistration;
private final MetricProvider metricProvider;
+ private final TransactionHistory bgpUpdatesHistory;
@Inject
public BgpConfigurationManager(final DataBroker dataBroker,
LOG.info("ConfigServer at {}:{}", hostStartup, portStartup);
VtyshCli.setHostAddr(hostStartup);
ClearBgpCli.setHostAddr(hostStartup);
- bgpRouter = BgpRouter.newInstance(this::getConfig, this::isBGPEntityOwner);
+ bgpUpdatesHistory = new TransactionHistory(HISTORY_LIMIT, HISTORY_THRESHOLD);
+ bgpRouter = BgpRouter.newInstance(this::getConfig, this::isBGPEntityOwner, bgpUpdatesHistory);
delayEorSeconds = Integer.parseInt(getProperty(BGP_EOR_DELAY, DEF_BGP_EOR_DELAY));
entityOwnershipUtils = new EntityOwnershipUtils(entityOwnershipService);
this.cfgReplayEndTime = cfgReplayEndTime;
}
+ public TransactionHistory getBgpUpdatesHistory() {
+ return bgpUpdatesHistory;
+ }
+
public long getCfgReplayStartTime() {
return cfgReplayStartTime;
}
public void onUpdatePushRoute(protocol_type protocolType, String rd, String prefix, int plen, String nextHop,
String macaddress, int label, int l2label, String routermac, af_afi afi) {
+ PrefixUpdateEvent prefixUpdateEvent = new PrefixUpdateEvent(protocolType,rd,prefix,plen,nextHop,
+ macaddress,label,l2label,routermac,afi);
+ bgpUpdatesHistory.addToHistory(TransactionType.ADD, prefixUpdateEvent);
boolean addroute = false;
boolean macupdate = false;
long l3vni = 0L;
public void onUpdateWithdrawRoute(protocol_type protocolType, String rd, String prefix, int plen, String nextHop,
String macaddress) {
+ PrefixWithdrawEvent prefixWithdrawEvent = new PrefixWithdrawEvent(protocolType,rd,prefix,plen,
+ nextHop,macaddress);
+ bgpUpdatesHistory.addToHistory(TransactionType.ADD, prefixWithdrawEvent);
long vni = 0L;
boolean macupdate = false;
if (protocolType.equals(protocol_type.PROTOCOL_EVPN)) {
import org.apache.karaf.shell.console.OsgiCommandSupport;
import org.apache.thrift.transport.TTransport;
import org.opendaylight.netvirt.bgpmanager.commands.Cache;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
@Command(scope = "odl", name = "display-bgp-config", description = "")
required = false, multiValued = false)
Boolean debug = false;
+ @Option(name = "--history", description = "print bgp updates",
+ required = false, multiValued = false)
+ Boolean showHistory = false;
+
private final BgpManager bgpManager;
private final BgpConfigurationManager bgpConfigurationManager;
ps.printf("Total stale entries created %d %n", bgpConfigurationManager.getTotalStaledCount());
ps.printf("Total stale entries cleared %d %n", bgpConfigurationManager.getTotalCleared());
}
+ if (showHistory) {
+ TransactionHistory bgpUpdatesHistory = bgpManager.getBgpConfigurationManager().getBgpUpdatesHistory();
+ bgpUpdatesHistory.getElements().forEach(update -> {
+ Date date = new Date(update.getDate());
+ ps.println(date);
+ ps.print(update.getData());
+ ps.println();
+ });
+ }
Cache cache = new Cache(bgpConfigurationManager);
return cache.show(session);
}
--- /dev/null
+/*
+ * Copyright © 2015, 2017 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.netvirt.bgpmanager;
+
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.protocol_type;
+
+public class PrefixUpdateEvent {
+ private protocol_type protocolType;
+ private String rd;
+ private String prefix;
+ private int plen;
+ private String nexthop;
+ private String macaddress;
+ private int l3label;
+ private int l2label;
+ private String routermac;
+ private af_afi afi;
+
+ public PrefixUpdateEvent(protocol_type protocolType, String rd, String prefix, int plen,
+ String nexthop, String macaddress, int l3label, int l2label,
+ String routermac, af_afi afi) {
+ this.protocolType = protocolType;
+ this.rd = rd;
+ this.prefix = prefix;
+ this.plen = plen;
+ this.nexthop = nexthop;
+ this.macaddress = macaddress;
+ this.l3label = l3label;
+ this.l2label = l2label;
+ this.routermac = routermac;
+ this.afi = afi;
+ }
+
+ @Override
+ public String toString() {
+ return "PrefixUpdateEvent{"
+ + ", protocolType=" + protocolType
+ + ", rd='" + rd + '\''
+ + ", prefix='" + prefix + '\''
+ + ", plen=" + plen
+ + ", nexthop='" + nexthop + '\''
+ + ", macaddress='" + macaddress + '\''
+ + ", l3label=" + l3label
+ + ", l2label=" + l2label
+ + ", routermac='" + routermac + '\''
+ + ", afi=" + afi
+ + '}';
+ }
+}
+
--- /dev/null
+/*
+ * Copyright © 2015, 2017 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.netvirt.bgpmanager;
+
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.protocol_type;
+
+public class PrefixWithdrawEvent {
+ private protocol_type protocolType;
+ private String rd;
+ private String prefix;
+ private int plen;
+ private String nexthop;
+ private String macaddress;
+
+ public PrefixWithdrawEvent(protocol_type protocolType, String rd, String prefix, int plen, String nextHop,
+ String macaddress) {
+
+ this.protocolType = protocolType;
+ this.rd = rd;
+ this.prefix = prefix;
+ this.plen = plen;
+ this.nexthop = nextHop;
+ this.macaddress = macaddress;
+
+ }
+
+ @Override
+ public String toString() {
+ return "PrefixWithdrawEvent{"
+ + "protocolType=" + protocolType
+ + ", rd='" + rd + '\''
+ + ", prefix='" + prefix + '\''
+ + ", plen=" + plen
+ + ", nexthop='" + nexthop + '\''
+ + ", macaddress='" + macaddress + '\''
+ + '}';
+ }
+}
+
int MIN_RX_MAX = 50000;
int MIN_TX_MIN = 1000;
int MIN_TX_MAX = 60000;
+ int HISTORY_LIMIT = 10000;
+ int HISTORY_THRESHOLD = 7500;
int MIN_DETECT_MULT = 2;
int MAX_DETECT_MULT = 255;
int BFD_DEFAULT_FAILURE_THRESHOLD = 0;
package org.opendaylight.netvirt.bgpmanager.thrift.client;
+import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_LIMIT;
+import static org.opendaylight.netvirt.bgpmanager.oam.BgpConstants.HISTORY_THRESHOLD;
+
import com.google.common.annotations.VisibleForTesting;
import java.net.ConnectException;
+import java.util.Arrays;
import java.util.List;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;
import org.opendaylight.netvirt.bgpmanager.thrift.gen.encap_type;
import org.opendaylight.netvirt.bgpmanager.thrift.gen.layer_type;
import org.opendaylight.netvirt.bgpmanager.thrift.gen.protocol_type;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
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.LayerType;
import org.slf4j.Logger;
strs = new String[3];
ints = new int[3];
}
+
+ BgpOp(BgpOp bgpOp) {
+ strs = new String[3];
+ ints = new int[3];
+ this.strs = bgpOp.strs;
+ this.ints = bgpOp.ints;
+ this.afi = bgpOp.afi;
+ this.safi = bgpOp.safi;
+ this.type = bgpOp.type;
+ this.add = bgpOp.add;
+ this.multiHop = bgpOp.multiHop;
+ this.asNumber = bgpOp.asNumber;
+ this.thriftProtocolType = bgpOp.thriftProtocolType;
+ this.thriftLayerType = bgpOp.thriftLayerType;
+ this.ethernetTag = bgpOp.ethernetTag;
+ this.esi = bgpOp.esi;
+ this.macAddress = bgpOp.macAddress;
+ this.l2label = bgpOp.l2label;
+ this.l3label = bgpOp.l3label;
+ this.routermac = bgpOp.routermac;
+ this.thriftEncapType = bgpOp.thriftEncapType;
+ this.delayEOR = bgpOp.delayEOR;
+
+ }
+
+ @Override
+ public String toString() {
+ //TODO pretty print
+ return "BgpOp{"
+ + "type=" + type
+ + ", add=" + add
+ + ",multihop=" + multiHop
+ + ", strs=" + Arrays.toString(strs)
+ + ", ints=" + Arrays.toString(ints)
+ + ", irts=" + irts
+ + ", erts=" + erts
+ + ", asNumber=" + asNumber
+ + ", thriftLayerType=" + thriftLayerType
+ + ", thriftProtocolType=" + thriftProtocolType
+ + ", ethernetTag=" + ethernetTag
+ + ", esi='" + esi + '\''
+ + ", macAddress='" + macAddress + '\''
+ + ", l2label=" + l2label
+ + ", l3label=" + l3label
+ + ", thriftEncapType=" + thriftEncapType
+ + ", routermac='" + routermac + '\''
+ + ", afi=" + afi
+ + ", delayEOR=" + delayEOR
+ + ", safi=" + safi
+ + '}' + '\n';
+ }
}
+
+
private final BgpOp bop = new BgpOp();
private final Supplier<Bgp> bgpConfigSupplier;
private final BooleanSupplier isBGPEntityOwner;
private volatile long startTS;
private volatile long connectTS;
private volatile long lastConnectedTS;
+ private final TransactionHistory transactionHistory;
private volatile boolean configServerUpdated = false;
- private BgpRouter(Supplier<Bgp> bgpConfigSupplier, BooleanSupplier isBGPEntityOwner) {
+ private BgpRouter(Supplier<Bgp> bgpConfigSupplier, BooleanSupplier isBGPEntityOwner,
+ TransactionHistory transactionHistory) {
this.bgpConfigSupplier = bgpConfigSupplier;
this.isBGPEntityOwner = isBGPEntityOwner;
+ this.transactionHistory = transactionHistory;
}
// private ctor FOR UNIT TESTS ONLY
private BgpRouter(BgpConfigurator.Client bgpClient) {
- this(() -> null, () -> false);
+ this(() -> null, () -> false, new TransactionHistory(HISTORY_LIMIT, HISTORY_THRESHOLD));
this.bgpClient = bgpClient;
}
return new BgpRouter(bgpClient);
}
- public static BgpRouter newInstance(Supplier<Bgp> bgpConfigSupplier, BooleanSupplier isEntityBGPOwner) {
- return new BgpRouter(bgpConfigSupplier, isEntityBGPOwner);
+ public static BgpRouter newInstance(Supplier<Bgp> bgpConfigSupplier, BooleanSupplier isEntityBGPOwner,
+ TransactionHistory transactionHistory) {
+ return new BgpRouter(bgpConfigSupplier, isEntityBGPOwner,transactionHistory);
}
public TTransport getTransport() {
return isConnected;
}
+ private TransactionType getTransactionType(BgpOp op) {
+ return op.add ? TransactionType.ADD : TransactionType.DELETE;
+ }
+
private void dispatch(BgpOp op) throws TException, BgpRouterException {
try {
dispatchInternal(op);
+ transactionHistory.addToHistory(getTransactionType(op), new BgpOp(op));
+ LOG.trace("History size is {}", transactionHistory.getElements().size());
} catch (TTransportException tte) {
LOG.error("dispatch command to qthriftd failed, command: {}, exception:", op.toString(), tte);
reConnect(tte);
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-broker-impl</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.karaf.shell</groupId>
+ <artifactId>org.apache.karaf.shell.commands</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.karaf.shell</groupId>
+ <artifactId>org.apache.karaf.shell.console</artifactId>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.opendaylight.genius</groupId>
<artifactId>arputil-api</artifactId>