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 258d3d62720838bb3314ca176dfc4c43ea8f3b33..38337de16c86130ae5cc8cc57c6a06496b96bd3e 100644 (file)
@@ -12,13 +12,12 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
 
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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.HwvtepSouthboundMapper;
+import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
 import org.opendaylight.ovsdb.lib.message.TableUpdates;
 import org.opendaylight.ovsdb.lib.notation.UUID;
 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
@@ -26,23 +25,25 @@ 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.PhysicalSwitchAugmentation;
+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;
 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;
 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;
@@ -57,164 +58,168 @@ public class PhysicalPortUpdateCommand extends AbstractTransactionCommand {
     private Map<UUID, PhysicalSwitch> switchUpdatedRows;
     private Map<UUID, LogicalSwitch> lSwitchUpdatedRows;
 
-    public PhysicalPortUpdateCommand(HwvtepConnectionInstance key, TableUpdates updates,
-            DatabaseSchema dbSchema) {
+    public PhysicalPortUpdateCommand(HwvtepConnectionInstance key, TableUpdates updates, DatabaseSchema dbSchema) {
         super(key, updates, dbSchema);
-        updatedPPRows = TyperUtils.extractRowsUpdated(PhysicalPort.class, getUpdates(),getDbSchema());
-        oldPPRows = TyperUtils.extractRowsOld(PhysicalPort.class, getUpdates(),getDbSchema());
-        switchUpdatedRows = TyperUtils.extractRowsUpdated(PhysicalSwitch.class, getUpdates(),getDbSchema());
-        lSwitchUpdatedRows = TyperUtils.extractRowsUpdated(LogicalSwitch.class, getUpdates(),getDbSchema());
+        updatedPPRows = TyperUtils.extractRowsUpdated(PhysicalPort.class, getUpdates(), getDbSchema());
+        oldPPRows = TyperUtils.extractRowsOld(PhysicalPort.class, getUpdates(), getDbSchema());
+        switchUpdatedRows = TyperUtils.extractRowsUpdated(PhysicalSwitch.class, getUpdates(), getDbSchema());
+        lSwitchUpdatedRows = TyperUtils.extractRowsUpdated(LogicalSwitch.class, getUpdates(), getDbSchema());
     }
 
     @Override
     public void execute(ReadWriteTransaction transaction) {
         final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
-        if ( updatedPPRows == null
-                || updatedPPRows.isEmpty()) {
+        if (updatedPPRows.isEmpty()) {
             return;
         }
         LOG.trace("PhysicalPortTable updated: {}", updatedPPRows);
-        Optional<Node> node = readNode(transaction, connectionIId);
+        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
         }
     }
 
     private void updateTerminationPoints(ReadWriteTransaction transaction, Node node) {
-        for (Entry<UUID, PhysicalPort> pPortUpdate : updatedPPRows.entrySet()) {
-            String portName = null;
-            portName = pPortUpdate.getValue().getNameColumn().getData();
-            Optional<InstanceIdentifier<Node>> switchIid = getTerminationPointSwitch(pPortUpdate.getKey());
+        for (Entry<UUID, PhysicalPort> pPortUpdateEntry : updatedPPRows.entrySet()) {
+            PhysicalPort pPortUpdate = pPortUpdateEntry.getValue();
+            String portName = pPortUpdate.getNameColumn().getData();
+            Optional<InstanceIdentifier<Node>> switchIid = getTerminationPointSwitch(pPortUpdateEntry.getKey());
             if (!switchIid.isPresent()) {
-                switchIid = getTerminationPointSwitch( transaction, node, portName);
+                switchIid = getTerminationPointSwitch(transaction, node, portName);
             }
             if (switchIid.isPresent()) {
-                NodeId switchId = HwvtepSouthboundMapper.createManagedNodeId(switchIid.get());
                 TerminationPointKey tpKey = new TerminationPointKey(new TpId(portName));
                 TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
                 tpBuilder.setKey(tpKey);
                 tpBuilder.setTpId(tpKey.getTpId());
-                InstanceIdentifier<TerminationPoint> tpPath =
-                        getInstanceIdentifier(switchIid.get(), pPortUpdate.getValue());
+                InstanceIdentifier<TerminationPoint> tpPath = getInstanceIdentifier(switchIid.get(), pPortUpdate);
                 HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder =
                         new HwvtepPhysicalPortAugmentationBuilder();
-                buildTerminationPoint(tpAugmentationBuilder,pPortUpdate.getValue());
+                buildTerminationPoint(tpAugmentationBuilder, pPortUpdate);
                 tpBuilder.addAugmentation(HwvtepPhysicalPortAugmentation.class, tpAugmentationBuilder.build());
-                if (oldPPRows.containsKey(pPortUpdate.getKey())) {
-                    transaction.merge(LogicalDatastoreType.OPERATIONAL,
-                            tpPath, tpBuilder.build());
+                if (oldPPRows.containsKey(pPortUpdateEntry.getKey())) {
+                    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 <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) {
+            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) {
+            HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
         tpAugmentationBuilder.setHwvtepNodeName(new HwvtepNodeName(portUpdate.getName()));
-        if(portUpdate.getDescription() != null) {
+        if (portUpdate.getDescription() != null) {
             tpAugmentationBuilder.setHwvtepNodeDescription(portUpdate.getDescription());
         }
     }
 
     private void updateVlanBindings(PhysicalPort portUpdate,
-                    HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
+            HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder) {
         Map<Long, UUID> vlanBindings = portUpdate.getVlanBindingsColumn().getData();
-        if(vlanBindings != null && !vlanBindings.isEmpty()) {
-            Set<Long> vlanBindingsKeys = vlanBindings.keySet();
+        if (vlanBindings != null && !vlanBindings.isEmpty()) {
             List<VlanBindings> vlanBindingsList = new ArrayList<>();
-            UUID vlanBindingValue = null;
-            for(Long vlanBindingKey: vlanBindingsKeys) {
-                vlanBindingValue = vlanBindings.get(vlanBindingKey);
-                if(vlanBindingValue != null && vlanBindingKey != null) {
-                    vlanBindingsList.add(createVlanBinding(portUpdate, vlanBindingKey, vlanBindingValue));
+            for (Map.Entry<Long, UUID> vlanBindingEntry : vlanBindings.entrySet()) {
+                Long vlanBindingKey = vlanBindingEntry.getKey();
+                UUID vlanBindingValue = vlanBindingEntry.getValue();
+                if (vlanBindingValue != null && vlanBindingKey != null) {
+                    vlanBindingsList.add(createVlanBinding(vlanBindingKey, vlanBindingValue));
                 }
             }
             tpAugmentationBuilder.setVlanBindings(vlanBindingsList);
         }
     }
 
-    private VlanBindings createVlanBinding(PhysicalPort portUpdate, Long key, UUID value) {
+    private VlanBindings createVlanBinding(Long key, UUID value) {
         VlanBindingsBuilder vbBuilder = new VlanBindingsBuilder();
         VlanBindingsKey vbKey = new VlanBindingsKey(new VlanId(key.intValue()));
         vbBuilder.setKey(vbKey);
         vbBuilder.setVlanIdKey(vbKey.getVlanIdKey());
-        HwvtepLogicalSwitchRef lSwitchRef = this.getLogicalSwitchRef(value, portUpdate.getUuid());
+        HwvtepLogicalSwitchRef lSwitchRef = this.getLogicalSwitchRef(value);
         vbBuilder.setLogicalSwitchRef(lSwitchRef);
         return vbBuilder.build();
     }
 
-    private HwvtepLogicalSwitchRef getLogicalSwitchRef( UUID switchUUID, UUID portUUID) {
-            if (lSwitchUpdatedRows.get(switchUUID) != null) {
-                Optional<InstanceIdentifier<Node>> optSwitchIid = Optional.of(HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(),
-                        this.lSwitchUpdatedRows.get(switchUUID)));
-                if(optSwitchIid.isPresent()) {
-                    return new HwvtepLogicalSwitchRef(optSwitchIid.get());
-                }
-            }
+    private HwvtepLogicalSwitchRef getLogicalSwitchRef(UUID switchUUID) {
+        LogicalSwitch logicalSwitch = lSwitchUpdatedRows.get(switchUUID);
+        if (logicalSwitch != null) {
+            InstanceIdentifier<LogicalSwitches> lSwitchIid =
+                    HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(), logicalSwitch);
+            return new HwvtepLogicalSwitchRef(lSwitchIid);
+        }
         return null;
     }
 
-    private Optional<InstanceIdentifier<Node>> getTerminationPointSwitch( UUID portUUID) {
-        for (UUID switchUUID : this.switchUpdatedRows.keySet()) {
-            if (this.switchUpdatedRows.get(switchUUID).getPortsColumn().getData().contains(portUUID)) {
+    private Optional<InstanceIdentifier<Node>> getTerminationPointSwitch(UUID portUUID) {
+        for (PhysicalSwitch updatedPhysicalSwitch : switchUpdatedRows.values()) {
+            if (updatedPhysicalSwitch.getPortsColumn().getData().contains(portUUID)) {
                 return Optional.of(HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(),
-                        this.switchUpdatedRows.get(switchUUID)));
+                        updatedPhysicalSwitch));
             }
         }
         return Optional.absent();
     }
 
-    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 = readNode(transaction,
-                            (InstanceIdentifier<Node>)managedNodeEntry.getSwitchRef().getValue()).get();
-                    TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
-                    TerminationPointKey tpKey = new TerminationPointKey(new TpId(tpName));
-                    tpBuilder.setKey(tpKey);
-                    if (switchNode.getTerminationPoint() != null
-                            && switchNode.getTerminationPoint().contains(tpBuilder.build())) {
-                        PhysicalSwitchAugmentation pSwitchAugment
-                            = switchNode.getAugmentation(PhysicalSwitchAugmentation.class);
-                        return Optional.of((InstanceIdentifier<Node>)managedNodeEntry.getSwitchRef().getValue());
-                    }
-                }
-                return Optional.absent();
+    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();
+            TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
+            TerminationPointKey tpKey = new TerminationPointKey(new TpId(tpName));
+            tpBuilder.setKey(tpKey);
+            if (switchNode.getTerminationPoint() != null
+                    && switchNode.getTerminationPoint().contains(tpBuilder.build())) {
+                return Optional.of((InstanceIdentifier<Node>) managedNodeEntry.getSwitchRef().getValue());
             }
-
-    private Optional<Node> readNode(final ReadWriteTransaction transaction, final InstanceIdentifier<Node> nodePath) {
-        Optional<Node> node = Optional.absent();
-        try {
-            node = transaction.read(
-                    LogicalDatastoreType.OPERATIONAL, nodePath)
-                    .checkedGet();
-        } catch (final ReadFailedException e) {
-            LOG.warn("Read Operational/DS for Node fail! {}",
-                    nodePath, e);
         }
-        return node;
+        return Optional.absent();
     }
 
     private InstanceIdentifier<TerminationPoint> getInstanceIdentifier(InstanceIdentifier<Node> switchIid,
-                    PhysicalPort pPort) {
+            PhysicalPort pPort) {
         return switchIid.child(TerminationPoint.class, new TerminationPointKey(new TpId(pPort.getName())));
     }