Added device transaction log cli 61/66561/4
authorK.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
Mon, 18 Dec 2017 12:50:33 +0000 (18:20 +0530)
committerK.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
Fri, 16 Feb 2018 06:08:37 +0000 (11:38 +0530)
Added a cli to display device transaction history

Change-Id: I00d8f5bd287342691c7b69b0b75f79c2cdcee1e8
Signed-off-by: K.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
27 files changed:
hwvtepsouthbound/hwvtepsouthbound-impl/pom.xml
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepConnectionInstance.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepConnectionManager.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepDeviceInfo.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepSouthboundProvider.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepTransactionLogElement.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/TransactionHistoryCmd.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientConnected.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientDisConnected.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/PortEvent.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ReconcilePortEvent.java [new file with mode: 0644]
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/AbstractTransactCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/LogicalSwitchRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/LogicalSwitchUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalPortRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/PhysicalPortUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/AbstractTransactionCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepLogicalSwitchRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepLogicalSwitchUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepPhysicalPortRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepPhysicalPortUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/resources/org/opendaylight/blueprint/hwvtepsouthbound.xml
hwvtepsouthbound/hwvtepsouthbound-impl/src/test/java/org/opendaylight/ovsdb/hwvtepsouthbound/DataChangeListenerTestBase.java
utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalObject.java [new file with mode: 0644]
utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionElement.java [new file with mode: 0644]
utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionHistory.java [new file with mode: 0644]
utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionType.java [new file with mode: 0644]

index 9e9f443f73b0f1938946c4475765d8ae262bba2f..41cced7ba6d82c914f02f460ab504eab8389501c 100644 (file)
@@ -56,6 +56,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>library</artifactId>
       <version>${project.version}</version>
     </dependency>
+      <dependency>
+          <groupId>org.apache.karaf.shell</groupId>
+          <artifactId>org.apache.karaf.shell.console</artifactId>
+          <scope>provided</scope>
+      </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>schema.hardwarevtep</artifactId>
index 203a4598ac5fccb33e8098434fe0c57f7c322098..55536208001f91e91560e6d2ca8d9ae29b307977 100644 (file)
@@ -50,6 +50,7 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.schema.TableSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -80,6 +81,8 @@ public class HwvtepConnectionInstance {
     private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
     private final SettableFuture<Boolean> reconciliationFt = SettableFuture.create();
     private final AtomicBoolean firstUpdateTriggered = new AtomicBoolean(false);
+    private TransactionHistory controllerTxHistory;
+    private TransactionHistory deviceUpdateHistory;
 
     HwvtepConnectionInstance (HwvtepConnectionManager hwvtepConnectionManager, ConnectionInfo key, OvsdbClient client,
                               InstanceIdentifier<Node> iid, TransactionInvoker txInvoker, DataBroker dataBroker) {
@@ -363,4 +366,30 @@ public class HwvtepConnectionInstance {
         TableUpdates tableUpdates = hwvtepTableReader.readAllTables();
         callback.update(tableUpdates, getDatabaseSchema(HwvtepSchemaConstants.HARDWARE_VTEP));
     }
+
+    public MonitorCallBack getCallback() {
+        return callback;
+    }
+
+    public void setCallback(MonitorCallBack callback) {
+        this.callback = callback;
+    }
+
+    public TransactionHistory getControllerTxHistory() {
+        return controllerTxHistory;
+    }
+
+    public void setControllerTxHistory(TransactionHistory controllerTxLog) {
+        deviceInfo.setControllerTxHistory(controllerTxLog);
+        this.controllerTxHistory = controllerTxLog;
+    }
+
+    public TransactionHistory getDeviceUpdateHistory() {
+        return deviceUpdateHistory;
+    }
+
+    public void setDeviceUpdateHistory(TransactionHistory deviceUpdateLog) {
+        deviceInfo.setDeviceUpdateHistory(deviceUpdateLog);
+        this.deviceUpdateHistory = deviceUpdateLog;
+    }
 }
index 4a07e20f7df7890ef255c838340864277baf7028..f044c5415b0cff78352386fa82e5c03dd2f7c46a 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipS
 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.ovsdb.hwvtepsouthbound.events.ClientConnected;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationManager;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationTask;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.configuration.HwvtepReconciliationTask;
@@ -42,6 +43,8 @@ import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.Global;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalSwitchAttributes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
@@ -73,6 +76,8 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
     private static final Logger LOG = LoggerFactory.getLogger(HwvtepConnectionManager.class);
     private static final String ENTITY_TYPE = "hwvtep";
     private static final int DB_FETCH_TIMEOUT = 1000;
+    private static final int TRANSACTION_HISTORY_CAPACITY = 10000;
+    private static final int TRANSACTION_HISTORY_WATERMARK = 7500;
 
     private DataBroker db;
     private TransactionInvoker txInvoker;
@@ -84,6 +89,8 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
     private final Map<InstanceIdentifier<Node>, HwvtepConnectionInstance> nodeIidVsConnectionInstance =
             new ConcurrentHashMap<>();
     private HwvtepOperGlobalListener hwvtepOperGlobalListener;
+    private final Map<InstanceIdentifier<Node>, TransactionHistory> controllerTxHistory = new ConcurrentHashMap<>();
+    private final Map<InstanceIdentifier<Node>, TransactionHistory> deviceUpdateHistory = new ConcurrentHashMap<>();
 
     public HwvtepConnectionManager(DataBroker db, TransactionInvoker txInvoker,
                     EntityOwnershipService entityOwnershipService) {
@@ -140,6 +147,9 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
         ConnectionInfo key = HwvtepSouthboundMapper.createConnectionInfo(client);
         HwvtepConnectionInstance hwvtepConnectionInstance = getConnectionInstance(key);
         if (hwvtepConnectionInstance != null) {
+            deviceUpdateHistory.get(hwvtepConnectionInstance.getInstanceIdentifier()).addToHistory(
+                    TransactionType.DELETE, new ClientConnected(client.getConnectionInfo().getRemotePort()));
+
             // Unregister Entity ownership as soon as possible ,so this instance should
             // not be used as a candidate in Entity election (given that this instance is
             // about to disconnect as well), if current owner get disconnected from
@@ -424,7 +434,16 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
             hwvtepConnectionInstance.setInstanceIdentifier(iid);
             LOG.info("InstanceIdentifier {} generated for device "
                     + "connection {}",iid, hwvtepConnectionInstance.getConnectionInfo());
-
+            controllerTxHistory.putIfAbsent(iid,
+                    new TransactionHistory(TRANSACTION_HISTORY_CAPACITY, TRANSACTION_HISTORY_WATERMARK));
+            deviceUpdateHistory.putIfAbsent(iid,
+                    new TransactionHistory(TRANSACTION_HISTORY_CAPACITY, TRANSACTION_HISTORY_WATERMARK));
+            TransactionHistory controllerLog = controllerTxHistory.get(iid);
+            TransactionHistory deviceLog = deviceUpdateHistory.get(iid);
+            int port = hwvtepConnectionInstance.getOvsdbClient().getConnectionInfo().getRemotePort();
+            deviceLog.addToHistory(TransactionType.ADD, new ClientConnected(port));
+            hwvtepConnectionInstance.setControllerTxHistory(controllerLog);
+            hwvtepConnectionInstance.setDeviceUpdateHistory(deviceLog);
         }
         YangInstanceIdentifier entityId =
                 HwvtepSouthboundUtil.getInstanceIdentifierCodec().getYangInstanceIdentifier(iid);
@@ -586,6 +605,14 @@ public class HwvtepConnectionManager implements OvsdbConnectionListener, AutoClo
          }
     }
 
+    public Map<InstanceIdentifier<Node>, TransactionHistory> getControllerTxHistory() {
+        return controllerTxHistory;
+    }
+
+    public Map<InstanceIdentifier<Node>, TransactionHistory> getDeviceUpdateHistory() {
+        return deviceUpdateHistory;
+    }
+
     private class HwvtepDeviceEntityOwnershipListener implements EntityOwnershipListener {
         private HwvtepConnectionManager hcm;
         private EntityOwnershipListenerRegistration listenerRegistration;
index ec637a98abb77b83fb76330c3dd6140b2eba2cfd..38c69865ccbda544c9b50ce2f3daeb6b2e3a8464 100644 (file)
@@ -16,12 +16,12 @@ import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -118,6 +118,9 @@ public class HwvtepDeviceInfo {
     private Map<Class<? extends Identifiable>, Map<InstanceIdentifier, DeviceData>> opKeyVsData = new ConcurrentHashMap<>();
     private Map<Class<? extends Identifiable>, Map<UUID, Object>> uuidVsData = new ConcurrentHashMap<>();
     private DependencyQueue dependencyQueue;
+    private TransactionHistory controllerTxHistory;
+    private TransactionHistory deviceUpdateHistory;
+
 
     public HwvtepDeviceInfo(HwvtepConnectionInstance hwvtepConnectionInstance) {
         this.connectionInstance = hwvtepConnectionInstance;
@@ -395,4 +398,24 @@ public class HwvtepDeviceInfo {
     public HwvtepConnectionInstance getConnectionInstance() {
         return connectionInstance;
     }
+
+    public void setConfigKeyVsData(Map<Class<? extends Identifiable>, Map<InstanceIdentifier, DeviceData>> configKeyVsData) {
+        this.configKeyVsData = configKeyVsData;
+    }
+
+    public void setControllerTxHistory(TransactionHistory controllerTxHistory) {
+        this.controllerTxHistory = controllerTxHistory;
+    }
+
+    public void setDeviceUpdateHistory(TransactionHistory deviceUpdateHistory) {
+        this.deviceUpdateHistory = deviceUpdateHistory;
+    }
+
+    public void addToControllerTx(TransactionType transactionType, Object object) {
+        controllerTxHistory.addToHistory(transactionType, object);
+    }
+
+    public void addToDeviceUpdate(TransactionType transactionType, Object object) {
+        deviceUpdateHistory.addToHistory(transactionType, object);
+    }
 }
index ad1cf20969a488889aa66f8ce8e4f671663f7268..9956f4ef6eab46826fe9f87bc8d74c04d1ef2a45 100644 (file)
@@ -212,4 +212,7 @@ public class HwvtepSouthboundProvider implements ClusteredDataTreeChangeListener
         }
     }
 
+    public HwvtepConnectionManager getHwvtepConnectionManager() {
+        return cm;
+    }
 }
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepTransactionLogElement.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepTransactionLogElement.java
new file mode 100644 (file)
index 0000000..7d2f99d
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound;
+
+import org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md.HwvtepOperationalCommandAggregator;
+import org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md.TransactionInvoker;
+import org.opendaylight.ovsdb.lib.MonitorCallBack;
+import org.opendaylight.ovsdb.lib.message.TableUpdates;
+import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionElement;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HwvtepTransactionLogElement extends TransactionElement {
+
+    private final boolean isDeviceLog;
+
+    public HwvtepTransactionLogElement(TransactionType transactionType,
+                                       Object data,
+                                       boolean isDeviceLog) {
+        super(transactionType, data);
+        this.isDeviceLog = isDeviceLog;
+    }
+
+    public HwvtepTransactionLogElement(TransactionElement element,
+                                       boolean isDeviceLog) {
+        super(element.getTransactionType(), element.getData());
+        this.isDeviceLog = isDeviceLog;
+    }
+
+    @Override
+    public String toString() {
+        return "{" +
+                "isDeviceLog=" + isDeviceLog +
+                super.toString() +
+                '}';
+    }
+}
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/TransactionHistoryCmd.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/TransactionHistoryCmd.java
new file mode 100644 (file)
index 0000000..60b82c8
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound;
+
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionElement;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Command(scope = "hwvtep", name = "txlog", description = "prints hwvtep tx log")
+public class TransactionHistoryCmd extends OsgiCommandSupport {
+
+    @Option(name = "-nodeid", description = "Node Id",
+            required = false, multiValued = false)
+    String nodeid;
+
+    private HwvtepSouthboundProvider hwvtepProvider;
+    private DataBroker dataBroker;
+
+    public void setDataBroker(DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
+    }
+
+    public void setHwvtepProvider(HwvtepSouthboundProvider hwvtepProvider) {
+        this.hwvtepProvider = hwvtepProvider;
+    }
+
+    @Override
+    protected Object doExecute() throws Exception {
+        Map<InstanceIdentifier<Node>, TransactionHistory> controllerTxLogs
+                = hwvtepProvider.getHwvtepConnectionManager().getControllerTxHistory();
+        Map<InstanceIdentifier<Node>, TransactionHistory> deviceUpdateLogs
+                = hwvtepProvider.getHwvtepConnectionManager().getDeviceUpdateHistory();
+        if (nodeid != null) {
+            InstanceIdentifier<Node> iid = HwvtepSouthboundMapper.createInstanceIdentifier(new NodeId(nodeid));
+            printLogs(controllerTxLogs, deviceUpdateLogs, iid);
+        } else {
+            Map<InstanceIdentifier<Node>, TransactionHistory> txlogs
+                    = controllerTxLogs.isEmpty() ? deviceUpdateLogs : controllerTxLogs;
+            txlogs.keySet().forEach( (iid) -> {
+                printLogs(controllerTxLogs, deviceUpdateLogs, iid);
+            });
+            session.getConsole().println("Device tx logs size "+deviceUpdateLogs.keySet().size());
+        }
+        return null;
+    }
+
+    private void printLogs(Map<InstanceIdentifier<Node>, TransactionHistory> controllerTxLogs,
+                           Map<InstanceIdentifier<Node>, TransactionHistory> deviceUpdateLogs,
+                           InstanceIdentifier<Node> iid) {
+        session.getConsole().println("Printing for iid "+ iid);
+        List<HwvtepTransactionLogElement> controllerTxLog = controllerTxLogs.get(iid).getElements()
+                .stream().map(ele -> new HwvtepTransactionLogElement(ele, false)).collect(Collectors.toList());
+        List<HwvtepTransactionLogElement> deviceUpdateLog = deviceUpdateLogs.get(iid).getElements()
+                .stream().map(ele -> new HwvtepTransactionLogElement(ele, false)).collect(Collectors.toList());
+        //deviceUpdateLog.forEach( (log) -> log.setDeviceLog(true));
+        List<HwvtepTransactionLogElement> allLogs = mergeLogsByDate(controllerTxLog, deviceUpdateLog);
+        session.getConsole().println("======================================");
+        session.getConsole().println("======================================");
+        session.getConsole().print("printing logs for node ");
+        session.getConsole().println(iid);
+        printLogs(allLogs);
+    }
+
+    private void sortLogsByDate(ArrayList<TransactionElement> logs) {
+        Collections.sort(logs, new Comparator<TransactionElement>() {
+            @Override
+            public int compare(TransactionElement o1, TransactionElement o2) {
+                return (int) (o1.getDate() - o2.getDate());
+            }
+        });
+    }
+
+    private List<HwvtepTransactionLogElement> mergeLogsByDate(
+            List<HwvtepTransactionLogElement> logs1,
+            List<HwvtepTransactionLogElement> logs2) {
+
+        ArrayList<HwvtepTransactionLogElement> result = new ArrayList();
+        int firstIdx = 0;
+        int secondIdx = 0;
+        int firstSize = logs1.size();
+        int secondSize = logs2.size();
+        while ( firstIdx < firstSize && secondIdx < secondSize) {
+            if (logs1.get(firstIdx).getDate() < logs2.get(secondIdx).getDate()) {
+                result.add(logs1.get(firstIdx));
+                firstIdx++;
+            } else {
+                result.add(logs2.get(secondIdx));
+                secondIdx++;
+            }
+        }
+        while (firstIdx < firstSize) {
+            result.add(logs1.get(firstIdx));
+            firstIdx++;
+        }
+        while (secondIdx < secondSize) {
+            result.add(logs2.get(secondIdx));
+            secondIdx++;
+        }
+        return result;
+    }
+
+    private void printLogs(List<HwvtepTransactionLogElement> logs) {
+        logs.forEach( (log) -> {
+            session.getConsole().print(new Date(log.getDate()));
+            session.getConsole().print(" ");
+            session.getConsole().print(log.getTransactionType());
+            session.getConsole().print(" ");
+            session.getConsole().println(log.getData());
+        });
+    }
+}
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientConnected.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientConnected.java
new file mode 100644 (file)
index 0000000..653eab8
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound.events;
+
+public class ClientConnected {
+
+    private final int port;
+
+    public ClientConnected(int port) {
+        this.port = port;
+    }
+
+    @Override
+    public String toString() {
+        return "ClientConnected{" +
+                "port=" + port +
+                '}';
+    }
+}
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientDisConnected.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ClientDisConnected.java
new file mode 100644 (file)
index 0000000..6d554ca
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound.events;
+
+public class ClientDisConnected {
+
+    private final int port;
+
+    public ClientDisConnected(int port) {
+        this.port = port;
+    }
+
+    @Override
+    public String toString() {
+        return "ClientConnected{" +
+                "port=" + port +
+                '}';
+    }
+}
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/PortEvent.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/PortEvent.java
new file mode 100644 (file)
index 0000000..408990a
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound.events;
+
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+
+public class PortEvent {
+
+    private final PhysicalPort port;
+    private final NodeId nodeId;
+
+    public PortEvent(PhysicalPort port, NodeId nodeId) {
+        this.port = port;
+        this.nodeId = nodeId;
+    }
+
+    @Override
+    public String toString() {
+        return "PortEvent{" +
+                "port=" + port +
+                "nodeId=" + nodeId +
+                '}';
+    }
+}
diff --git a/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ReconcilePortEvent.java b/hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/events/ReconcilePortEvent.java
new file mode 100644 (file)
index 0000000..252d86b
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 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.ovsdb.hwvtepsouthbound.events;
+
+import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+
+public class ReconcilePortEvent {
+
+    private final PhysicalPort port;
+    private final NodeId nodeId;
+
+    public ReconcilePortEvent(PhysicalPort port, NodeId nodeId) {
+        this.port = port;
+        this.nodeId = nodeId;
+    }
+
+    @Override
+    public String toString() {
+        return "ReconcilePortEvent{" +
+                "port=" + port +
+                "nodeId=" + nodeId +
+                '}';
+    }
+}
index 813c54d62c4c154215246bb3c46b1073f1357bdb..0a1493d6e4da4e105d184aa7f6a9b79ceb513f20 100644 (file)
@@ -30,6 +30,7 @@ import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
@@ -400,4 +401,8 @@ public abstract class AbstractTransactCommand<T extends Identifiable, A extends
 
     protected void onCommandFailed() {
     }
+
+    void updateControllerTxHistory(TransactionType transactionType, Object element) {
+        getOperationalState().getDeviceInfo().addToControllerTx(transactionType, element);
+    }
 }
index c1c3cdbaacd4002662569c8c7ee300bd3bbb5a68..619895b3058344ad29f0fc74dfcf52807f3bb914 100644 (file)
@@ -29,17 +29,14 @@ import org.opendaylight.ovsdb.schema.hardwarevtep.McastMacsLocal;
 import org.opendaylight.ovsdb.schema.hardwarevtep.McastMacsRemote;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsLocal;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsRemote;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-
 public class LogicalSwitchRemoveCommand extends AbstractTransactCommand<LogicalSwitches, HwvtepGlobalAugmentation> {
     private static final Logger LOG = LoggerFactory.getLogger(LogicalSwitchRemoveCommand.class);
 
@@ -136,6 +133,7 @@ public class LogicalSwitchRemoveCommand extends AbstractTransactCommand<LogicalS
                 transaction.add(op.delete(mcastMacsLocal.getSchema())
                         .where(mcastMacsLocal.getLogicalSwitchColumn().getSchema().opEqual(logicalSwitchUuid)).build());
                 updateCurrentTxDeleteData(LogicalSwitches.class, lsKey, lswitch);
+                updateControllerTxHistory(TransactionType.DELETE, lswitch);
             } else {
                 LOG.warn("Unable to delete logical switch {} because it was not found in the operational store",
                         lswitch.getHwvtepNodeName().getValue());
index 072800d6633495063648759ac8f5fdafa334f6e6..924e8330afb3d49bbd541092b696a41431288652 100644 (file)
@@ -26,16 +26,14 @@ import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.lib.error.SchemaVersionMismatchException;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-
 public class LogicalSwitchUpdateCommand extends AbstractTransactCommand<LogicalSwitches, HwvtepGlobalAugmentation> {
     private static final Logger LOG = LoggerFactory.getLogger(LogicalSwitchUpdateCommand.class);
 
@@ -94,6 +92,7 @@ public class LogicalSwitchUpdateCommand extends AbstractTransactCommand<LogicalS
                 transaction.add(op.comment("Logical Switch: Creating " + lswitch.getHwvtepNodeName().getValue()));
                 UUID lsUuid = new UUID(TransactUtils.getLogicalSwitchId(lswitch));
                 updateCurrentTxData(LogicalSwitches.class, lsKey, lsUuid, lswitch);
+                updateControllerTxHistory(TransactionType.ADD, lswitch);
             } else {
                 String existingLogicalSwitchName = lswitch.getHwvtepNodeName().getValue();
                 // Name is immutable, and so we *can't* update it.  So we use extraBridge for the schema stuff
@@ -104,6 +103,7 @@ public class LogicalSwitchUpdateCommand extends AbstractTransactCommand<LogicalS
                         .where(extraLogicalSwitch.getNameColumn().getSchema().opEqual(existingLogicalSwitchName))
                         .build());
                 transaction.add(op.comment("Logical Switch: Updating " + existingLogicalSwitchName));
+                updateControllerTxHistory(TransactionType.UPDATE, lswitch);
             }
     }
 
index f412c2b275dd2a8e13892cf58b97596ce3e7c2b1..1ca847d6cae28a075341e7b0a67547da9457a29e 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
@@ -72,6 +73,7 @@ public class PhysicalPortRemoveCommand extends AbstractTransactCommand {
                 transaction.add(op.update(physicalPort)
                         .where(extraPhyscialPort.getNameColumn().getSchema().opEqual(existingPhysicalPortName))
                         .build());
+                updateControllerTxHistory(TransactionType.UPDATE, physicalPort);
             } else {
                 LOG.warn("Unable to update physical port {} because it was not found in the operational store, "
                         + "and thus we cannot retrieve its UUID", port.getHwvtepNodeName().getValue());
index 25fdfecb40b190c8872fbc939deaa57eb73a4ca2..9d989f0ef5261cfaa0c7d627f31ae9d43a5b282e 100644 (file)
@@ -21,17 +21,13 @@ import java.util.Map.Entry;
 import com.google.common.collect.Lists;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
-import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
-import org.opendaylight.ovsdb.lib.notation.Mutator;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
-import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
-import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
@@ -42,7 +38,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,6 +100,7 @@ public class PhysicalPortUpdateCommand extends AbstractTransactCommand {
                         .where(extraPhyscialPort.getNameColumn().getSchema().opEqual(existingPhysicalPortName))
                         .build());
                 transaction.add(op.comment("Physical Port: Updating " + existingPhysicalPortName));
+                updateControllerTxHistory(TransactionType.UPDATE, physicalPort);
             }
         }
     }
index d7dca6b95531ceb605988b4ccd6a2adf30db5379..7c87cc1864ee5bbd95c826a31fa68030e04dfb88 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 
@@ -47,4 +48,8 @@ public abstract class AbstractTransactionCommand<T extends DataObject> implement
     public HwvtepDeviceInfo getDeviceInfo() {
         return key.getDeviceInfo();
     }
+
+    void addToDeviceUpdate(TransactionType transactionType, Object element) {
+        key.getDeviceInfo().addToDeviceUpdate(transactionType, element);
+    }
 }
index f4dcab33eb182abc3173bf442d673d0b7d58e53b..a6f4591e80380263c9f599e5ec79e86ed88f8b40 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
@@ -40,6 +41,7 @@ public class HwvtepLogicalSwitchRemoveCommand extends AbstractTransactionCommand
             // TODO Delete any references
             transaction.delete(LogicalDatastoreType.OPERATIONAL, switchIid);
             getOvsdbConnectionInstance().getDeviceInfo().clearDeviceOperData(LogicalSwitches.class, switchIid);
+            addToDeviceUpdate(TransactionType.DELETE, lSwitch);
         }
     }
 
index c00f7914539ed027ae775b32b7e96838d5c4174e..13d2ad0a1822a1684a6f4861e532e0d82fb2b394 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.ovsdb.lib.notation.Version;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder;
@@ -67,6 +68,7 @@ public class HwvtepLogicalSwitchUpdateCommand extends AbstractTransactionCommand
                     .child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName(lSwitch.getName())));
             getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(LogicalSwitches.class, switchIid,
                     lSwitch.getUuid(), lSwitch);
+            addToDeviceUpdate(TransactionType.ADD, lSwitch);
             // TODO: Delete entries that are no longer needed
         }
     }
index cf29c3e536c159c3f7f60e875100ed28e8796c45..a1a6ed1127cf8638791a55fbb26f5ad54f4a6fc1 100644 (file)
@@ -15,13 +15,16 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.events.PortEvent;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -65,6 +68,8 @@ public class HwvtepPhysicalPortRemoveCommand extends AbstractTransactionCommand
                                 updatedPSwitchData).child(TerminationPoint.class,
                                 new TerminationPointKey(new TpId(portName)));
                 transaction.delete(LogicalDatastoreType.OPERATIONAL, nodePath);
+                addToDeviceUpdate(TransactionType.DELETE,
+                        new PortEvent(pPort, nodePath.firstKeyOf(Node.class).getNodeId()));
                 getDeviceInfo().clearDeviceOperData(TerminationPoint.class, nodePath);
             }
         }
index ce65d5c6212a28ab0302a09a437249664973eb89..0b2ec41682ff8465ee86df9f54e73836c6b1c653 100644 (file)
@@ -26,6 +26,8 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
+import org.opendaylight.ovsdb.hwvtepsouthbound.events.PortEvent;
+import org.opendaylight.ovsdb.hwvtepsouthbound.events.ReconcilePortEvent;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.HwvtepOperationalState;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.PhysicalPortUpdateCommand;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
@@ -35,6 +37,7 @@ import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalPort;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
@@ -51,6 +54,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hw
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindingsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindingsKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
@@ -129,6 +133,12 @@ public class HwvtepPhysicalPortUpdateCommand extends AbstractTransactionCommand
                 } else {
                     transaction.put(LogicalDatastoreType.OPERATIONAL, tpPath, tpBuilder.build());
                 }
+                NodeId psNodeId = tpPath.firstKeyOf(Node.class).getNodeId();
+                if (getDeviceInfo().getDeviceOperData(TerminationPoint.class, tpPath) == null) {
+                    addToDeviceUpdate(TransactionType.ADD, new PortEvent(pPortUpdate, psNodeId));
+                } else {
+                    addToDeviceUpdate(TransactionType.UPDATE, new PortEvent(pPortUpdate, psNodeId));
+                }
                 reconcileToPort(transaction, pPortUpdate, tpPath);
                 getDeviceInfo().updateDeviceOperData(TerminationPoint.class, tpPath,
                         pPortUpdate.getUuid(), pPortUpdate);
@@ -177,6 +187,8 @@ public class HwvtepPhysicalPortUpdateCommand extends AbstractTransactionCommand
                             //TODO port came with some vlan bindings clean them up use PortRemovedCommand
                             return;
                         }
+                        addToDeviceUpdate(TransactionType.ADD,
+                                new ReconcilePortEvent(pPortUpdate, tpPath.firstKeyOf(Node.class).getNodeId()));
                         getDeviceInfo().updateDeviceOperData(TerminationPoint.class, tpPath,
                                 pPortUpdate.getUuid(), pPortUpdate);
                         TerminationPoint configTp = optionalConfigTp.get();
index 357b09efb26a2bdecfc7b0f11403efbd58c49fcc..081d1ff98be8709b44bdee1eff6653af8f5907c1 100644 (file)
     <argument ref="bindingNormalizedNodeSerializer" />
   </bean>
 
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+    <command>
+        <action class="org.opendaylight.ovsdb.hwvtepsouthbound.TransactionHistoryCmd">
+            <property name="dataBroker" ref="dataBroker" />
+            <property name="hwvtepProvider" ref="hwvtepProvider" />
+        </action>
+    </command>
+    </command-bundle>
 </blueprint>
index 59501ec12e37034c272968b4d8404c6a231288ec..90ae8ce3acd0a2f2b906b8ee587de07f37a5af5c 100644 (file)
@@ -54,6 +54,7 @@ import org.opendaylight.ovsdb.lib.operations.Update;
 import org.opendaylight.ovsdb.lib.operations.Where;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionHistory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder;
@@ -207,6 +208,8 @@ public class DataChangeListenerTestBase extends AbstractDataBrokerTest {
         doReturn(nodeIid).when(connectionInstance).getInstanceIdentifier();
         field(HwvtepConnectionInstance.class, "deviceInfo").set(connectionInstance,
                 new HwvtepDeviceInfo(connectionInstance));
+        connectionInstance.setControllerTxHistory(new TransactionHistory(10000, 7500));
+        connectionInstance.setDeviceUpdateHistory(new TransactionHistory(10000, 7500));
         connectionInstance.createTransactInvokers();
     }
 
diff --git a/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalObject.java b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/MdsalObject.java
new file mode 100644 (file)
index 0000000..f8beee6
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 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.ovsdb.utils.mdsal.utils;
+
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class MdsalObject {
+    private final InstanceIdentifier iid;
+    private final DataObject dataObject;
+
+    public MdsalObject(InstanceIdentifier iid, DataObject dataObject) {
+        this.dataObject = dataObject;
+        this.iid = iid;
+    }
+
+    @Override
+    public String toString() {
+        return "MdsalObject{" +
+                "dataObject=" + dataObject +
+                ", iid=" + iid +
+                '}';
+    }
+}
diff --git a/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionElement.java b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionElement.java
new file mode 100644 (file)
index 0000000..18c695b
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 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.ovsdb.utils.mdsal.utils;
+
+public class TransactionElement {
+    private long date;
+    private TransactionType transactionType;
+    private Object data;
+
+    public TransactionElement(TransactionType transactionType, Object data) {
+        this.data = data;
+        this.transactionType = transactionType;
+        this.date = System.currentTimeMillis();
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public long getDate() {
+        return date;
+    }
+
+    public TransactionType getTransactionType() {
+        return transactionType;
+    }
+
+    @Override
+    public String toString() {
+        return "TransactionElement{" +
+                "date=" + date +
+                ", transactionType=" + transactionType +
+                ", data=" + data +
+                '}';
+    }
+}
diff --git a/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionHistory.java b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionHistory.java
new file mode 100644 (file)
index 0000000..ec45cb8
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2015 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.ovsdb.utils.mdsal.utils;
+
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+
+public class TransactionHistory extends ArrayList<TransactionElement> {
+
+    private final int capacity;
+    private final int watermark;
+
+    public TransactionHistory(int initialCapacity, int watermark) {
+        super(initialCapacity);
+        this.capacity = initialCapacity;
+        this.watermark = watermark;
+    }
+
+    public void addToHistory(TransactionType updateType, Object object) {
+        add(new TransactionElement(updateType, object));
+    }
+
+    public void addToHistory(TransactionType updateType, InstanceIdentifier iid, DataObject dataObject) {
+        add(new TransactionElement(updateType, new MdsalObject(iid, dataObject)));
+    }
+
+    @Override
+    public boolean add(TransactionElement element) {
+        if (size() >= watermark) {
+            removeRange(0, capacity - watermark);
+        }
+        return super.add(element);
+    }
+
+    public ArrayList<TransactionElement> getElements() {
+        return new ArrayList<>(this);
+    }
+
+    @Override
+    protected void removeRange(int fromIndex, int toIndex) {
+        super.removeRange(fromIndex, toIndex);
+    }
+}
diff --git a/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionType.java b/utils/mdsal-utils/src/main/java/org/opendaylight/ovsdb/utils/mdsal/utils/TransactionType.java
new file mode 100644 (file)
index 0000000..e061358
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 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.ovsdb.utils.mdsal.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+
+public enum TransactionType {
+    ADD,
+    UPDATE,
+    DELETE;
+}