Fix so that operational store correctly removes bridge-external-ids 55/18155/5
authorEd Warnicke <eaw@cisco.com>
Sat, 11 Apr 2015 23:33:31 +0000 (16:33 -0700)
committerEd Warnicke <eaw@cisco.com>
Mon, 13 Apr 2015 17:38:30 +0000 (17:38 +0000)
Before, if a bridge-external-ids entry was removed on ovsdb, we didn't
remove it from the operational store.

This is an artifact of using *merge* rather than *put*.
Using merge is *still* a good idea for us, but what was happening
was basically this.

Say we got a report in the operational store of

[bridge-external-ids1, bridge-external-ids2]

which we dutifully merged.

Then we got a report of
[bridge-external-ids2]

when that is *merged*... the protocol1 entry is left dangling,
because its a *merge*.  To compensate, we have to be *very*
specific about wanting to remove bridge-external-ids1.

Change-Id: I7bb7e3264176604f3a01f90231cae99026148f2f
Signed-off-by: Ed Warnicke <eaw@cisco.com>
southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/OvsdbBridgeUpdateCommand.java

index 1a8866cb3f5ce650d7b14ce64da7c1eae2465300..8fa3f4f4f0e5caa7c8efac1cdee10c3ea5169911 100644 (file)
@@ -29,6 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeExternalIds;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeExternalIdsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeExternalIdsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry;
@@ -81,6 +82,7 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
             Node bridgeNode = buildBridgeNode(bridge);
             transaction.merge(LogicalDatastoreType.OPERATIONAL, bridgeIid, bridgeNode);
             deleteEntries(transaction, protocolEntriesToRemove(bridgeIid,bridge));
+            deleteEntries(transaction, externalIdsToRemove(bridgeIid,bridge));
         }
     }
 
@@ -91,6 +93,30 @@ public class OvsdbBridgeUpdateCommand extends AbstractTransactionCommand {
         }
     }
 
+    private List<InstanceIdentifier<BridgeExternalIds>> externalIdsToRemove(
+            InstanceIdentifier<Node> bridgeIid, Bridge bridge) {
+        Preconditions.checkNotNull(bridgeIid);
+        Preconditions.checkNotNull(bridge);
+        List<InstanceIdentifier<BridgeExternalIds>> result =
+                new ArrayList<InstanceIdentifier<BridgeExternalIds>>();
+
+        Bridge oldBridge = oldBridgeRows.get(bridge.getUuid());
+
+        if (oldBridge != null && oldBridge.getExternalIdsColumn() != null) {
+            for (Entry<String, String> externalId:
+                oldBridge.getExternalIdsColumn().getData().entrySet()) {
+                if (bridge.getExternalIdsColumn() == null
+                        || !bridge.getExternalIdsColumn().getData().containsKey(externalId.getKey())) {
+                    InstanceIdentifier<BridgeExternalIds> iid = bridgeIid
+                            .augmentation(OvsdbBridgeAugmentation.class)
+                            .child(BridgeExternalIds.class,
+                                    new BridgeExternalIdsKey(externalId.getKey()));
+                    result.add(iid);
+                }
+            }
+        }
+        return result;
+    }
 
     private List<InstanceIdentifier<ProtocolEntry>> protocolEntriesToRemove(
             InstanceIdentifier<Node> bridgeIid, Bridge bridge) {