Implemented EVC delete 26/29426/1
authorgrmontpetit <grmontpetit@inocybe.com>
Mon, 9 Nov 2015 05:23:39 +0000 (00:23 -0500)
committergrmontpetit <grmontpetit@inocybe.com>
Mon, 9 Nov 2015 05:23:39 +0000 (00:23 -0500)
Change-Id: Iaf1cdf4547925eb9903a1c79ecf2995d95323c0c
Signed-off-by: grmontpetit <grmontpetit@inocybe.com>
impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java
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/UnimgrMapper.java
impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java

index c5bf7ea5192b83160b66054ce98cd5c4615aa53a..5827d2403254308bf212c1f26b89d6c22997cc4f 100644 (file)
@@ -40,6 +40,7 @@ public class EvcCreateCommand extends AbstractCreateCommand {
         for (Entry<InstanceIdentifier<?>, DataObject> created : changes.entrySet()) {
             if (created.getValue() != null && created.getValue() instanceof EvcAugmentation) {
                 EvcAugmentation evc = (EvcAugmentation) created.getValue();
+                InstanceIdentifier<?> evcKey = created.getKey();
                 LOG.trace("New EVC created, source IP: {} destination IP {}.",
                         evc.getUniSource().iterator().next().getIpAddress().getIpv4Address(),
                         evc.getUniDest().iterator().next().getIpAddress().getIpv4Address());
@@ -69,10 +70,10 @@ public class EvcCreateCommand extends AbstractCreateCommand {
                                                                LogicalDatastoreType.OPERATIONAL);
                 }
                 Optional<Node> optionalUniSource = UnimgrUtils.readNode(dataBroker,
-                                                                        LogicalDatastoreType.CONFIGURATION,
+                                                                        LogicalDatastoreType.OPERATIONAL,
                                                                         sourceUniIid);
                 Optional<Node> optionalUniDestination = UnimgrUtils.readNode(dataBroker,
-                                                                             LogicalDatastoreType.CONFIGURATION,
+                                                                             LogicalDatastoreType.OPERATIONAL,
                                                                              destinationUniIid);
                 Node uniSource;
                 Node uniDestination;
@@ -136,6 +137,18 @@ public class EvcCreateCommand extends AbstractCreateCommand {
                                                         uniSource.getAugmentation(UniAugmentation.class), destinationBr,
                                                         UnimgrConstants.DEFAULT_BRIDGE_NAME,
                                                         "gre0");
+                            UnimgrUtils.updateEvcNode(LogicalDatastoreType.CONFIGURATION,
+                                                      evcKey,
+                                                      evc,
+                                                      sourceUniIid,
+                                                      destinationUniIid,
+                                                      dataBroker);
+                            UnimgrUtils.updateEvcNode(LogicalDatastoreType.OPERATIONAL,
+                                                      evcKey,
+                                                      evc,
+                                                      sourceUniIid,
+                                                      destinationUniIid,
+                                                      dataBroker);
                         } else {
                             LOG.info("Unable to retrieve the source and/or destination bridge.");
                         }
index 3a862e3e04bf755b7eef75d285db4e0d25855983..84661b27f203e3aef6b624be83a1992842c9d3ab 100644 (file)
@@ -7,33 +7,25 @@
  */
 package org.opendaylight.unimgr.command;
 
-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.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-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.unimgr.rev151012.Evc;
-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.NetworkTopology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+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.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.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;
-import com.google.common.util.concurrent.CheckedFuture;
 
 public class EvcDeleteCommand extends AbstractDeleteCommand {
 
@@ -47,74 +39,104 @@ public class EvcDeleteCommand extends AbstractDeleteCommand {
 
     @Override
     public void execute() {
-        Map<InstanceIdentifier<Evc>, Evc> originalEvcs = UnimgrUtils.extractOriginal(changes, Evc.class);
-        //Set<InstanceIdentifier<Evc>> removedEvcs = UnimgrUtils.extractRemoved(changes, Evc.class);
-
-        Set<InstanceIdentifier<?>> removedPaths = changes.getRemovedPaths();
-        if (!removedPaths.isEmpty()) {
-            for (InstanceIdentifier<?> removedPath: removedPaths) {
-                Class<?> type = removedPath.getTargetType();
-                LOG.trace("Removed paths instance identifier {}", type);
-                if (type.equals(Evc.class)) {
-                    LOG.info("Removed paths instance identifier {}", type);
-                    for (Entry<InstanceIdentifier<Evc>, Evc> evc: originalEvcs.entrySet()) {
-                        if (evc.getKey().equals(type)) {
-                            Evc data = evc.getValue();
-                            List<UniSource> uniSourceLst = data.getUniSource();
-                            for (UniSource uniSource : uniSourceLst) {
-                                InstanceIdentifier<?> iidUni = uniSource.getUni();
-                                Optional<Node> optionalOvsdbNode =
-                                                   UnimgrUtils.readNode(dataBroker,
-                                                   LogicalDatastoreType.OPERATIONAL,
-                                                   iidUni);
-                                if (optionalOvsdbNode.isPresent()) {
-                                    Node ovsdbNode = optionalOvsdbNode.get();
-                                    List<TerminationPoint> termPointList = ovsdbNode.getTerminationPoint();
-                                    for(TerminationPoint termPoint : termPointList) {
-                                        deleteTerminationPoint(termPoint, ovsdbNode);
-                                    }
-                                }
-                            }
-                            LOG.info("Removed EVC Source {}", data.getUniSource());
-                            List<UniDest> uniDestLst = data.getUniDest();
-                            for (UniDest uniDest : uniDestLst) {
-                                InstanceIdentifier<?> iidUni = uniDest.getUni();
-                                Optional<Node> optionalOvsdbNode =
-                                                   UnimgrUtils.readNode(dataBroker,
-                                                           LogicalDatastoreType.OPERATIONAL,
-                                                           iidUni);
-                                if (optionalOvsdbNode.isPresent()) {
-                                    Node ovsdbNode = optionalOvsdbNode.get();
-                                    List<TerminationPoint> termPointList = ovsdbNode.getTerminationPoint();
-                                    for(TerminationPoint termPoint : termPointList) {
-                                        deleteTerminationPoint(termPoint, ovsdbNode);
-                                    }
-                                }
-                            }
-                            LOG.info("Removed EVC Destination {}", data.getUniDest());
+        Map<InstanceIdentifier<?>, DataObject> originalData = changes.getOriginalData();
+        Set<InstanceIdentifier<?>> removedIids = changes.getRemovedPaths();
+        for (InstanceIdentifier<?> evcIid : removedIids) {
+            DataObject removedDataObject = originalData.get(evcIid);
+            if (removedDataObject instanceof Evc) {
+                Evc evc = (Evc)removedDataObject;
+                Optional<Node> optionalSourceUniNode = UnimgrUtils.readNode(dataBroker,
+                                                                             LogicalDatastoreType.OPERATIONAL,
+                                                                             evc.getUniSource()
+                                                                                .iterator()
+                                                                                .next()
+                                                                                .getUni());
+                Optional<Node> optionalDestinationUniNode = UnimgrUtils.readNode(dataBroker,
+                                                                                   LogicalDatastoreType.OPERATIONAL,
+                                                                                   evc.getUniDest()
+                                                                                      .iterator()
+                                                                                      .next()
+                                                                                      .getUni());
+                if (optionalSourceUniNode.isPresent()
+                        && optionalDestinationUniNode.isPresent()) {
+                    Node sourceUniNode = optionalSourceUniNode.get();
+                    Node destUniNode = optionalDestinationUniNode.get();
+                    UniAugmentation sourceUniAugmentation = sourceUniNode
+                                                                .getAugmentation(UniAugmentation.class);
+                    UniAugmentation destUniAugmentation = destUniNode
+                                                              .getAugmentation(UniAugmentation.class);
+                    InstanceIdentifier<Node> sourceOvsdbIid =
+                                                 sourceUniAugmentation
+                                                     .getOvsdbNodeRef()
+                                                     .getValue()
+                                                     .firstIdentifierOf(Node.class);
+                    InstanceIdentifier<Node> destOvsdbIid =
+                                                 destUniAugmentation
+                                                     .getOvsdbNodeRef()
+                                                     .getValue()
+                                                     .firstIdentifierOf(Node.class);
+                    Optional<Node> optionalSourceOvsdNode =
+                                       UnimgrUtils.readNode(dataBroker,
+                                                            LogicalDatastoreType.OPERATIONAL,
+                                                            sourceOvsdbIid);
+                    Optional<Node> optionalDestinationOvsdbNode =
+                                       UnimgrUtils.readNode(dataBroker,
+                                                            LogicalDatastoreType.OPERATIONAL,
+                                                            destOvsdbIid);
+                    if (optionalSourceOvsdNode.isPresent()
+                            && optionalDestinationOvsdbNode.isPresent()) {
+                        Node sourceOvsdbNode = optionalSourceOvsdNode.get();
+                        Node destinationOvsdbNode = optionalDestinationOvsdbNode.get();
+                        OvsdbNodeAugmentation sourceOvsdbNodeAugmentation =
+                                                  sourceOvsdbNode.getAugmentation(OvsdbNodeAugmentation.class);
+                        OvsdbNodeAugmentation destinationOvsdbNodeAugmentation =
+                                                  destinationOvsdbNode.getAugmentation(OvsdbNodeAugmentation.class);
+                        InstanceIdentifier<Node> sourceBridgeIid =
+                                                     sourceOvsdbNodeAugmentation
+                                                         .getManagedNodeEntry()
+                                                         .iterator()
+                                                         .next()
+                                                         .getBridgeRef()
+                                                         .getValue()
+                                                         .firstIdentifierOf(Node.class);
+                        InstanceIdentifier<Node> destinationBridgeIid =
+                                                     destinationOvsdbNodeAugmentation
+                                                         .getManagedNodeEntry()
+                                                         .iterator()
+                                                         .next()
+                                                         .getBridgeRef()
+                                                         .getValue()
+                                                         .firstIdentifierOf(Node.class);
+                        Optional<Node> optionalSourceBridgeNode = UnimgrUtils.readNode(dataBroker,
+                                                                                       LogicalDatastoreType.OPERATIONAL,
+                                                                                       sourceBridgeIid);
+                        Optional<Node>  optionalDestinationBridgeNode = UnimgrUtils.readNode(dataBroker,
+                                                                                             LogicalDatastoreType.OPERATIONAL,
+                                                                                             destinationBridgeIid);
+                        if (optionalSourceBridgeNode.isPresent()
+                                && optionalDestinationBridgeNode.isPresent()) {
+                            Node sourceBridgeNode = optionalSourceBridgeNode.get();
+                            Node destinationBridgeNode = optionalSourceBridgeNode.get();
+                            TpId sourceTp = sourceBridgeNode.getTerminationPoint().iterator().next().getTpId();
+                            TpId destTp = destinationBridgeNode.getTerminationPoint().iterator().next().getTpId();
+                            InstanceIdentifier<?> sourceTpIid = UnimgrMapper.getTerminationPointIid(sourceBridgeNode,
+                                                                                                    sourceTp);
+                            InstanceIdentifier<?> destinationTpIid = UnimgrMapper.getTerminationPointIid(destinationBridgeNode,
+                                                                                                         destTp);
+                            UnimgrUtils.deleteNode(dataBroker, sourceTpIid, LogicalDatastoreType.CONFIGURATION);
+                            UnimgrUtils.deleteNode(dataBroker, destinationTpIid, LogicalDatastoreType.CONFIGURATION);
+                            UnimgrUtils.deleteNode(dataBroker, sourceTpIid, LogicalDatastoreType.OPERATIONAL);
+                            UnimgrUtils.deleteNode(dataBroker, destinationTpIid, LogicalDatastoreType.OPERATIONAL);
+                        } else {
+                            LOG.info("Unable to retrieve the Ovsdb Bridge node source and/or destination.");
                         }
+                    } else {
+                        LOG.info("Unable to retrieve the Ovsdb node source and/or destination.");
                     }
+                } else {
+                    LOG.info("Unable to retrieve the Uni source and/or destination.");
                 }
             }
         }
     }
-
-    private boolean deleteTerminationPoint(TerminationPoint termPoint, Node ovsdbNode) {
-        boolean result = false;
-        InstanceIdentifier<TerminationPoint> terminationPointPath = InstanceIdentifier
-                .create(NetworkTopology.class)
-                .child(Topology.class, new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
-                .child(Node.class,ovsdbNode.getKey())
-                .child(TerminationPoint.class, termPoint.getKey());
-        final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
-        transaction.delete(LogicalDatastoreType.OPERATIONAL, terminationPointPath);
-        CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
-        try {
-            future.checkedGet();
-            result = true;
-        } catch (TransactionCommitFailedException e) {
-            LOG.warn("Failed to delete {} ", terminationPointPath, e);
-        }
-        return result;
-    }
 }
index 7e6bbe9f4946e61684de08f906f95c97963e8913..204581f147f43d7befc04b2a6136b1bb4e1698fb 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.unimgr.command;
 import java.util.Map;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -27,7 +28,7 @@ public class EvcUpdateCommand extends AbstractUpdateCommand {
 
     @Override
     public void execute() {
-        LOG.info("Update has not been implemented yet.");
+        //TODO
     }
 
 }
index dc94694f48c6b539ab62a9198d035794239cc7be..00d95a33798ebd32aee79a2da39fb92ce50f290e 100755 (executable)
@@ -129,6 +129,21 @@ public class UnimgrMapper {
         return terminationPointPath;
     }
 
+    public static InstanceIdentifier<TerminationPoint> getTerminationPointIid(
+                                                           Node bridgeNode,
+                                                           TpId tpId) {
+        InstanceIdentifier<TerminationPoint> terminationPointPath =
+                                                 InstanceIdentifier
+                                                     .create(NetworkTopology.class)
+                                                     .child(Topology.class,
+                                                             new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
+                                                     .child(Node.class,
+                                                             bridgeNode.getKey())
+                                                     .child(TerminationPoint.class,
+                                                             new TerminationPointKey(tpId));
+        return terminationPointPath;
+    }
+
     public static InstanceIdentifier<Node> getUniIid(DataBroker dataBroker,
                                                      IpAddress ip) {
         List<Node> uniNodes = UnimgrUtils.getUniNodes(dataBroker,
index 09c49a26cce415448dab14d0d7843c94030f74f1..e03a8ad9495c2c435065dfdbe403f22f65661f5e 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
 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;
@@ -51,13 +52,25 @@ 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.port._interface.attributes.Options;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.Evc;
 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.EvcAugmentationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.Uni;
 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.UniAugmentationBuilder;
+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.UniDestBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.evc.UniDestKey;
+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.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.TpId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.LinkBuilder;
 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.NodeKey;
@@ -290,7 +303,8 @@ public class UnimgrUtils {
         InstanceIdentifier<TerminationPoint> tpIid = UnimgrMapper
                                                         .getTerminationPointIid(bridgeNode,
                                                                                 portName);
-        OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
+        OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder =
+                                                     new OvsdbTerminationPointAugmentationBuilder();
         tpAugmentationBuilder.setName(portName);
         if (type != null) {
             tpAugmentationBuilder.setInterfaceType(SouthboundConstants.OVSDB_INTERFACE_TYPE_MAP.get(type));
@@ -306,6 +320,38 @@ public class UnimgrUtils {
         transaction.submit();
     }
 
+    public static CheckedFuture<Void,
+                                TransactionCommitFailedException>
+                                deleteTerminationPoint(DataBroker dataBroker,
+                                                       TerminationPoint terminationPoint,
+                                                       Node ovsdbNode) {
+        InstanceIdentifier<TerminationPoint> terminationPointPath =
+                                                 InstanceIdentifier
+                                                     .create(NetworkTopology.class)
+                                                     .child(Topology.class,
+                                                             new TopologyKey(UnimgrConstants.OVSDB_TOPOLOGY_ID))
+                                                     .child(Node.class,
+                                                            ovsdbNode.getKey())
+                                                     .child(TerminationPoint.class,
+                                                            terminationPoint.getKey());
+        final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+        transaction.delete(LogicalDatastoreType.CONFIGURATION, terminationPointPath);
+        transaction.delete(LogicalDatastoreType.OPERATIONAL, terminationPointPath);
+        transaction.submit();
+        CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
+        return future;
+    }
+
+    public static CheckedFuture<Void,
+                                TransactionCommitFailedException>
+                                deleteNode(DataBroker dataBroker,
+                                           InstanceIdentifier<?> genericNode,
+                                           LogicalDatastoreType store) {
+        WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+        transaction.delete(store, genericNode);
+        return transaction.submit();
+    }
+
     public static <T extends DataObject> Map<InstanceIdentifier<T>,T> extract(
             Map<InstanceIdentifier<?>, DataObject> changes, Class<T> klazz) {
         Map<InstanceIdentifier<T>,T> result = new HashMap<InstanceIdentifier<T>,T>();
@@ -521,6 +567,20 @@ public class UnimgrUtils {
         return Optional.absent();
     }
 
+    public static final Optional<Link> readLink(DataBroker dataBroker,
+                                                LogicalDatastoreType store,
+                                                InstanceIdentifier<?> genericNode) {
+        ReadTransaction read = dataBroker.newReadOnlyTransaction();
+        InstanceIdentifier<Link> linkIid = genericNode.firstIdentifierOf(Link.class);
+        CheckedFuture<Optional<Link>, ReadFailedException> linkFuture = read.read(store, linkIid);
+        try {
+            return linkFuture.checkedGet();
+        } catch (ReadFailedException e) {
+            LOG.info("Unable to read node with Iid {}", linkIid);
+        }
+        return Optional.absent();
+    }
+
     public static final Optional<Node> readNode(DataBroker dataBroker,
                                                 LogicalDatastoreType store,
                                                 InstanceIdentifier<?> genericNode) {
@@ -586,4 +646,55 @@ public class UnimgrUtils {
             transaction.submit();
         }
     }
+
+    public static void updateEvcNode(LogicalDatastoreType dataStore,
+                                     InstanceIdentifier<?> evcKey,
+                                     EvcAugmentation evcAugmentation,
+                                     InstanceIdentifier<?> sourceUniIid,
+                                     InstanceIdentifier<?> destinationUniIid,
+                                     DataBroker dataBroker) {
+        EvcAugmentationBuilder updatedEvcBuilder = new EvcAugmentationBuilder(evcAugmentation);
+        if (sourceUniIid != null && destinationUniIid != null) {
+            List<UniSource> sourceList = new ArrayList<UniSource>();
+            UniSourceKey sourceKey = evcAugmentation.getUniSource().iterator().next().getKey();
+            short sourceOrder = evcAugmentation.getUniSource().iterator().next().getOrder();
+            IpAddress sourceIp = evcAugmentation.getUniSource().iterator().next().getIpAddress();
+            UniSource uniSource = new UniSourceBuilder()
+                                          .setOrder(sourceOrder)
+                                          .setKey(sourceKey)
+                                          .setIpAddress(sourceIp)
+                                          .setUni(sourceUniIid)
+                                          .build();
+            sourceList.add(uniSource);
+            updatedEvcBuilder.setUniSource(sourceList);
+
+            List<UniDest> destinationList = new ArrayList<UniDest>();
+            UniDestKey destKey = evcAugmentation.getUniDest().iterator().next().getKey();
+            short destOrder = evcAugmentation.getUniDest().iterator().next().getOrder();
+            IpAddress destIp = evcAugmentation.getUniDest().iterator().next().getIpAddress();
+            UniDest uniDest = new UniDestBuilder()
+                                      .setIpAddress(destIp)
+                                      .setOrder(destOrder)
+                                      .setKey(destKey)
+                                      .setUni(destinationUniIid)
+                                      .build();
+            destinationList.add(uniDest);
+            updatedEvcBuilder.setUniDest(destinationList);
+            Optional<Link> optionalEvcLink = readLink(dataBroker,
+                                                      LogicalDatastoreType.CONFIGURATION,
+                                                      evcKey);
+            if (optionalEvcLink.isPresent()) {
+                Link link = optionalEvcLink.get();
+                WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
+                LinkBuilder linkBuilder = new LinkBuilder();
+                linkBuilder.setKey(link.getKey());
+                linkBuilder.setLinkId(link.getLinkId());
+                linkBuilder.addAugmentation(EvcAugmentation.class, updatedEvcBuilder.build());
+                transaction.put(dataStore, evcKey.firstIdentifierOf(Link.class), linkBuilder.build());
+                transaction.submit();
+            }
+        } else {
+            LOG.info("Invalid instance identifiers for sourceUni and destUni.");
+        }
+    }
 }