From d64ba296835202558e9f30b43aaefca174894175 Mon Sep 17 00:00:00 2001 From: grmontpetit Date: Mon, 9 Nov 2015 00:23:39 -0500 Subject: [PATCH] Implemented EVC delete Change-Id: Iaf1cdf4547925eb9903a1c79ecf2995d95323c0c Signed-off-by: grmontpetit --- .../unimgr/command/EvcCreateCommand.java | 17 +- .../unimgr/command/EvcDeleteCommand.java | 174 ++++++++++-------- .../unimgr/command/EvcUpdateCommand.java | 3 +- .../unimgr/impl/UnimgrMapper.java | 15 ++ .../opendaylight/unimgr/impl/UnimgrUtils.java | 113 +++++++++++- 5 files changed, 242 insertions(+), 80 deletions(-) diff --git a/impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java b/impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java index c5bf7ea5..5827d240 100644 --- a/impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java +++ b/impl/src/main/java/org/opendaylight/unimgr/command/EvcCreateCommand.java @@ -40,6 +40,7 @@ public class EvcCreateCommand extends AbstractCreateCommand { for (Entry, 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 optionalUniSource = UnimgrUtils.readNode(dataBroker, - LogicalDatastoreType.CONFIGURATION, + LogicalDatastoreType.OPERATIONAL, sourceUniIid); Optional 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."); } diff --git a/impl/src/main/java/org/opendaylight/unimgr/command/EvcDeleteCommand.java b/impl/src/main/java/org/opendaylight/unimgr/command/EvcDeleteCommand.java index 3a862e3e..84661b27 100644 --- a/impl/src/main/java/org/opendaylight/unimgr/command/EvcDeleteCommand.java +++ b/impl/src/main/java/org/opendaylight/unimgr/command/EvcDeleteCommand.java @@ -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, Evc> originalEvcs = UnimgrUtils.extractOriginal(changes, Evc.class); - //Set> removedEvcs = UnimgrUtils.extractRemoved(changes, Evc.class); - - Set> 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, Evc> evc: originalEvcs.entrySet()) { - if (evc.getKey().equals(type)) { - Evc data = evc.getValue(); - List uniSourceLst = data.getUniSource(); - for (UniSource uniSource : uniSourceLst) { - InstanceIdentifier iidUni = uniSource.getUni(); - Optional optionalOvsdbNode = - UnimgrUtils.readNode(dataBroker, - LogicalDatastoreType.OPERATIONAL, - iidUni); - if (optionalOvsdbNode.isPresent()) { - Node ovsdbNode = optionalOvsdbNode.get(); - List termPointList = ovsdbNode.getTerminationPoint(); - for(TerminationPoint termPoint : termPointList) { - deleteTerminationPoint(termPoint, ovsdbNode); - } - } - } - LOG.info("Removed EVC Source {}", data.getUniSource()); - List uniDestLst = data.getUniDest(); - for (UniDest uniDest : uniDestLst) { - InstanceIdentifier iidUni = uniDest.getUni(); - Optional optionalOvsdbNode = - UnimgrUtils.readNode(dataBroker, - LogicalDatastoreType.OPERATIONAL, - iidUni); - if (optionalOvsdbNode.isPresent()) { - Node ovsdbNode = optionalOvsdbNode.get(); - List termPointList = ovsdbNode.getTerminationPoint(); - for(TerminationPoint termPoint : termPointList) { - deleteTerminationPoint(termPoint, ovsdbNode); - } - } - } - LOG.info("Removed EVC Destination {}", data.getUniDest()); + Map, DataObject> originalData = changes.getOriginalData(); + Set> removedIids = changes.getRemovedPaths(); + for (InstanceIdentifier evcIid : removedIids) { + DataObject removedDataObject = originalData.get(evcIid); + if (removedDataObject instanceof Evc) { + Evc evc = (Evc)removedDataObject; + Optional optionalSourceUniNode = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + evc.getUniSource() + .iterator() + .next() + .getUni()); + Optional 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 sourceOvsdbIid = + sourceUniAugmentation + .getOvsdbNodeRef() + .getValue() + .firstIdentifierOf(Node.class); + InstanceIdentifier destOvsdbIid = + destUniAugmentation + .getOvsdbNodeRef() + .getValue() + .firstIdentifierOf(Node.class); + Optional optionalSourceOvsdNode = + UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + sourceOvsdbIid); + Optional 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 sourceBridgeIid = + sourceOvsdbNodeAugmentation + .getManagedNodeEntry() + .iterator() + .next() + .getBridgeRef() + .getValue() + .firstIdentifierOf(Node.class); + InstanceIdentifier destinationBridgeIid = + destinationOvsdbNodeAugmentation + .getManagedNodeEntry() + .iterator() + .next() + .getBridgeRef() + .getValue() + .firstIdentifierOf(Node.class); + Optional optionalSourceBridgeNode = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + sourceBridgeIid); + Optional 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 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 future = transaction.submit(); - try { - future.checkedGet(); - result = true; - } catch (TransactionCommitFailedException e) { - LOG.warn("Failed to delete {} ", terminationPointPath, e); - } - return result; - } } diff --git a/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java b/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java index 7e6bbe9f..204581f1 100644 --- a/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java +++ b/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java @@ -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 } } diff --git a/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrMapper.java b/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrMapper.java index dc94694f..00d95a33 100755 --- a/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrMapper.java +++ b/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrMapper.java @@ -129,6 +129,21 @@ public class UnimgrMapper { return terminationPointPath; } + public static InstanceIdentifier getTerminationPointIid( + Node bridgeNode, + TpId tpId) { + InstanceIdentifier 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 getUniIid(DataBroker dataBroker, IpAddress ip) { List uniNodes = UnimgrUtils.getUniNodes(dataBroker, diff --git a/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java b/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java index 09c49a26..e03a8ad9 100644 --- a/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java +++ b/impl/src/main/java/org/opendaylight/unimgr/impl/UnimgrUtils.java @@ -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 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 + deleteTerminationPoint(DataBroker dataBroker, + TerminationPoint terminationPoint, + Node ovsdbNode) { + InstanceIdentifier 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 future = transaction.submit(); + return future; + } + + public static CheckedFuture + deleteNode(DataBroker dataBroker, + InstanceIdentifier genericNode, + LogicalDatastoreType store) { + WriteTransaction transaction = dataBroker.newWriteOnlyTransaction(); + transaction.delete(store, genericNode); + return transaction.submit(); + } + public static Map,T> extract( Map, DataObject> changes, Class klazz) { Map,T> result = new HashMap,T>(); @@ -521,6 +567,20 @@ public class UnimgrUtils { return Optional.absent(); } + public static final Optional readLink(DataBroker dataBroker, + LogicalDatastoreType store, + InstanceIdentifier genericNode) { + ReadTransaction read = dataBroker.newReadOnlyTransaction(); + InstanceIdentifier linkIid = genericNode.firstIdentifierOf(Link.class); + CheckedFuture, 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 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 sourceList = new ArrayList(); + 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 destinationList = new ArrayList(); + 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 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."); + } + } } -- 2.36.6