BGP function calls logging 50/80350/7
authorLoshmitha <loshmitha@ericsson.com>
Fri, 15 Feb 2019 11:19:32 +0000 (16:49 +0530)
committerLoshmitha Natarajan <loshmitha@ericsson.com>
Tue, 26 Feb 2019 05:58:09 +0000 (05:58 +0000)
The logs have been added for the bgp calls with timestamp

JIRA: NETVIRT-1564

Change-Id: I4f7c253c2df2e1e20a2a031b563ede37495ac094
Signed-off-by: Loshmitha <loshmitha@ericsson.com>
bgpmanager/impl/pom.xml
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/DisplayBgpConfigCli.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixUpdateEvent.java [new file with mode: 0644]
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixWithdrawEvent.java [new file with mode: 0644]
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/oam/BgpConstants.java
bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/thrift/client/BgpRouter.java
natservice/impl/pom.xml

index 5b51963bd907d1cb902b8025a4d5ffa348a62558..633978486a83557ece3b4941f14ccea9ed17b53e 100644 (file)
@@ -41,6 +41,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <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>
@@ -87,6 +92,12 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <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>
index 905a0a15ef0c07becbb66542d3e5a12f27f6125b..d872a6d7b7c4e9c14bd8218b76e6340492c8aafe 100755 (executable)
@@ -7,6 +7,9 @@
  */
 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;
@@ -80,6 +83,8 @@ import org.opendaylight.netvirt.bgpmanager.thrift.gen.qbgpConstants;
 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;
@@ -237,6 +242,7 @@ public class BgpConfigurationManager {
     private final EntityOwnershipCandidateRegistration candidateRegistration;
     private final EntityOwnershipListenerRegistration entityListenerRegistration;
     private final MetricProvider metricProvider;
+    private final TransactionHistory bgpUpdatesHistory;
 
     @Inject
     public BgpConfigurationManager(final DataBroker dataBroker,
@@ -257,7 +263,8 @@ public class BgpConfigurationManager {
         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);
@@ -327,6 +334,10 @@ public class BgpConfigurationManager {
         this.cfgReplayEndTime = cfgReplayEndTime;
     }
 
+    public TransactionHistory getBgpUpdatesHistory() {
+        return bgpUpdatesHistory;
+    }
+
     public long getCfgReplayStartTime() {
         return cfgReplayStartTime;
     }
@@ -1950,6 +1961,9 @@ public class BgpConfigurationManager {
 
     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;
@@ -2020,6 +2034,9 @@ public class BgpConfigurationManager {
 
     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)) {
index 9587312c7ebc0b5b9466118a895482d36cabbe61..1c9aa0c6dc7c97e5d15b238c070e39f0369e042f 100644 (file)
@@ -15,6 +15,7 @@ import org.apache.karaf.shell.commands.Option;
 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 = "")
@@ -24,6 +25,10 @@ public class DisplayBgpConfigCli extends OsgiCommandSupport {
             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;
 
@@ -69,6 +74,15 @@ public class DisplayBgpConfigCli extends OsgiCommandSupport {
             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);
     }
diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixUpdateEvent.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixUpdateEvent.java
new file mode 100644 (file)
index 0000000..772d80d
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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
+                + '}';
+    }
+}
+
diff --git a/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixWithdrawEvent.java b/bgpmanager/impl/src/main/java/org/opendaylight/netvirt/bgpmanager/PrefixWithdrawEvent.java
new file mode 100644 (file)
index 0000000..23e3476
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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 + '\''
+                + '}';
+    }
+}
+
index 07c164b6668b73958ed513e50be25c943a7c81ad..4095b06ae9022ce9635aed2c0887bff3a2272022 100644 (file)
@@ -34,6 +34,8 @@ public interface BgpConstants {
     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;
index 59a0be9402081e3438307b9b10c66c641c19f783..ab9433ab1b705250dffa1cea1f3fd7ab1e4492e4 100644 (file)
@@ -8,8 +8,12 @@
 
 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;
@@ -29,6 +33,8 @@ import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
 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;
@@ -74,8 +80,61 @@ public final class BgpRouter {
             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;
@@ -86,16 +145,19 @@ public final class BgpRouter {
     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;
     }
 
@@ -105,8 +167,9 @@ public final class BgpRouter {
         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() {
@@ -212,9 +275,15 @@ public final class BgpRouter {
         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);
index ce419ab09eb7376f39e668f31c6376a4d9dbb9f5..b022f61082e027fadb2a914fd822f84b2b2a9950 100644 (file)
@@ -39,6 +39,16 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <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>