Change logical-switch-ref to iid in hwvtep.yang
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / main / java / org / opendaylight / ovsdb / hwvtepsouthbound / transactions / md / PhysicalPortUpdateCommand.java
index bed07a670715698ad559abe87e756cb820a375af..38337de16c86130ae5cc8cc57c6a06496b96bd3e 100644 (file)
@@ -25,12 +25,14 @@ 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.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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
 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.HwvtepPhysicalPortAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder;
+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.Switches;
 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;
@@ -41,6 +43,7 @@ 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.TerminationPointBuilder;
 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.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,7 +76,7 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
         Optional<Node> node = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
         if (node.isPresent()) {
             updateTerminationPoints(transaction, node.get());
-            //TODO: Handle Deletion of VLAN Bindings
+            // TODO: Handle Deletion of VLAN Bindings
         }
     }
 
@@ -96,37 +99,62 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
                 buildTerminationPoint(tpAugmentationBuilder, pPortUpdate);
                 tpBuilder.addAugmentation(HwvtepPhysicalPortAugmentation.class, tpAugmentationBuilder.build());
                 if (oldPPRows.containsKey(pPortUpdateEntry.getKey())) {
-                    transaction.merge(LogicalDatastoreType.OPERATIONAL,
-                            tpPath, tpBuilder.build());
+                    transaction.merge(LogicalDatastoreType.OPERATIONAL, tpPath, tpBuilder.build());
                 } else {
-                    transaction.put(LogicalDatastoreType.OPERATIONAL,
-                            tpPath, tpBuilder.build());
+                    transaction.put(LogicalDatastoreType.OPERATIONAL, tpPath, tpBuilder.build());
+                }
+                // Update with Deleted VlanBindings
+                if (oldPPRows.get(pPortUpdateEntry.getKey()) != null) {
+                    List<InstanceIdentifier<VlanBindings>> vBIiList = new ArrayList<>();
+                    Map<Long, UUID> oldVb = oldPPRows.get(pPortUpdateEntry.getKey()).getVlanBindingsColumn().getData();
+                    Map<Long, UUID> updatedVb = pPortUpdateEntry.getValue().getVlanBindingsColumn().getData();
+                    for (Map.Entry<Long, UUID> oldVbEntry : oldVb.entrySet()) {
+                        Long key = oldVbEntry.getKey();
+                        if (!updatedVb.containsKey(key)) {
+                            VlanBindings vBindings = createVlanBinding(key, oldVbEntry.getValue());
+                            InstanceIdentifier<VlanBindings> vBid = getInstanceIdentifier(tpPath, vBindings);
+                            vBIiList.add(vBid);
+                        }
+                        deleteEntries(transaction, vBIiList);
+                    }
                 }
             }
         }
     }
 
-    private void buildTerminationPoint(
-            HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder, PhysicalPort portUpdate) {
+    private <T extends DataObject> void deleteEntries(ReadWriteTransaction transaction,
+            List<InstanceIdentifier<T>> entryIids) {
+        for (InstanceIdentifier<T> entryIid : entryIids) {
+            transaction.delete(LogicalDatastoreType.OPERATIONAL, entryIid);
+        }
+    }
+
+    private InstanceIdentifier<VlanBindings> getInstanceIdentifier(InstanceIdentifier<TerminationPoint> tpPath,
+            VlanBindings vBindings) {
+        return HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(), tpPath, vBindings);
+    }
+
+    private void buildTerminationPoint(HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder,
+            PhysicalPort portUpdate) {
         updatePhysicalPortId(portUpdate, tpAugmentationBuilder);
         updatePort(portUpdate, tpAugmentationBuilder);
     }
 
-    private void updatePort(
-            PhysicalPort portUpdate, HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
+    private void updatePort(PhysicalPort portUpdate, HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
         updateVlanBindings(portUpdate, tpAugmentationBuilder);
+        tpAugmentationBuilder.setPhysicalPortUuid(new Uuid(portUpdate.getUuid().toString()));
     }
 
-    private void updatePhysicalPortId(
-            PhysicalPort portUpdate, HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
+    private void updatePhysicalPortId(PhysicalPort portUpdate,
+            HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
         tpAugmentationBuilder.setHwvtepNodeName(new HwvtepNodeName(portUpdate.getName()));
         if (portUpdate.getDescription() != null) {
             tpAugmentationBuilder.setHwvtepNodeDescription(portUpdate.getDescription());
         }
     }
 
-    private void updateVlanBindings(
-            PhysicalPort portUpdate, HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
+    private void updateVlanBindings(PhysicalPort portUpdate,
+            HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
         Map<Long, UUID> vlanBindings = portUpdate.getVlanBindingsColumn().getData();
         if (vlanBindings != null && !vlanBindings.isEmpty()) {
             List<VlanBindings> vlanBindingsList = new ArrayList<>();
@@ -152,8 +180,11 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
     }
 
     private HwvtepLogicalSwitchRef getLogicalSwitchRef(UUID switchUUID) {
-        if (lSwitchUpdatedRows.get(switchUUID) != null) {
-            return new HwvtepLogicalSwitchRef(lSwitchUpdatedRows.get(switchUUID).getName());
+        LogicalSwitch logicalSwitch = lSwitchUpdatedRows.get(switchUUID);
+        if (logicalSwitch != null) {
+            InstanceIdentifier<LogicalSwitches> lSwitchIid =
+                    HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(), logicalSwitch);
+            return new HwvtepLogicalSwitchRef(lSwitchIid);
         }
         return null;
     }
@@ -168,14 +199,14 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
         return Optional.absent();
     }
 
-    private Optional<InstanceIdentifier<Node>> getTerminationPointSwitch(
-            final ReadWriteTransaction transaction, Node node, String tpName) {
+    private Optional<InstanceIdentifier<Node>> getTerminationPointSwitch(final ReadWriteTransaction transaction,
+            Node node, String tpName) {
         HwvtepGlobalAugmentation hwvtepNode = node.getAugmentation(HwvtepGlobalAugmentation.class);
         List<Switches> switchNodes = hwvtepNode.getSwitches();
         for (Switches managedNodeEntry : switchNodes) {
             @SuppressWarnings("unchecked")
-            Node switchNode = HwvtepSouthboundUtil.readNode(transaction,
-                    (InstanceIdentifier<Node>) managedNodeEntry.getSwitchRef().getValue()).get();
+            Node switchNode = HwvtepSouthboundUtil
+                    .readNode(transaction, (InstanceIdentifier<Node>) managedNodeEntry.getSwitchRef().getValue()).get();
             TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
             TerminationPointKey tpKey = new TerminationPointKey(new TpId(tpName));
             tpBuilder.setKey(tpKey);