Remove leftover data after updating EVC 95/33795/1
authoradetalhouet <adetalhouet@inocybe.com>
Fri, 29 Jan 2016 18:18:14 +0000 (13:18 -0500)
committerAlexis de Talhouët <adetalhouet@inocybe.com>
Fri, 29 Jan 2016 19:33:32 +0000 (19:33 +0000)
Change-Id: I91b43663674cbeaaf8d4181bdccc072242a703ed
Signed-off-by: adetalhouet <adetalhouet@inocybe.com>
(cherry picked from commit 1bb6a16f670453684a27d5947f16e4a7a81d98ab)

impl/src/main/java/org/opendaylight/unimgr/command/EvcDeleteCommand.java
impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java
impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java

index 5968b7d22257f965f7d467406dd6241d3661909c..5d0ba4dc20a728c9a618bacde3326ef14ac00c68 100644 (file)
@@ -13,28 +13,18 @@ import java.util.Set;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.unimgr.impl.UnimgrConstants;
-import org.opendaylight.unimgr.impl.UnimgrMapper;
 import org.opendaylight.unimgr.impl.UnimgrUtils;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.EvcAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniDest;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSource;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
 
 public class EvcDeleteCommand extends AbstractDeleteCommand {
 
-    private static final Logger LOG = LoggerFactory.getLogger(EvcDeleteCommand.class);
-
     public EvcDeleteCommand(DataBroker dataBroker,
             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
         super.changes = changes;
@@ -60,7 +50,7 @@ public class EvcDeleteCommand extends AbstractDeleteCommand {
                                                    UnimgrUtils.readNode(dataBroker,
                                                                         LogicalDatastoreType.OPERATIONAL,
                                                                         source.getUni());
-                                deleteEvcData(optionalSourceUniNode);
+                                UnimgrUtils.deleteEvcData(dataBroker, optionalSourceUniNode);
                             }
                         }
                     }
@@ -71,7 +61,7 @@ public class EvcDeleteCommand extends AbstractDeleteCommand {
                                                    UnimgrUtils.readNode(dataBroker,
                                                                         LogicalDatastoreType.OPERATIONAL,
                                                                         dest.getUni());
-                                deleteEvcData(optionalDestUniNode);
+                                UnimgrUtils.deleteEvcData(dataBroker, optionalDestUniNode);
                             }
                         }
                     }
@@ -80,44 +70,4 @@ public class EvcDeleteCommand extends AbstractDeleteCommand {
             }
         }
     }
-
-    private void deleteEvcData(Optional<Node> optionalUni) {
-        if (optionalUni.isPresent()) {
-            UniAugmentation uniAugmentation =
-                                optionalUni
-                                    .get()
-                                    .getAugmentation(UniAugmentation.class);
-            InstanceIdentifier<Node> ovsdbNodeIid =
-                                              uniAugmentation
-                                             .getOvsdbNodeRef()
-                                             .getValue()
-                                             .firstIdentifierOf(Node.class);
-            Optional<Node> optionalOvsdNode =
-                    UnimgrUtils.readNode(dataBroker,
-                                         LogicalDatastoreType.OPERATIONAL,
-                                         ovsdbNodeIid);
-            if (optionalOvsdNode.isPresent()) {
-                Node ovsdbNode = optionalOvsdNode.get();
-                OvsdbNodeAugmentation ovsdbNodeAugmentation = ovsdbNode.getAugmentation(OvsdbNodeAugmentation.class);
-                for (ManagedNodeEntry managedNodeEntry: ovsdbNodeAugmentation.getManagedNodeEntry()) {
-                    InstanceIdentifier<Node> bridgeIid = managedNodeEntry
-                                                             .getBridgeRef()
-                                                             .getValue()
-                                                             .firstIdentifierOf(Node.class);
-                    Optional<Node> optBridgeNode = UnimgrUtils.readNode(dataBroker, bridgeIid);
-                    if (optBridgeNode.isPresent()) {
-                        Node bridgeNode = optBridgeNode.get();
-                        InstanceIdentifier<TerminationPoint> iidGreTermPoint = UnimgrMapper.getTerminationPointIid(bridgeNode,
-                                                                                        UnimgrConstants.DEFAULT_GRE_TUNNEL_NAME);
-                        InstanceIdentifier<TerminationPoint> iidEthTermPoint = UnimgrMapper.getTerminationPointIid(bridgeNode,
-                                                                                        UnimgrConstants.DEFAULT_TUNNEL_IFACE);
-                        UnimgrUtils.deleteNode(dataBroker, iidGreTermPoint, LogicalDatastoreType.CONFIGURATION);
-                        UnimgrUtils.deleteNode(dataBroker, iidEthTermPoint, LogicalDatastoreType.CONFIGURATION);
-                    }
-                }
-            }
-        } else {
-            LOG.info("Unable to retrieve UNI from the EVC.");
-        }
-    }
 }
index feaa021c6236856e25c4f628fb2fc7cbbf13a1d0..34dd437fa38578cea7c8bbf9d11c5aceaf34dcf9 100644 (file)
@@ -9,12 +9,17 @@ package org.opendaylight.unimgr.command;
 
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.ExecutionException;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.unimgr.impl.UnimgrConstants;
 import org.opendaylight.unimgr.impl.UnimgrMapper;
 import org.opendaylight.unimgr.impl.UnimgrUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.EvcAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
@@ -24,6 +29,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
 
 public class EvcUpdateCommand extends AbstractUpdateCommand {
 
@@ -37,10 +43,10 @@ public class EvcUpdateCommand extends AbstractUpdateCommand {
 
     @Override
     public void execute() {
-        for (final Entry<InstanceIdentifier<?>, DataObject> created : changes.entrySet()) {
-            if (created.getValue() != null && created.getValue() instanceof EvcAugmentation) {
-                final EvcAugmentation evc = (EvcAugmentation) created.getValue();
-                final InstanceIdentifier<?> evcKey = created.getKey();
+        for (final Entry<InstanceIdentifier<?>, DataObject> updated : changes.entrySet()) {
+            if (updated.getValue() != null && updated.getValue() instanceof EvcAugmentation) {
+                final EvcAugmentation evc = (EvcAugmentation) updated.getValue();
+                final InstanceIdentifier<?> evcKey = updated.getKey();
 
                 // FIXME: For now, we assume that there is 1 uni per
                 // source/destination
@@ -52,9 +58,44 @@ public class EvcUpdateCommand extends AbstractUpdateCommand {
                     LOG.error("Source UNI cannot be null.");
                     break;
                 }
-                LOG.trace("New EVC created, source IP: {} destination IP {}.",
-                        evc.getUniSource().iterator().next().getIpAddress().getIpv4Address(),
-                        evc.getUniDest().iterator().next().getIpAddress().getIpv4Address());
+
+                final Ipv4Address laterUni1Ip = evc.getUniSource().iterator().next().getIpAddress().getIpv4Address();
+                final Ipv4Address laterUni2Ip = evc.getUniDest().iterator().next().getIpAddress().getIpv4Address();
+                LOG.trace("New EVC created, source IP: {} destination IP {}.", laterUni1Ip, laterUni2Ip);
+
+
+                final ReadTransaction readTransac = dataBroker.newReadOnlyTransaction();
+                final CheckedFuture<?, ReadFailedException> retFormerEvc = readTransac.read(LogicalDatastoreType.OPERATIONAL, evcKey);
+                EvcAugmentation formerEvc;
+                try {
+                    formerEvc = (EvcAugmentation) ((Optional<EvcAugmentation>) retFormerEvc.checkedGet()).get();
+                    final Ipv4Address formerUni1ip = formerEvc.getUniDest().iterator().next().getIpAddress().getIpv4Address();
+                    final Ipv4Address formerUni2ip = formerEvc.getUniDest().iterator().next().getIpAddress().getIpv4Address();
+
+                    if (formerUni1ip.equals(laterUni1Ip)) {
+                        // do nothing
+                    } else if (formerUni1ip.equals(laterUni2Ip)) {
+                        // do nothing
+                    } else {
+                        LOG.info("{} is not part of the EVC, removing configuration", formerUni1ip);
+                        final InstanceIdentifier<?> formerUniIID = UnimgrMapper.getUniIid(dataBroker, new IpAddress(formerUni1ip), LogicalDatastoreType.OPERATIONAL);
+                        final Optional<Node> formerUni = UnimgrUtils.readNode(dataBroker, LogicalDatastoreType.OPERATIONAL, formerUniIID);
+                        UnimgrUtils.deleteEvcData(dataBroker, formerUni);
+                    }
+                    if (formerUni2ip.equals(laterUni1Ip)) {
+                        // do nothing
+                    } else if (formerUni2ip.equals(laterUni2Ip)) {
+                        // do nothing
+                    } else {
+                        LOG.info("{} is not part of the EVC, removing configuration", formerUni1ip);
+                        final InstanceIdentifier<?> formerUniIID = UnimgrMapper.getUniIid(dataBroker, new IpAddress(formerUni1ip), LogicalDatastoreType.OPERATIONAL);
+                        final Optional<Node> formerUni = UnimgrUtils.readNode(dataBroker, LogicalDatastoreType.OPERATIONAL, formerUniIID);
+                        UnimgrUtils.deleteEvcData(dataBroker, formerUni);
+                        }
+                } catch (ReadFailedException e) {
+                    LOG.error("Failed to retrieve former EVC {}", evcKey, e);
+                }
+
                 InstanceIdentifier<Node> sourceUniIid;
                 InstanceIdentifier<Node> destinationUniIid;
 
index 6124e7fe415aba370cb4f31c8e17f331be183ceb..9ef3737f2793eb1bce8c388bb35c3d47dab1d1e9 100644 (file)
@@ -50,6 +50,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.ovsdb.bridge.attributes.ProtocolEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.QosEntriesKey;
@@ -79,11 +80,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSource;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSourceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniSourceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.Speed;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed100M;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed10G;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed10M;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.speed.Speed1G;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.service.speed.Speed;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -811,6 +812,46 @@ public class UnimgrUtils {
         return result;
     }
 
+    public static void deleteEvcData(DataBroker dataBroker, Optional<Node> optionalUni) {
+        if (optionalUni.isPresent()) {
+            UniAugmentation uniAugmentation =
+                                optionalUni
+                                    .get()
+                                    .getAugmentation(UniAugmentation.class);
+            InstanceIdentifier<Node> ovsdbNodeIid =
+                                              uniAugmentation
+                                             .getOvsdbNodeRef()
+                                             .getValue()
+                                             .firstIdentifierOf(Node.class);
+            Optional<Node> optionalOvsdNode =
+                    UnimgrUtils.readNode(dataBroker,
+                                         LogicalDatastoreType.OPERATIONAL,
+                                         ovsdbNodeIid);
+            if (optionalOvsdNode.isPresent()) {
+                Node ovsdbNode = optionalOvsdNode.get();
+                OvsdbNodeAugmentation ovsdbNodeAugmentation = ovsdbNode.getAugmentation(OvsdbNodeAugmentation.class);
+                for (ManagedNodeEntry managedNodeEntry: ovsdbNodeAugmentation.getManagedNodeEntry()) {
+                    InstanceIdentifier<Node> bridgeIid = managedNodeEntry
+                                                             .getBridgeRef()
+                                                             .getValue()
+                                                             .firstIdentifierOf(Node.class);
+                    Optional<Node> optBridgeNode = UnimgrUtils.readNode(dataBroker, bridgeIid);
+                    if (optBridgeNode.isPresent()) {
+                        Node bridgeNode = optBridgeNode.get();
+                        InstanceIdentifier<TerminationPoint> iidGreTermPoint = UnimgrMapper.getTerminationPointIid(bridgeNode,
+                                                                                        UnimgrConstants.DEFAULT_GRE_TUNNEL_NAME);
+                        InstanceIdentifier<TerminationPoint> iidEthTermPoint = UnimgrMapper.getTerminationPointIid(bridgeNode,
+                                                                                        UnimgrConstants.DEFAULT_TUNNEL_IFACE);
+                        UnimgrUtils.deleteNode(dataBroker, iidGreTermPoint, LogicalDatastoreType.CONFIGURATION);
+                        UnimgrUtils.deleteNode(dataBroker, iidEthTermPoint, LogicalDatastoreType.CONFIGURATION);
+                    }
+                }
+            }
+        } else {
+            LOG.info("Unable to retrieve UNI from the EVC.");
+        }
+    }
+
     /**
      * Deletes a termination Point from the configuration data store.
      * @param dataBroker The instance of the data broker to create transactions