bug 6579 checking the depency before transaction 24/48924/3
authorK.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
Thu, 1 Dec 2016 18:20:27 +0000 (23:50 +0530)
committerK.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
Tue, 13 Dec 2016 11:08:49 +0000 (16:38 +0530)
integrated the mcast , ucast mac and logical switch with dependency queue

Change-Id: I60643affc1d275b5a1b3586147ac83a67a01d22d
Signed-off-by: K.V Suneelu Verma <k.v.suneelu.verma@ericsson.com>
21 files changed:
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepDeviceInfo.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/reconciliation/configuration/HwvtepReconciliationTask.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/AbstractTransactCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/DependencyQueue.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/McastMacsRemoteRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/McastMacsRemoteUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/TransactCommandAggregator.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transact/UcastMacsRemoteUpdateCommand.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/HwvtepMacEntriesRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepMcastMacsRemoteUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepPhysicalLocatorRemoveCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepPhysicalLocatorUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/main/java/org/opendaylight/ovsdb/hwvtepsouthbound/transactions/md/HwvtepUcastMacsRemoteUpdateCommand.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/test/java/org/opendaylight/ovsdb/hwvtepsouthbound/DataChangeListenerTestBase.java
hwvtepsouthbound/hwvtepsouthbound-impl/src/test/java/org/opendaylight/ovsdb/hwvtepsouthbound/HwvtepDataChangeListenerTest.java

index 77725d7e914bf73431f48583bc984a252b9c5579..ba0b1a3886105dbc54c2f37f8e9be29d250812d4 100644 (file)
@@ -14,6 +14,8 @@ 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.schema.hardwarevtep.LogicalSwitch;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalLocator;
 import org.opendaylight.ovsdb.schema.hardwarevtep.PhysicalSwitch;
+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.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -99,20 +101,19 @@ public class HwvtepDeviceInfo {
         this.dependencyQueue = new DependencyQueue(this);
     }
 
         this.dependencyQueue = new DependencyQueue(this);
     }
 
-    public void putLogicalSwitch(UUID uuid, LogicalSwitch lSwitch) {
-        logicalSwitches.put(uuid, lSwitch);
-    }
-
     public LogicalSwitch getLogicalSwitch(UUID uuid) {
     public LogicalSwitch getLogicalSwitch(UUID uuid) {
-        return logicalSwitches.get(uuid);
-    }
-
-    public LogicalSwitch removeLogicalSwitch(UUID uuid) {
-        return logicalSwitches.remove(uuid);
+        return (LogicalSwitch) getDeviceOpData(LogicalSwitches.class, uuid);
     }
 
     public Map<UUID, LogicalSwitch> getLogicalSwitches() {
     }
 
     public Map<UUID, LogicalSwitch> getLogicalSwitches() {
-        return logicalSwitches;
+        Map<UUID, Object> switches = uuidVsData.get(LogicalSwitches.class);
+        Map<UUID, LogicalSwitch> result = new HashMap<>();
+        if (switches != null) {
+            for (Map.Entry<UUID, Object> entry : switches.entrySet()) {
+                result.put(entry.getKey(), (LogicalSwitch) entry.getValue());
+            }
+        }
+        return result;
     }
 
     public void putPhysicalSwitch(UUID uuid, PhysicalSwitch pSwitch) {
     }
 
     public void putPhysicalSwitch(UUID uuid, PhysicalSwitch pSwitch) {
@@ -131,20 +132,19 @@ public class HwvtepDeviceInfo {
         return physicalSwitches;
     }
 
         return physicalSwitches;
     }
 
-    public void putPhysicalLocator(UUID uuid, PhysicalLocator pLocator) {
-        physicalLocators.put(uuid, pLocator);
-    }
-
     public PhysicalLocator getPhysicalLocator(UUID uuid) {
     public PhysicalLocator getPhysicalLocator(UUID uuid) {
-        return physicalLocators.get(uuid);
-    }
-
-    public PhysicalLocator removePhysicalLocator(UUID uuid) {
-        return physicalLocators.remove(uuid);
+        return (PhysicalLocator) getDeviceOpData(TerminationPoint.class, uuid);
     }
 
     public Map<UUID, PhysicalLocator> getPhysicalLocators() {
     }
 
     public Map<UUID, PhysicalLocator> getPhysicalLocators() {
-        return physicalLocators;
+        Map<UUID, Object> locators = uuidVsData.get(LogicalSwitches.class);
+        Map<UUID, PhysicalLocator> result = new HashMap<>();
+        if (locators != null) {
+            for (Map.Entry<UUID, Object> entry : locators.entrySet()) {
+                result.put(entry.getKey(), (PhysicalLocator) entry.getValue());
+            }
+        }
+        return result;
     }
 
     public void putPhysicalSwitchForTunnel(UUID uuid, UUID psUUID) {
     }
 
     public void putPhysicalSwitchForTunnel(UUID uuid, UUID psUUID) {
index a8adf4cf4e483666147cd71b7f550d0d779ee335..38379f54fb5d3632322cab09dc36b3abb99a30cf 100644 (file)
@@ -7,22 +7,19 @@
  */
 package org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.configuration;
 
  */
 package org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.configuration;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
-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.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionManager;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionManager;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
-import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationManager;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationTask;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.HwvtepOperationalState;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.TransactCommandAggregator;
 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationManager;
 import org.opendaylight.ovsdb.hwvtepsouthbound.reconciliation.ReconciliationTask;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.HwvtepOperationalState;
 import org.opendaylight.ovsdb.hwvtepsouthbound.transact.TransactCommandAggregator;
 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
+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.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.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;
@@ -30,7 +27,6 @@ import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.concurrent.ExecutionException;
 
 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
 
 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
@@ -79,6 +75,18 @@ public class HwvtepReconciliationTask extends ReconciliationTask {
         change = SwitchConfigOperationalChangeGetter.getModification(psNodeIid, psConfigNode, psNode);
         changes.add(change);
 
         change = SwitchConfigOperationalChangeGetter.getModification(psNodeIid, psConfigNode, psNode);
         changes.add(change);
 
+        if (globalConfigNode != null) {
+            HwvtepGlobalAugmentation augmentation = globalConfigNode.getAugmentation(HwvtepGlobalAugmentation.class);
+            if (augmentation != null) {
+                if (augmentation.getLogicalSwitches() != null) {
+                    for (LogicalSwitches logicalSwitches : augmentation.getLogicalSwitches()) {
+                        connectionInstance.getDeviceInfo().updateConfigData(LogicalSwitches.class,
+                                nodeId.augmentation(HwvtepGlobalAugmentation.class).child(LogicalSwitches.class,
+                                        logicalSwitches.getKey()), logicalSwitches);
+                    }
+                }
+            }
+        }
         transactChangesToDevice(changes);
         return true;
     }
         transactChangesToDevice(changes);
         return true;
     }
index f7fa3b40bc48966913961954f985ac7710d5d8ad..c62dc862ff7fc5ff79a1036d676a06d4a7c2ca37 100644 (file)
@@ -8,6 +8,10 @@
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
 
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
 
+import java.util.Collection;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
 import org.opendaylight.ovsdb.lib.notation.UUID;
@@ -17,9 +21,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 import org.opendaylight.yangtools.yang.binding.Identifiable;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import java.util.Collection;
-import java.util.Map;
-
 public abstract class AbstractTransactCommand<T extends Identifiable> implements TransactCommand<T> {
 
     private HwvtepOperationalState operationalState;
 public abstract class AbstractTransactCommand<T extends Identifiable> implements TransactCommand<T> {
 
     private HwvtepOperationalState operationalState;
@@ -42,6 +43,12 @@ public abstract class AbstractTransactCommand<T extends Identifiable> implements
         return changes;
     }
 
         return changes;
     }
 
+    void updateCurrentTxDeleteData(InstanceIdentifier key, T data) {
+        Class<? extends Identifiable> cls = data.getClass();
+        operationalState.updateCurrentTxDeleteData(cls, key);
+        operationalState.getDeviceInfo().clearConfigData(cls, key);
+    }
+
     void updateCurrentTxData(Class<? extends Identifiable> cls, InstanceIdentifier key, UUID uuid, Object data) {
         operationalState.updateCurrentTxData(cls, key, uuid);
         operationalState.getDeviceInfo().markKeyAsInTransit(cls, key);
     void updateCurrentTxData(Class<? extends Identifiable> cls, InstanceIdentifier key, UUID uuid, Object data) {
         operationalState.updateCurrentTxData(cls, key, uuid);
         operationalState.getDeviceInfo().markKeyAsInTransit(cls, key);
@@ -52,7 +59,7 @@ public abstract class AbstractTransactCommand<T extends Identifiable> implements
                              TransactionBuilder transaction,
                              final InstanceIdentifier<Node> nodeIid,
                              final InstanceIdentifier key,
                              TransactionBuilder transaction,
                              final InstanceIdentifier<Node> nodeIid,
                              final InstanceIdentifier key,
-                             final T data) {
+                             final T data, final Object... extraData) {
 
         HwvtepDeviceInfo deviceInfo = operationalState.getDeviceInfo();
         Map inTransitDependencies = unMetDependencyGetter.getInTransitDependencies(operationalState, data);
 
         HwvtepDeviceInfo deviceInfo = operationalState.getDeviceInfo();
         Map inTransitDependencies = unMetDependencyGetter.getInTransitDependencies(operationalState, data);
@@ -60,8 +67,15 @@ public abstract class AbstractTransactCommand<T extends Identifiable> implements
         //we can skip the config termination point dependency as we can create them in device as part of this tx
         confingDependencies.remove(TerminationPoint.class);
 
         //we can skip the config termination point dependency as we can create them in device as part of this tx
         confingDependencies.remove(TerminationPoint.class);
 
+        //If this key itself is in transit wait for the response of this key itself
+        if (deviceInfo.isKeyInTransit(data.getClass(), key)) {
+            inTransitDependencies.put(data.getClass(), Lists.newArrayList(key));
+        }
+
         if (confingDependencies.isEmpty() && inTransitDependencies.isEmpty()) {
         if (confingDependencies.isEmpty() && inTransitDependencies.isEmpty()) {
-            doDeviceTransaction(transaction, nodeIid, data);
+            doDeviceTransaction(transaction, nodeIid, data, key, extraData);
+            //TODO put proper uuid
+            updateCurrentTxData(data.getClass(), key, new UUID("uuid"), data);
         }
         if (!confingDependencies.isEmpty()) {
             DependentJob<T> configWaitingJob = new DependentJob.ConfigWaitingJob(
         }
         if (!confingDependencies.isEmpty()) {
             DependentJob<T> configWaitingJob = new DependentJob.ConfigWaitingJob(
@@ -71,12 +85,13 @@ public abstract class AbstractTransactCommand<T extends Identifiable> implements
                 public void onDependencyResolved(HwvtepOperationalState operationalState,
                                                  TransactionBuilder transactionBuilder) {
                     AbstractTransactCommand.this.operationalState = operationalState;
                 public void onDependencyResolved(HwvtepOperationalState operationalState,
                                                  TransactionBuilder transactionBuilder) {
                     AbstractTransactCommand.this.operationalState = operationalState;
-                    onConfigUpdate(transactionBuilder, nodeIid, data);
+                    onConfigUpdate(transactionBuilder, nodeIid, data, key, extraData);
                 }
             };
             deviceInfo.addJobToQueue(configWaitingJob);
         }
         if (inTransitDependencies.size() > 0) {
                 }
             };
             deviceInfo.addJobToQueue(configWaitingJob);
         }
         if (inTransitDependencies.size() > 0) {
+
             DependentJob<T> opWaitingJob = new DependentJob.OpWaitingJob(
                     key, data, inTransitDependencies) {
 
             DependentJob<T> opWaitingJob = new DependentJob.OpWaitingJob(
                     key, data, inTransitDependencies) {
 
@@ -84,18 +99,20 @@ public abstract class AbstractTransactCommand<T extends Identifiable> implements
                 public void onDependencyResolved(HwvtepOperationalState operationalState,
                                                  TransactionBuilder transactionBuilder) {
                     AbstractTransactCommand.this.operationalState = operationalState;
                 public void onDependencyResolved(HwvtepOperationalState operationalState,
                                                  TransactionBuilder transactionBuilder) {
                     AbstractTransactCommand.this.operationalState = operationalState;
-                    onConfigUpdate(transactionBuilder, nodeIid, data);
+                    onConfigUpdate(transactionBuilder, nodeIid, data, key, extraData);
                 }
             };
             deviceInfo.addJobToQueue(opWaitingJob);
         }
     }
 
                 }
             };
             deviceInfo.addJobToQueue(opWaitingJob);
         }
     }
 
-    public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data) {
+    public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data,
+                                    InstanceIdentifier key, Object... extraData) {
         //tobe removed as part of refactoring patch
     }
 
         //tobe removed as part of refactoring patch
     }
 
-    public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data) {
+    public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data,
+                               InstanceIdentifier key, Object... extraData) {
         //tobe removed as part of refactoring patch
     }
 }
         //tobe removed as part of refactoring patch
     }
 }
index 314ab56d31c15c10bcb1a9b8dbc3c3d0971d8a6a..0b1b2eff77a77e15c85a0b11224327cfccfe6be1 100644 (file)
@@ -97,12 +97,12 @@ public class DependencyQueue {
 
                         @Override
                         public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier nodeIid,
 
                         @Override
                         public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier nodeIid,
-                                                   Identifiable data) {
+                                                   Identifiable data, InstanceIdentifier key, Object... extraData) {
                         }
 
                         @Override
                         public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier nodeIid,
                         }
 
                         @Override
                         public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier nodeIid,
-                                                        Identifiable data) {
+                                                        Identifiable data, InstanceIdentifier key, Object... extraData) {
                         }
                     });
                 }
                         }
                     });
                 }
index 8790a8380b15bd959e0c3ca31f919bad99aaee59..6c84cc794a4934fd0aaacbaf4ad71c591b3cf710 100644 (file)
@@ -47,6 +47,13 @@ public class LogicalSwitchRemoveCommand extends AbstractTransactCommand {
         if (!removeds.isEmpty()) {
             for (Entry<InstanceIdentifier<Node>, List<LogicalSwitches>> created:
                 removeds.entrySet()) {
         if (!removeds.isEmpty()) {
             for (Entry<InstanceIdentifier<Node>, List<LogicalSwitches>> created:
                 removeds.entrySet()) {
+                if (created.getValue() != null) {
+                    for (LogicalSwitches lswitch : created.getValue()) {
+                        InstanceIdentifier<LogicalSwitches> lsKey = created.getKey().augmentation(
+                                HwvtepGlobalAugmentation.class).child(LogicalSwitches.class, lswitch.getKey());
+                        updateCurrentTxDeleteData(lsKey, lswitch);
+                    }
+                }
                 removeLogicalSwitch(transaction,  created.getKey(), created.getValue());
             }
         }
                 removeLogicalSwitch(transaction,  created.getKey(), created.getValue());
             }
         }
@@ -109,7 +116,8 @@ public class LogicalSwitchRemoveCommand extends AbstractTransactCommand {
                     if (lswitchListBefore != null) {
                         List<LogicalSwitches> lswitchListRemoved = new ArrayList<LogicalSwitches>();
                         if (lswitchListUpdated != null) {
                     if (lswitchListBefore != null) {
                         List<LogicalSwitches> lswitchListRemoved = new ArrayList<LogicalSwitches>();
                         if (lswitchListUpdated != null) {
-                            lswitchListBefore.removeAll(lswitchListUpdated);
+                            lswitchListBefore = new ArrayList<>(lswitchListBefore);
+                            lswitchListBefore.removeAll(lswitchListUpdated);//operate on copy as it has side effect on LogicalSwitchUpdateCommand
                         }
                         //then exclude updated ones
                         if (lswitchListUpdated != null) {
                         }
                         //then exclude updated ones
                         if (lswitchListUpdated != null) {
index 4745f5e5f5a3e9c57b656165217c427471bfb8a3..6ccb81b7a189080588c47483b4ade10338d09f38 100644 (file)
@@ -73,6 +73,9 @@ public class McastMacsRemoteRemoveCommand extends AbstractTransactCommand {
                 LOG.warn("Unable to delete remoteMcastMacs {} because it was not found in the operational store",
                         mac.getMacEntryKey().getValue());
             }
                 LOG.warn("Unable to delete remoteMcastMacs {} because it was not found in the operational store",
                         mac.getMacEntryKey().getValue());
             }
+            InstanceIdentifier<RemoteMcastMacs> macIid = instanceIdentifier.augmentation(HwvtepGlobalAugmentation.class).
+                    child(RemoteMcastMacs.class, mac.getKey());
+            updateCurrentTxDeleteData(macIid, mac);
         }
     }
 
         }
     }
 
@@ -113,6 +116,7 @@ public class McastMacsRemoteRemoveCommand extends AbstractTransactCommand {
                     if (macListBefore != null) {
                         List<RemoteMcastMacs> macListRemoved = new ArrayList<RemoteMcastMacs>();
                         if (macListUpdated != null) {
                     if (macListBefore != null) {
                         List<RemoteMcastMacs> macListRemoved = new ArrayList<RemoteMcastMacs>();
                         if (macListUpdated != null) {
+                            macListBefore = new ArrayList<>(macListBefore);
                             macListBefore.removeAll(macListUpdated);
                         }
                         //then exclude updated remoteMcastMacs
                             macListBefore.removeAll(macListUpdated);
                         }
                         //then exclude updated remoteMcastMacs
index f29ccfb845332bab46097e4e2391729e6a6d8245..30e40ad66197c6ef42d77758dac29d7a5381afa0 100644 (file)
@@ -38,7 +38,7 @@ import java.util.Map.Entry;
 
 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
 
 
 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
 
-public class McastMacsRemoteUpdateCommand extends AbstractTransactCommand {
+public class McastMacsRemoteUpdateCommand extends AbstractTransactCommand<RemoteMcastMacs> {
     private static final Logger LOG = LoggerFactory.getLogger(McastMacsRemoteUpdateCommand.class);
     private static final McastMacUnMetDependencyGetter MCAST_MAC_DATA_VALIDATOR = new McastMacUnMetDependencyGetter();
 
     private static final Logger LOG = LoggerFactory.getLogger(McastMacsRemoteUpdateCommand.class);
     private static final McastMacUnMetDependencyGetter MCAST_MAC_DATA_VALIDATOR = new McastMacUnMetDependencyGetter();
 
@@ -70,6 +70,27 @@ public class McastMacsRemoteUpdateCommand extends AbstractTransactCommand {
     private void updateMcastMacRemote(TransactionBuilder transaction,
             InstanceIdentifier<Node> instanceIdentifier, List<RemoteMcastMacs> macList) {
         for (RemoteMcastMacs mac: macList) {
     private void updateMcastMacRemote(TransactionBuilder transaction,
             InstanceIdentifier<Node> instanceIdentifier, List<RemoteMcastMacs> macList) {
         for (RemoteMcastMacs mac: macList) {
+            onConfigUpdate(transaction, instanceIdentifier, mac, null);
+        }
+    }
+
+    @Override
+    public void onConfigUpdate(TransactionBuilder transaction,
+                                  InstanceIdentifier<Node> nodeIid,
+                                  RemoteMcastMacs remoteMcastMac,
+                                  InstanceIdentifier macKey,
+                                  Object... extraData) {
+        InstanceIdentifier<RemoteMcastMacs> macIid = nodeIid.augmentation(HwvtepGlobalAugmentation.class).
+                child(RemoteMcastMacs.class, remoteMcastMac.getKey());
+        processDependencies(MCAST_MAC_DATA_VALIDATOR, transaction, nodeIid, macIid, remoteMcastMac);
+    }
+
+    @Override
+    public void doDeviceTransaction(TransactionBuilder transaction,
+                                       InstanceIdentifier<Node> instanceIdentifier,
+                                       RemoteMcastMacs mac,
+                                       InstanceIdentifier macKey,
+                                       Object... extraData) {
             LOG.debug("Creating remoteMcastMacs, mac address: {}", mac.getMacEntryKey().getValue());
             Optional<RemoteMcastMacs> operationalMacOptional =
                     getOperationalState().getRemoteMcastMacs(instanceIdentifier, mac.getKey());
             LOG.debug("Creating remoteMcastMacs, mac address: {}", mac.getMacEntryKey().getValue());
             Optional<RemoteMcastMacs> operationalMacOptional =
                     getOperationalState().getRemoteMcastMacs(instanceIdentifier, mac.getKey());
@@ -96,7 +117,6 @@ public class McastMacsRemoteUpdateCommand extends AbstractTransactCommand {
                 LOG.warn("Unable to update remoteMcastMacs {} because uuid not found in the operational store",
                                 mac.getMacEntryKey().getValue());
             }
                 LOG.warn("Unable to update remoteMcastMacs {} because uuid not found in the operational store",
                                 mac.getMacEntryKey().getValue());
             }
-        }
     }
 
     private void setLogicalSwitch(McastMacsRemote mcastMacsRemote, RemoteMcastMacs inputMac) {
     }
 
     private void setLogicalSwitch(McastMacsRemote mcastMacsRemote, RemoteMcastMacs inputMac) {
index 8a7771606d1da860a2f5e49f66feda754302401d..65e9be6e95b476157c23577efbb768ae0edb84db 100644 (file)
@@ -17,7 +17,9 @@ public interface TransactCommand<T extends Identifiable> {
 
     void execute(TransactionBuilder transaction);
 
 
     void execute(TransactionBuilder transaction);
 
-    void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data);
+    void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data,
+                        InstanceIdentifier key, Object... extraData);
 
 
-    void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data);
+    void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier<Node> nodeIid, T data,
+                             InstanceIdentifier key, Object... extraData);
 }
 }
index 5d894fa8ba391c8003726b968671cd59652a6dc1..b9b6b012196e5dde482ba6960e74c13e0fd1dd3d 100644 (file)
@@ -49,10 +49,14 @@ public class TransactCommandAggregator implements TransactCommand {
     }
 
     @Override
     }
 
     @Override
-    public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier nodeIid, Identifiable data) {
+    public void onConfigUpdate(TransactionBuilder transaction, InstanceIdentifier nodeIid, Identifiable data,
+                               InstanceIdentifier key,
+                               Object... extraData) {
     }
 
     @Override
     }
 
     @Override
-    public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier nodeIid, Identifiable data) {
+    public void doDeviceTransaction(TransactionBuilder transaction, InstanceIdentifier nodeIid, Identifiable data,
+                                    InstanceIdentifier key,
+                                    Object... extraData) {
     }
 }
     }
 }
index fb478e6835680118de5f643d56f5e264a6d70a85..16ca422a637448c0eb99290cf2c15c95af6c8bf1 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsRemote;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
 import org.opendaylight.ovsdb.schema.hardwarevtep.UcastMacsRemote;
 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.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.yangtools.yang.binding.InstanceIdentifier;
 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.yangtools.yang.binding.InstanceIdentifier;
@@ -72,6 +73,9 @@ public class UcastMacsRemoteRemoveCommand extends AbstractTransactCommand {
                 LOG.warn("Unable to delete remoteUcastMacs {} because it was not found in the operational store",
                         mac.getMacEntryKey().getValue());
             }
                 LOG.warn("Unable to delete remoteUcastMacs {} because it was not found in the operational store",
                         mac.getMacEntryKey().getValue());
             }
+            InstanceIdentifier<RemoteUcastMacs> macIid = instanceIdentifier.augmentation(HwvtepGlobalAugmentation.class).
+                    child(RemoteUcastMacs.class, mac.getKey());
+            updateCurrentTxDeleteData(macIid, mac);
         }
     }
 
         }
     }
 
index e26ec486bac9b8401bca4663c68c1e9c88936387..378fa2e9b14c0105f7b135cfa3c2aa40dd9b57e4 100644 (file)
@@ -72,24 +72,27 @@ public class UcastMacsRemoteUpdateCommand extends AbstractTransactCommand<Remote
             return;
         }
         for (RemoteUcastMacs remoteUcastMac : remoteUcastMacs) {
             return;
         }
         for (RemoteUcastMacs remoteUcastMac : remoteUcastMacs) {
-            onConfigUpdate(transaction, instanceIdentifier, remoteUcastMac);
+            onConfigUpdate(transaction, instanceIdentifier, remoteUcastMac, null);
         }
     }
 
     @Override
     public void onConfigUpdate(TransactionBuilder transaction,
                                   InstanceIdentifier<Node> nodeIid,
         }
     }
 
     @Override
     public void onConfigUpdate(TransactionBuilder transaction,
                                   InstanceIdentifier<Node> nodeIid,
-                                  RemoteUcastMacs remoteUcastMacs) {
+                                  RemoteUcastMacs remoteUcastMacs,
+                                  InstanceIdentifier macKey,
+                                  Object... extraData) {
         InstanceIdentifier<RemoteUcastMacs> macIid = nodeIid.augmentation(HwvtepGlobalAugmentation.class).
                 child(RemoteUcastMacs.class, remoteUcastMacs.getKey());
         InstanceIdentifier<RemoteUcastMacs> macIid = nodeIid.augmentation(HwvtepGlobalAugmentation.class).
                 child(RemoteUcastMacs.class, remoteUcastMacs.getKey());
-        //TODO uncommet in next commit
-        //processDependencies(UCAST_MAC_DATA_VALIDATOR, transaction, nodeIid, macIid, remoteUcastMacs);
-        doDeviceTransaction(transaction, nodeIid, remoteUcastMacs);
+        processDependencies(UCAST_MAC_DATA_VALIDATOR, transaction, nodeIid, macIid, remoteUcastMacs);
     }
 
     @Override
     public void doDeviceTransaction(TransactionBuilder transaction,
     }
 
     @Override
     public void doDeviceTransaction(TransactionBuilder transaction,
-                                       InstanceIdentifier<Node> instanceIdentifier, RemoteUcastMacs remoteUcastMac) {
+                                   InstanceIdentifier<Node> instanceIdentifier,
+                                   RemoteUcastMacs remoteUcastMac,
+                                   InstanceIdentifier macKey,
+                                   Object... extraData) {
             LOG.debug("Creating remoteUcastMacs, mac address: {}", remoteUcastMac.getMacEntryKey().getValue());
             Optional<RemoteUcastMacs> operationalMacOptional =
                     getOperationalState().getRemoteUcastMacs(instanceIdentifier, remoteUcastMac.getKey());
             LOG.debug("Creating remoteUcastMacs, mac address: {}", remoteUcastMac.getMacEntryKey().getValue());
             Optional<RemoteUcastMacs> operationalMacOptional =
                     getOperationalState().getRemoteUcastMacs(instanceIdentifier, remoteUcastMac.getKey());
index 35eccb3fee053c342e550e4c70201cb4b6821276..c6d7e4bf5df098472f56365b69b71dd04e3bf87b 100644 (file)
@@ -12,8 +12,9 @@ import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ConnectionInfo;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 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;
 
 
-public abstract class AbstractTransactionCommand implements TransactionCommand{
+public abstract class AbstractTransactionCommand<T extends DataObject> implements TransactionCommand{
 
     private TableUpdates updates;
     private DatabaseSchema dbSchema;
 
     private TableUpdates updates;
     private DatabaseSchema dbSchema;
index bd55bcc070f3768df8812c78a4defef3c3dba354..877fdb750cbaf4b87df4a479283917ee6d0d8123 100644 (file)
@@ -23,7 +23,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.global.attributes.LogicalSwitchesKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitchesKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-public class HwvtepLogicalSwitchRemoveCommand extends AbstractTransactionCommand {
+public class HwvtepLogicalSwitchRemoveCommand extends AbstractTransactionCommand<LogicalSwitches> {
 
     public HwvtepLogicalSwitchRemoveCommand(HwvtepConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
 
     public HwvtepLogicalSwitchRemoveCommand(HwvtepConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
@@ -39,7 +39,7 @@ public class HwvtepLogicalSwitchRemoveCommand extends AbstractTransactionCommand
                     .child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName(lSwitch.getName())));
             // TODO Delete any references
             transaction.delete(LogicalDatastoreType.OPERATIONAL, switchIid);
                     .child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName(lSwitch.getName())));
             // TODO Delete any references
             transaction.delete(LogicalDatastoreType.OPERATIONAL, switchIid);
-            getOvsdbConnectionInstance().getDeviceInfo().removeLogicalSwitch(lSwitch.getUuid());
+            getOvsdbConnectionInstance().getDeviceInfo().clearDeviceOpData(LogicalSwitches.class, switchIid);
         }
     }
 
         }
     }
 
index 99f17abf3629e90ddd58ff358bc8e38fb05eca01..3b467c6fd0c16e08adbf97c92fb3e5a79131bae4 100644 (file)
@@ -57,7 +57,11 @@ public class HwvtepLogicalSwitchUpdateCommand extends AbstractTransactionCommand
         if (connection.isPresent()) {
             Node connectionNode = buildConnectionNode(lSwitch);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
         if (connection.isPresent()) {
             Node connectionNode = buildConnectionNode(lSwitch);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
-            getOvsdbConnectionInstance().getDeviceInfo().putLogicalSwitch(lSwitch.getUuid(), lSwitch);
+            InstanceIdentifier<LogicalSwitches> switchIid = getOvsdbConnectionInstance().getInstanceIdentifier()
+                    .augmentation(HwvtepGlobalAugmentation.class)
+                    .child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName(lSwitch.getName())));
+            getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, switchIid,
+                    lSwitch.getUuid(), lSwitch);
             // TODO: Delete entries that are no longer needed
         }
     }
             // TODO: Delete entries that are no longer needed
         }
     }
index 583207876c3625f6d8d9f065f9e6c2b69fa888b9..3bee2c2dfd524c172447a58cc8b92782120b10d4 100644 (file)
@@ -84,6 +84,7 @@ public class HwvtepMacEntriesRemoveCommand extends AbstractTransactionCommand {
                                     new RemoteUcastMacsKey(getLogicalSwitchRef(rum.getLogicalSwitchColumn().getData()),
                                                     getMacAddress(rum.getMac())));
                 transaction.delete(LogicalDatastoreType.OPERATIONAL, rumId);
                                     new RemoteUcastMacsKey(getLogicalSwitchRef(rum.getLogicalSwitchColumn().getData()),
                                                     getMacAddress(rum.getMac())));
                 transaction.delete(LogicalDatastoreType.OPERATIONAL, rumId);
+                getOvsdbConnectionInstance().getDeviceInfo().clearDeviceOpData(RemoteMcastMacs.class, rumId);
             } else {
                 LOG.debug("Failed to delete UcastMacRemote entry {}", rum.getUuid());
             }
             } else {
                 LOG.debug("Failed to delete UcastMacRemote entry {}", rum.getUuid());
             }
@@ -120,6 +121,7 @@ public class HwvtepMacEntriesRemoveCommand extends AbstractTransactionCommand {
                                     new RemoteMcastMacsKey(getLogicalSwitchRef(rmm.getLogicalSwitchColumn().getData()),
                                                     getMacAddress(rmm.getMac())));
                 transaction.delete(LogicalDatastoreType.OPERATIONAL, lumId);
                                     new RemoteMcastMacsKey(getLogicalSwitchRef(rmm.getLogicalSwitchColumn().getData()),
                                                     getMacAddress(rmm.getMac())));
                 transaction.delete(LogicalDatastoreType.OPERATIONAL, lumId);
+                getOvsdbConnectionInstance().getDeviceInfo().clearDeviceOpData(RemoteMcastMacs.class, lumId);
             } else {
                 LOG.debug("Failed to delete McastMacRemote entry {}", rmm.getUuid());
             }
             } else {
                 LOG.debug("Failed to delete McastMacRemote entry {}", rmm.getUuid());
             }
index b4ed00cbdb7d76d15d89518132e73bc2a9c39b1f..ec13f52530d47dd43f6bbb5421f14155095f5948 100644 (file)
@@ -39,6 +39,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.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.RemoteMcastMacsBuilder;
 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.RemoteMcastMacsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSetBuilder;
 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.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.locator.set.attributes.LocatorSetBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
@@ -73,10 +74,21 @@ public class HwvtepMcastMacsRemoteUpdateCommand extends AbstractTransactionComma
             // Update the connection node to let it know it manages this MCastMacsRemote
             Node connectionNode = buildConnectionNode(mMacRemote);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
             // Update the connection node to let it know it manages this MCastMacsRemote
             Node connectionNode = buildConnectionNode(mMacRemote);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
+            InstanceIdentifier<RemoteMcastMacs> macIid = getMacIid(connectionIId, connectionNode);
+            getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOpData(RemoteMcastMacs.class,
+                    macIid, mMacRemote.getUuid(), mMacRemote);
             // TODO: Delete entries that are no longer needed
         }
     }
 
             // TODO: Delete entries that are no longer needed
         }
     }
 
+    InstanceIdentifier<RemoteMcastMacs> getMacIid(InstanceIdentifier<Node> connectionIId, Node connectionNode) {
+        RemoteMcastMacsKey macsKey =
+                connectionNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteMcastMacs().get(0).getKey();
+        InstanceIdentifier<RemoteMcastMacs> key = connectionIId.augmentation(HwvtepGlobalAugmentation.class).
+                child(RemoteMcastMacs.class, macsKey);
+        return key;
+    }
+
     private Node buildConnectionNode(McastMacsRemote mMacRemote) {
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
     private Node buildConnectionNode(McastMacsRemote mMacRemote) {
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
index 78872c8d45ea2c9f6d60b5aac961b7e89625b38c..cb9499c4fb6e768bcc1632ad03eef277e3e550c0 100644 (file)
@@ -37,7 +37,8 @@ public class HwvtepPhysicalLocatorRemoveCommand extends AbstractTransactionComma
             final InstanceIdentifier<TerminationPoint> nodePath = HwvtepSouthboundMapper
                     .createInstanceIdentifier(connectionIId, pLoc);
             transaction.delete(LogicalDatastoreType.OPERATIONAL, nodePath);
             final InstanceIdentifier<TerminationPoint> nodePath = HwvtepSouthboundMapper
                     .createInstanceIdentifier(connectionIId, pLoc);
             transaction.delete(LogicalDatastoreType.OPERATIONAL, nodePath);
-            getOvsdbConnectionInstance().getDeviceInfo().removePhysicalLocator(pLoc.getUuid());
+            getOvsdbConnectionInstance().getDeviceInfo().clearDeviceOpData(TerminationPoint.class, nodePath);
+
             //TODO: Check if any cleanup is required
         }
     }
             //TODO: Check if any cleanup is required
         }
     }
index 01690ab9c06e9b2b0242bb9c6ddf1c450a460dbc..13b25e37a67531aeb1ca4d0d0c0fc9e2e855b512 100644 (file)
@@ -8,9 +8,7 @@
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
-import java.util.Map;
-import java.util.Map.Entry;
-
+import com.google.common.base.Optional;
 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.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
@@ -31,7 +29,8 @@ 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.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 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 com.google.common.base.Optional;
+import java.util.Map;
+import java.util.Map.Entry;
 
 public class HwvtepPhysicalLocatorUpdateCommand extends AbstractTransactionCommand {
 
 
 public class HwvtepPhysicalLocatorUpdateCommand extends AbstractTransactionCommand {
 
@@ -79,7 +78,8 @@ public class HwvtepPhysicalLocatorUpdateCommand extends AbstractTransactionComma
                 } else {
                     transaction.put(LogicalDatastoreType.OPERATIONAL,
                             tpPath, tpBuilder.build());
                 } else {
                     transaction.put(LogicalDatastoreType.OPERATIONAL,
                             tpPath, tpBuilder.build());
-                    getOvsdbConnectionInstance().getDeviceInfo().putPhysicalLocator(pLoc.getUuid(), pLoc);
+                    getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOpData(
+                            TerminationPoint.class, tpPath, pLoc.getUuid(), pLoc);
                 }
             }
         }
                 }
             }
         }
index 131fa1062c99632f52fa65c3e2f4260e744639e9..30a0129f667919889b3c0174bf3b7976d11f0722 100644 (file)
@@ -8,10 +8,7 @@
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
 
 package org.opendaylight.ovsdb.hwvtepsouthbound.transactions.md;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.base.Optional;
 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.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
@@ -34,12 +31,15 @@ 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.global.attributes.LogicalSwitches;
 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.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsBuilder;
 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.RemoteUcastMacs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsKey;
 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.NodeBuilder;
 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.InstanceIdentifier;
 
 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.NodeBuilder;
 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.InstanceIdentifier;
 
-import com.google.common.base.Optional;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionCommand {
 
 
 public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionCommand {
 
@@ -65,10 +65,22 @@ public class HwvtepUcastMacsRemoteUpdateCommand extends AbstractTransactionComma
         if (connection.isPresent()) {
             Node connectionNode = buildConnectionNode(ucastMacsRemote);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
         if (connection.isPresent()) {
             Node connectionNode = buildConnectionNode(ucastMacsRemote);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
+            InstanceIdentifier<RemoteUcastMacs> macIid = getMacIid(connectionIId, connectionNode);
+            getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOpData(RemoteUcastMacs.class, macIid,
+                    ucastMacsRemote.getUuid(), ucastMacsRemote);
             //TODO: Handle any deletes
         }
     }
 
             //TODO: Handle any deletes
         }
     }
 
+
+    InstanceIdentifier<RemoteUcastMacs> getMacIid(InstanceIdentifier<Node> connectionIId, Node connectionNode) {
+        RemoteUcastMacsKey macsKey =
+                connectionNode.getAugmentation(HwvtepGlobalAugmentation.class).getRemoteUcastMacs().get(0).getKey();
+        InstanceIdentifier<RemoteUcastMacs> key = connectionIId.augmentation(HwvtepGlobalAugmentation.class).
+                child(RemoteUcastMacs.class, macsKey);
+        return key;
+    }
+
     private Node buildConnectionNode(UcastMacsRemote uMacRemote) {
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
     private Node buildConnectionNode(UcastMacsRemote uMacRemote) {
         NodeBuilder connectionNode = new NodeBuilder();
         connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
index 5996bcb244ed954718ab3c5a0cefd9aebaf75ee2..79ba56f70e711e351a72fb744da214c2e0a1a937 100644 (file)
@@ -34,8 +34,10 @@ import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
 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;
 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;
+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.HwvtepPhysicalSwitchAttributes;
 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.HwvtepPhysicalSwitchAttributes;
 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.LogicalSwitchesKey;
 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.NetworkTopology;
 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.NetworkTopology;
@@ -49,7 +51,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.powermock.api.mockito.PowerMockito;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.powermock.api.mockito.PowerMockito;
-import org.powermock.api.support.membermodification.MemberMatcher;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -89,6 +90,8 @@ public class DataChangeListenerTestBase extends AbstractDataBrokerTest {
 
     String nodeUuid;
     InstanceIdentifier<Node> nodeIid;
 
     String nodeUuid;
     InstanceIdentifier<Node> nodeIid;
+    InstanceIdentifier<LogicalSwitches> ls0Iid;
+    InstanceIdentifier<LogicalSwitches> ls1Iid;
 
     @Before
     public void setupTest() throws Exception {
 
     @Before
     public void setupTest() throws Exception {
@@ -103,6 +106,10 @@ public class DataChangeListenerTestBase extends AbstractDataBrokerTest {
         entityOwnershipService = mock(EntityOwnershipService.class);
         nodeUuid = java.util.UUID.randomUUID().toString();
         nodeIid = createInstanceIdentifier(nodeUuid);
         entityOwnershipService = mock(EntityOwnershipService.class);
         nodeUuid = java.util.UUID.randomUUID().toString();
         nodeIid = createInstanceIdentifier(nodeUuid);
+        ls0Iid = nodeIid.augmentation(HwvtepGlobalAugmentation.class).
+                child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName("ls0")));
+        ls1Iid = nodeIid.augmentation(HwvtepGlobalAugmentation.class).
+                child(LogicalSwitches.class, new LogicalSwitchesKey(new HwvtepNodeName("ls1")));
         loadSchema();
         mockConnectionInstance();
         mockConnectionManager();
         loadSchema();
         mockConnectionInstance();
         mockConnectionManager();
index 4517c84203fea8d111a48fb277890a9bbffb2b06..1b787c785bd4c53f2d63d9e16dab0212470fe4f4 100644 (file)
@@ -12,6 +12,7 @@ import com.google.common.collect.Lists;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Matchers;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Matchers;
+import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.operations.Operations;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
 import org.opendaylight.ovsdb.lib.operations.Operations;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
 import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
@@ -72,6 +73,7 @@ public class HwvtepDataChangeListenerTest extends DataChangeListenerTestBase {
             {"FF:FF:FF:FF:FF:FF", "ls1", "192.168.122.10", "192.168.122.30"}
     };
 
             {"FF:FF:FF:FF:FF:FF", "ls1", "192.168.122.10", "192.168.122.30"}
     };
 
+
     @Test
     public <T extends DataObject> void testLogicalSwitchAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
     @Test
     public <T extends DataObject> void testLogicalSwitchAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
@@ -82,6 +84,8 @@ public class HwvtepDataChangeListenerTest extends DataChangeListenerTestBase {
     public <T extends DataObject> void testUcastMacAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
     public <T extends DataObject> void testUcastMacAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls0Iid, new UUID("ls0"), "ls0");
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls1Iid, new UUID("ls1"), "ls1");
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteUcastMacs.class, ucastMacs);
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteUcastMacs.class, ucastMacs);
@@ -94,6 +98,8 @@ public class HwvtepDataChangeListenerTest extends DataChangeListenerTestBase {
     public <T extends DataObject> void testMcastMacAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
     public <T extends DataObject> void testMcastMacAdd() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls0Iid, new UUID("ls0"), "ls0");
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls1Iid, new UUID("ls1"), "ls0");
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteMcastMacs.class, mcastMacs);
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteMcastMacs.class, mcastMacs);
@@ -105,6 +111,8 @@ public class HwvtepDataChangeListenerTest extends DataChangeListenerTestBase {
     public <T extends DataObject> void testAddMacs() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
     public <T extends DataObject> void testAddMacs() throws Exception {
         addData(CONFIGURATION, LogicalSwitches.class, logicalSwitches);
         addData(OPERATIONAL, LogicalSwitches.class, logicalSwitches);
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls0Iid, new UUID("ls0"), "ls0");
+        connectionInstance.getDeviceInfo().updateDeviceOpData(LogicalSwitches.class, ls1Iid, new UUID("ls1"), "ls0");
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteUcastMacs.class, ucastMacs);
         resetOperations();
         addData(CONFIGURATION, TerminationPoint.class, terminationPoints);
         addData(CONFIGURATION, RemoteUcastMacs.class, ucastMacs);