From e1017c94b61741ac5e6d9ddc40bcf91a3912b627 Mon Sep 17 00:00:00 2001 From: Icaro Camelo Date: Tue, 26 Jan 2016 16:38:26 -0500 Subject: [PATCH] Update EVC Change-Id: I6fbfcf3e4f862b92045c35cfa2ea337370860010 Signed-off-by: Icaro Camelo (cherry picked from commit cbe044e0b0c15dd42db44ff3dc668c94bfb20896) --- .../unimgr/command/EvcUpdateCommand.java | 157 +++++++++++++++++- 1 file changed, 153 insertions(+), 4 deletions(-) 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 204581f1..feaa021c 100644 --- a/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java +++ b/impl/src/main/java/org/opendaylight/unimgr/command/EvcUpdateCommand.java @@ -8,27 +8,176 @@ package org.opendaylight.unimgr.command; import java.util.Map; +import java.util.Map.Entry; import org.opendaylight.controller.md.sal.binding.api.DataBroker; +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.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; 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 EvcUpdateCommand extends AbstractUpdateCommand { private static final Logger LOG = LoggerFactory.getLogger(EvcUpdateCommand.class); - public EvcUpdateCommand(DataBroker dataBroker, - Map, DataObject> changes) { + public EvcUpdateCommand(final DataBroker dataBroker, + final Map, DataObject> changes) { super.dataBroker = dataBroker; super.changes = changes; } @Override public void execute() { - //TODO - } + for (final Entry, DataObject> created : changes.entrySet()) { + if (created.getValue() != null && created.getValue() instanceof EvcAugmentation) { + final EvcAugmentation evc = (EvcAugmentation) created.getValue(); + final InstanceIdentifier evcKey = created.getKey(); + + // FIXME: For now, we assume that there is 1 uni per + // source/destination + if (evc.getUniDest() == null || evc.getUniDest().isEmpty()) { + LOG.error("Destination UNI cannot be null."); + break; + } + if (evc.getUniSource() == null || evc.getUniSource().isEmpty()) { + 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()); + InstanceIdentifier sourceUniIid; + InstanceIdentifier destinationUniIid; + + final InstanceIdentifier iidSource = evc.getUniSource().iterator().next().getUni(); + if (iidSource != null) { + sourceUniIid = iidSource.firstIdentifierOf(Node.class); + } else { + sourceUniIid = UnimgrMapper.getUniIid(dataBroker, + evc.getUniSource().iterator().next().getIpAddress(), + LogicalDatastoreType.OPERATIONAL); + } + final InstanceIdentifier iidDest = evc.getUniDest().iterator().next().getUni(); + if (iidDest != null) { + destinationUniIid = iidDest.firstIdentifierOf(Node.class); + } else { + destinationUniIid = UnimgrMapper.getUniIid(dataBroker, + evc.getUniDest().iterator().next().getIpAddress(), + LogicalDatastoreType.OPERATIONAL); + } + + // Retrieve the source and destination UNIs + final Optional optionalUniSource = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + sourceUniIid); + final Optional optionalUniDestination = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + destinationUniIid); + + Node uniSource = null; + Node uniDestination = null; + + if (optionalUniSource.isPresent() && optionalUniDestination.isPresent()) { + uniSource = optionalUniSource.get(); + uniDestination = optionalUniDestination.get(); + // Retrieve the source and/or destination OVSDB node + final UniAugmentation sourceUniAugmentation = + uniSource.getAugmentation(UniAugmentation.class); + final UniAugmentation destinationUniAugmentation = + uniDestination.getAugmentation(UniAugmentation.class); + final Optional optionalSourceOvsdbNode = + UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + sourceUniAugmentation + .getOvsdbNodeRef() + .getValue()); + final Optional optionalDestinationOvsdbNode = + UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + destinationUniAugmentation + .getOvsdbNodeRef() + .getValue()); + if (optionalSourceOvsdbNode.isPresent() && optionalDestinationOvsdbNode.isPresent()) { + // Retrieve the source and/or destination bridge + final InstanceIdentifier sourceBridgeIid = + UnimgrMapper.getOvsdbBridgeNodeIid(optionalSourceOvsdbNode.get()); + final Optional optionalSourceBr = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + sourceBridgeIid); + final InstanceIdentifier destinationBridgeIid = + UnimgrMapper.getOvsdbBridgeNodeIid(optionalDestinationOvsdbNode.get()); + final Optional optionalDestinationBr = UnimgrUtils.readNode(dataBroker, + LogicalDatastoreType.OPERATIONAL, + destinationBridgeIid); + Node sourceBr = null; + Node destinationBr = null; + if (optionalSourceBr.isPresent() && optionalDestinationBr.isPresent()) { + sourceBr = optionalSourceBr.get(); + destinationBr = optionalDestinationBr.get(); + + // Creating termination points (OVSDB CONFIG + // datastore) + UnimgrUtils.createTerminationPointNode(dataBroker, + uniSource.getAugmentation(UniAugmentation.class), + sourceBr, + UnimgrConstants.DEFAULT_BRIDGE_NAME, + UnimgrConstants.DEFAULT_TUNNEL_IFACE); + + // Create GRE tunnel (OVSDB CONFIG datastore) + UnimgrUtils.createGreTunnel(dataBroker, + uniSource.getAugmentation(UniAugmentation.class), + uniDestination.getAugmentation(UniAugmentation.class), + sourceBr, + UnimgrConstants.DEFAULT_BRIDGE_NAME, + UnimgrConstants.DEFAULT_GRE_TUNNEL_NAME); + + // Create termination points (CONFIG datastore) + UnimgrUtils.createTerminationPointNode(dataBroker, + uniSource.getAugmentation(UniAugmentation.class), + destinationBr, + UnimgrConstants.DEFAULT_BRIDGE_NAME, + UnimgrConstants.DEFAULT_TUNNEL_IFACE); + + // Create GRE tunnel (OVSDB CONFIG datastore) + UnimgrUtils.createGreTunnel(dataBroker, + uniDestination.getAugmentation(UniAugmentation.class), + uniSource.getAugmentation(UniAugmentation.class), destinationBr, + UnimgrConstants.DEFAULT_BRIDGE_NAME, + UnimgrConstants.DEFAULT_GRE_TUNNEL_NAME); + + // Update EVC + 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."); + } + } else { + LOG.info("Uname to retrieve the source and/or destination ovsdbNode."); + } + } else { + LOG.info("Unable to retrieve the source and/or destination Uni."); + } + } + } + } } -- 2.36.6