From 1e4b767738a83a11607d74a838eafaa271fec863 Mon Sep 17 00:00:00 2001 From: Yakir Dorani Date: Sun, 21 Aug 2016 13:14:28 +0300 Subject: [PATCH] Add l2vpn support for vlans Change-Id: I1a61043b93cb2917604427b7b04e13b569aaf676 Signed-off-by: Yakir Dorani --- cisco-xr-driver/.gitignore | 1 + cisco-xrmodels/.gitignore | 1 + features/pom.xml | 1 - impl/.gitignore | 1 + .../unimgr/mef/netvirt/EvcListener.java | 95 +++--- .../{EvcUniListener.java => EvcUniUtils.java} | 206 ++++-------- .../unimgr/mef/netvirt/MefUtils.java | 40 +-- .../unimgr/mef/netvirt/NetvirtUtils.java | 77 +---- .../mef/netvirt/NodeConnectorListener.java | 18 +- .../opendaylight/blueprint/netvirt-driver.xml | 4 - .../mef/netvirt/EvcUniListenerTest.java | 313 ------------------ .../unimgr/mef/netvirt/TestHelper.java | 92 ----- 12 files changed, 153 insertions(+), 696 deletions(-) create mode 100644 cisco-xr-driver/.gitignore create mode 100644 cisco-xrmodels/.gitignore create mode 100644 impl/.gitignore rename netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/{EvcUniListener.java => EvcUniUtils.java} (52%) delete mode 100644 netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListenerTest.java delete mode 100644 netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/TestHelper.java diff --git a/cisco-xr-driver/.gitignore b/cisco-xr-driver/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/cisco-xr-driver/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/cisco-xrmodels/.gitignore b/cisco-xrmodels/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/cisco-xrmodels/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/features/pom.xml b/features/pom.xml index 7a0f7c0b..93224364 100644 --- a/features/pom.xml +++ b/features/pom.xml @@ -30,7 +30,6 @@ 0.10.0-SNAPSHOT 1.2.0-SNAPSHOT 0.2.0-SNAPSHOT - 0.2.0-SNAPSHOT etc/opendaylight/karaf diff --git a/impl/.gitignore b/impl/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/impl/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java index 9fb71b8d..02d4bd85 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java @@ -16,6 +16,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener; +import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.Evc; @@ -41,7 +42,7 @@ public class EvcListener extends UnimgrDataTreeChangeListener { public void registerListener() { try { final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, - getEvcTopologyPath()); + MefUtils.getEvcInstanceIdentifier()); evcListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); log.info("EvcDataTreeChangeListener created and registered"); } catch (final Exception e) { @@ -50,10 +51,6 @@ public class EvcListener extends UnimgrDataTreeChangeListener { } } - private InstanceIdentifier getEvcTopologyPath() { - return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Evc.class); - } - @Override public void close() throws Exception { evcListenerRegistration.close(); @@ -83,17 +80,9 @@ public class EvcListener extends UnimgrDataTreeChangeListener { } } - private InstanceIdentifier getWildCardPath() { - InstanceIdentifier instanceIdentifier = InstanceIdentifier.create(MefServices.class) - .child(MefService.class).child(Evc.class); - - return instanceIdentifier; - } - private void addEvc(DataTreeModification newDataObject) { try { Evc data = newDataObject.getRootNode().getDataAfter(); - String instanceName = data.getEvcId().getValue(); log.info("Adding elan instance: " + instanceName); @@ -101,31 +90,13 @@ public class EvcListener extends UnimgrDataTreeChangeListener { // Create elan interfaces for (Uni uni : data.getUnis().getUni()) { - createUni(instanceName, uni); + createElanInterface(instanceName, uni); } } catch (final Exception e) { log.error("Add evc failed !", e); } } - private void removeEvc(DataTreeModification removedDataObject) { - try { - Evc data = removedDataObject.getRootNode().getDataBefore(); - - String instanceName = data.getEvcId().getValue(); - - for(Uni uni : data.getUnis().getUni()) - { - removeUni(instanceName, uni); - } - - log.info("Removing elan instance: " + instanceName); - NetvirtUtils.deleteElanInstance(dataBroker, instanceName); - } catch (final Exception e) { - log.error("Remove evc failed !", e); - } - } - private void updateEvc(DataTreeModification modifiedDataObject) { try { Evc original = modifiedDataObject.getRootNode().getDataBefore(); @@ -146,19 +117,19 @@ public class EvcListener extends UnimgrDataTreeChangeListener { // removing the Uni which are not presented in the updated // List for (Uni uni : originalUni) { - removeUni(instanceName, uni); + removeElanInterface(instanceName, uni); } } // Adding the new Uni which are presented in the updated List if (updateUni.size() > 0) { for (Uni uni : updateUni) { - createUni(instanceName, uni); + createElanInterface(instanceName, uni); } } } else if (originalUni != null && !originalUni.isEmpty()) { for (Uni uni : originalUni) { - removeUni(instanceName, uni); + removeElanInterface(instanceName, uni); } } } catch (final Exception e) { @@ -166,38 +137,66 @@ public class EvcListener extends UnimgrDataTreeChangeListener { } } - private void removeUni(String instanceName, Uni uni) { + private void removeEvc(DataTreeModification removedDataObject) { + try { + Evc data = removedDataObject.getRootNode().getDataBefore(); + + String instanceName = data.getEvcId().getValue(); + + for (Uni uni : data.getUnis().getUni()) { + removeElanInterface(instanceName, uni); + } + + log.info("Removing elan instance: " + instanceName); + NetvirtUtils.deleteElanInstance(dataBroker, instanceName); + } catch (final Exception e) { + log.error("Remove evc failed !", e); + } + } + + private void createElanInterface(String instanceName, Uni uni) { + EvcUniUtils.addUni(dataBroker, uni); + String uniId = uni.getUniId().getValue(); + + Link link = EvcUniUtils.getLink(dataBroker, uni); + String interfaceName = EvcUniUtils.getInterfaceName(link, uniId); + EvcUniCeVlans evcUniCeVlans = uni.getEvcUniCeVlans(); if (evcUniCeVlans != null && !evcUniCeVlans.getEvcUniCeVlan().isEmpty()) { for (EvcUniCeVlan x : evcUniCeVlans.getEvcUniCeVlan()) { - String interfaceName = NetvirtUtils.getInterfaceNameForVlan(uniId, x.getVid().toString()); - log.info("Removing elan interface: " + interfaceName); - NetvirtUtils.deleteElanInterface(dataBroker, instanceName, interfaceName); + interfaceName = NetvirtUtils.getInterfaceNameForVlan(interfaceName, x.getVid().toString()); + + log.info("Adding elan interface: " + interfaceName); + NetvirtUtils.createElanInterface(dataBroker, instanceName, interfaceName); } } else { - log.info("Removing elan interface: " + uniId); - NetvirtUtils.deleteElanInterface(dataBroker, instanceName, uniId); + log.info("Adding elan interface: " + interfaceName); + NetvirtUtils.createElanInterface(dataBroker, instanceName, interfaceName); } } - private void createUni(String instanceName, Uni uni) { + private void removeElanInterface(String instanceName, Uni uni) { + EvcUniUtils.removeUni(dataBroker, uni); + String uniId = uni.getUniId().getValue(); EvcUniCeVlans evcUniCeVlans = uni.getEvcUniCeVlans(); + Link link = EvcUniUtils.getLink(dataBroker, uni); + String interfaceName = EvcUniUtils.getInterfaceName(link, uniId); + if (evcUniCeVlans != null && !evcUniCeVlans.getEvcUniCeVlan().isEmpty()) { for (EvcUniCeVlan x : evcUniCeVlans.getEvcUniCeVlan()) { - String interfaceName = NetvirtUtils.getInterfaceNameForVlan(uniId, x.getVid().toString()); - - log.info("Adding elan interface: " + interfaceName); - NetvirtUtils.createElanInterface(dataBroker, instanceName, interfaceName); + interfaceName = NetvirtUtils.getInterfaceNameForVlan(uniId, x.getVid().toString()); + log.info("Removing elan interface: " + interfaceName); + NetvirtUtils.deleteElanInterface(dataBroker, instanceName, interfaceName); } } else { - log.info("Adding elan interface: " + uniId); - NetvirtUtils.createElanInterface(dataBroker, instanceName, uniId); + log.info("Removing elan interface: " + uniId); + NetvirtUtils.deleteElanInterface(dataBroker, instanceName, interfaceName); } } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniUtils.java similarity index 52% rename from netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListener.java rename to netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniUtils.java index 28b1eabb..5448f347 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcUniUtils.java @@ -8,84 +8,72 @@ package org.opendaylight.unimgr.mef.netvirt; -import java.util.Collections; import java.util.List; -import java.util.Set; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.genius.interfacemanager.globals.IfmConstants; -import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.Evc; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.Unis; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlans; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlan; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.VlanIdType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; -import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Objects; import com.google.common.base.Optional; -import com.google.common.collect.Sets; import com.google.common.util.concurrent.CheckedFuture; -public class EvcUniListener extends UnimgrDataTreeChangeListener { - private static final Logger logger = LoggerFactory.getLogger(EvcUniListener.class); +public class EvcUniUtils { - private ListenerRegistration uniListenerRegistration; + private static final Logger logger = LoggerFactory.getLogger(EvcUniUtils.class); - public EvcUniListener(final DataBroker dataBroker) { - super(dataBroker); - - registerListener(); - } + public static Link getLink(DataBroker dataBroker, Uni evcUni) { + Optional optional = MdsalUtils + .read(dataBroker, LogicalDatastoreType.CONFIGURATION, + MefUtils.getUniInstanceIdentifier(evcUni.getUniId().getValue())); - @Override - public void add(DataTreeModification newDataObject) { - if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) { - logger.info("uni {} created", newDataObject.getRootNode().getIdentifier()); - addUni(newDataObject); + if (!optional.isPresent()) { + logger.error("A matching Uni doesn't exist for EvcUni {}", evcUni.getUniId()); + return null; } - } - @Override - public void remove(DataTreeModification removedDataObject) { - if (removedDataObject.getRootPath() != null && removedDataObject.getRootNode() != null) { - logger.info("uni {} deleted", removedDataObject.getRootNode().getIdentifier()); - removeUni(removedDataObject); + org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni = optional + .get(); + + PhysicalLayers physicalLayers = uni.getPhysicalLayers(); + if (physicalLayers == null) { + logger.warn("Uni {} is missing PhysicalLayers", evcUni.getUniId()); + return null; } - } - @Override - public void update(DataTreeModification modifiedDataObject) { - if (modifiedDataObject.getRootPath() != null && modifiedDataObject.getRootNode() != null) { - logger.info("uni {} updated", modifiedDataObject.getRootNode().getIdentifier()); - updateUni(modifiedDataObject); + Links links = physicalLayers.getLinks(); + if (links == null || links.getLink() == null) { + logger.warn("Uni {} is has no links", evcUni.getUniId()); + return null; } + + Link link = links.getLink().get(0); + return link; } - protected void removeUni(DataTreeModification removedDataObject) { + public static void removeUni(DataBroker dataBroker, Uni data) { try { - Uni data = removedDataObject.getRootNode().getDataBefore(); - String uniId = data.getUniId().getValue(); - WriteTransaction tx = createTransaction(); + WriteTransaction tx = createTransaction(dataBroker); + + Link link = EvcUniUtils.getLink(dataBroker, data); + uniId = EvcUniUtils.getInterfaceName(link, uniId); + logger.info("Removing trunk {}", uniId); + delete(uniId, tx); Optional> ceVlansOptional = getCeVlans(data); @@ -100,63 +88,42 @@ public class EvcUniListener extends UnimgrDataTreeChangeListener { } } - protected void updateUni(DataTreeModification modifiedDataObject) { - try { - Uni original = modifiedDataObject.getRootNode().getDataBefore(); - Uni update = modifiedDataObject.getRootNode().getDataAfter(); - - String uniId = update.getUniId().getValue(); - WriteTransaction tx = createTransaction(); - String origTrunkParentName = getTrunkParentName(original); - String updatedTrunkParentName = getTrunkParentName(update); - - if (!Objects.equal(origTrunkParentName, updatedTrunkParentName)) { - addTrunkInterface(uniId, updatedTrunkParentName, tx); - } - - Set origCeVlans = Sets.newHashSet(getCeVlans(original).or(Collections.emptyList())); - Set updatedCeVlans = Sets.newHashSet(getCeVlans(update).or(Collections.emptyList())); - Iterable removedCeVlans = Sets.difference(origCeVlans, updatedCeVlans); - Iterable addedCeVlans = Sets.difference(updatedCeVlans, origCeVlans); - removeTrunkMemberInterfaces(uniId, removedCeVlans, tx); - addTrunkMemberInterfaces(uniId, addedCeVlans, tx); - commitTransaction(tx); - } catch (final Exception e) { - logger.error("Update uni failed !", e); - } - - } - - protected void addUni(DataTreeModification newDataObject) { + public static void addUni(DataBroker dataBroker, Uni data) { try { - Uni data = newDataObject.getRootNode().getDataAfter(); - String uniId = data.getUniId().getValue(); - WriteTransaction tx = createTransaction(); - addTrunkInterface(uniId, getTrunkParentName(data), tx); + WriteTransaction tx = createTransaction(dataBroker); + Link link = EvcUniUtils.getLink(dataBroker, data); + String interfaceName = EvcUniUtils.getInterfaceName(link, uniId); + addTrunkInterface(interfaceName, getTrunkParentName(link), tx); Optional> ceVlansOptional = getCeVlans(data); if (ceVlansOptional.isPresent()) { - addTrunkMemberInterfaces(uniId, ceVlansOptional.get(), tx); + addTrunkMemberInterfaces(interfaceName, ceVlansOptional.get(), tx); } commitTransaction(tx); } catch (final Exception e) { logger.error("Add uni failed !", e); } - } - private void addTrunkInterface(String interfaceName, String parentInterfaceName, WriteTransaction tx) { + private static void addTrunkInterface(String interfaceName, String parentInterfaceName, WriteTransaction tx) { logger.info("Adding VLAN trunk {} ParentRef {}", interfaceName, parentInterfaceName); Interface trunkInterface = NetvirtUtils.createTrunkInterface(interfaceName, parentInterfaceName); write(trunkInterface, tx); } - private void addTrunkMemberInterfaces(String parentInterfaceName, Iterable ceVlans, + private static void addTrunkMemberInterfaces(String parentInterfaceName, Iterable ceVlans, WriteTransaction tx) { for (EvcUniCeVlan ceVlan : ceVlans) { - Long vlanId = ((VlanIdType) ceVlan.getVid()).getValue(); + Object vid = ceVlan.getVid(); + if (!(vid instanceof Long)) { + String errorMessage = String.format("vlan id {} cannot be cast to Long", vid); + logger.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } + + Long vlanId = (Long) vid; String interfaceName = NetvirtUtils.getInterfaceNameForVlan(parentInterfaceName, vlanId.toString()); logger.info("Adding VLAN trunk-member {} ParentRef {}", interfaceName, parentInterfaceName); Interface trunkMemberInterface = NetvirtUtils.createTrunkMemberInterface(interfaceName, parentInterfaceName, @@ -165,27 +132,34 @@ public class EvcUniListener extends UnimgrDataTreeChangeListener { } } - private void removeTrunkMemberInterfaces(String parentInterfaceName, Iterable ceVlans, + private static void removeTrunkMemberInterfaces(String parentInterfaceName, Iterable ceVlans, WriteTransaction tx) { for (EvcUniCeVlan ceVlan : ceVlans) { - Long vlanId = ((VlanIdType) ceVlan.getVid()).getValue(); + Object vid = ceVlan.getVid(); + if (!(vid instanceof Long)) { + String errorMessage = String.format("vlan id {} cannot be cast to Long", vid); + logger.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } + + Long vlanId = (Long) vid; String interfaceName = NetvirtUtils.getInterfaceNameForVlan(parentInterfaceName, vlanId.toString()); logger.info("Removing VLAN trunk-member {}", interfaceName); delete(interfaceName, tx); } } - private InstanceIdentifier createInterfaceIdentifier(String interfaceName) { + private static InstanceIdentifier createInterfaceIdentifier(String interfaceName) { return InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName)) .build(); } - private WriteTransaction createTransaction() { + private static WriteTransaction createTransaction(DataBroker dataBroker) { WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); return tx; } - private void commitTransaction(WriteTransaction tx) { + private static void commitTransaction(WriteTransaction tx) { try { CheckedFuture futures = tx.submit(); futures.get(); @@ -194,54 +168,24 @@ public class EvcUniListener extends UnimgrDataTreeChangeListener { } } - private void write(Interface iface, WriteTransaction tx) { + private static void write(Interface iface, WriteTransaction tx) { String interfaceName = iface.getName(); InstanceIdentifier interfaceIdentifier = createInterfaceIdentifier(interfaceName); tx.put(LogicalDatastoreType.CONFIGURATION, interfaceIdentifier, iface, true); } - private void delete(String interfaceName, WriteTransaction tx) { + private static void delete(String interfaceName, WriteTransaction tx) { InstanceIdentifier interfaceIdentifier = createInterfaceIdentifier(interfaceName); tx.delete(LogicalDatastoreType.CONFIGURATION, interfaceIdentifier); } - private String getTrunkParentName(Uni evcUni) { - - Optional optional = MdsalUtils - .read(dataBroker, LogicalDatastoreType.CONFIGURATION, - MefUtils.getUniInstanceIdentifier(evcUni.getUniId().getValue())); - - if (!optional.isPresent()) { - logger.error("A matching Uni doesn't exist for EvcUni {}", evcUni.getUniId()); - return null; - } - - org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni = optional - .get(); - - PhysicalLayers physicalLayers = uni.getPhysicalLayers(); - if (physicalLayers == null) { - logger.warn("Uni {} is missing PhysicalLayers", evcUni.getUniId()); - return null; - } - - Links links = physicalLayers.getLinks(); - if (links == null || links.getLink() == null) { - logger.warn("Uni {} is has no links", evcUni.getUniId()); - return null; - } - - Link link = links.getLink().get(0); + private static String getTrunkParentName(Link link) { String deviceName = link.getDevice().getValue(); String interfaceName = link.getInterface().toString(); return getDeviceInterfaceName(deviceName, interfaceName); } - private String getDeviceInterfaceName(String deviceName, String interfaceName) { - return deviceName + IfmConstants.OF_URI_SEPARATOR + interfaceName; - } - - private Optional> getCeVlans(Uni uni) { + private static Optional> getCeVlans(Uni uni) { EvcUniCeVlans ceVlans = uni.getEvcUniCeVlans(); if (ceVlans == null) { return Optional.absent(); @@ -250,26 +194,12 @@ public class EvcUniListener extends UnimgrDataTreeChangeListener { return Optional.fromNullable(ceVlans.getEvcUniCeVlan()); } - private void registerListener() { - try { - final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, - getUniTopologyPath()); - uniListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); - logger.info("UniDataTreeChangeListener created and registered"); - } catch (final Exception e) { - logger.error("Uni DataChange listener registration failed !", e); - throw new IllegalStateException("Uni registration Listener failed.", e); - } - } - - private InstanceIdentifier getUniTopologyPath() { - return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Evc.class).child(Unis.class) - .child(Uni.class); + public static String getInterfaceName(Link link, String uniId) { + String device = link.getDevice().getValue(); + return getDeviceInterfaceName(device, uniId); } - @Override - public void close() throws Exception { - // TODO Auto-generated method stub - + public static String getDeviceInterfaceName(String deviceName, String interfaceName) { + return deviceName + IfmConstants.OF_URI_SEPARATOR + interfaceName; } -} \ No newline at end of file +} diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefUtils.java index c8ab72d0..78a5a22c 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefUtils.java @@ -8,25 +8,13 @@ package org.opendaylight.unimgr.mef.netvirt; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -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.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.MefInterfaces; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Unis; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniKey; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayersBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.LinksBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkKey; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.MefServices; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService; @@ -34,30 +22,21 @@ import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.serv import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.MefTopology; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.Devices; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.Device; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.DeviceBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.DeviceKey; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.Interfaces; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.InterfacesBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.Interface; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.topology.rev150526.mef.topology.devices.device.interfaces.InterfaceKey; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.DeviceRole; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap; -import org.opendaylight.yangtools.yang.binding.Augmentation; -import org.opendaylight.yangtools.yang.binding.DataContainer; -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.util.concurrent.CheckedFuture; - public final class MefUtils { + @SuppressWarnings("unused") private static final Logger logger = LoggerFactory.getLogger(MefUtils.class); - - public static InstanceIdentifier getDeviceInterfaceInstanceIdentifier(String deviceId, String interfaceId) { + + public static InstanceIdentifier getDeviceInterfaceInstanceIdentifier(String deviceId, + String interfaceId) { return InstanceIdentifier.builder(MefTopology.class).child(Devices.class) .child(Device.class, new DeviceKey(new Identifier45(deviceId))).child(Interfaces.class) .child(Interface.class, new InterfaceKey(new Identifier45(interfaceId))).build(); @@ -74,13 +53,18 @@ public final class MefUtils { .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.Unis.class) .child(org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni.class, new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniKey( - new Identifier45(uniId))).build(); - + new Identifier45(uniId))) + .build(); } - public static InstanceIdentifier getUniLinkInstanceIdentifier(String uniId, String deviceId, String interfaceId) { + public static InstanceIdentifier getUniLinkInstanceIdentifier(String uniId, String deviceId, + String interfaceId) { return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class) .child(Uni.class, new UniKey(new Identifier45(uniId))).child(PhysicalLayers.class).child(Links.class) .child(Link.class, new LinkKey(new Identifier45(deviceId), interfaceId)).build(); } + + public static InstanceIdentifier getEvcInstanceIdentifier() { + return InstanceIdentifier.create(MefServices.class).child(MefService.class).child(Evc.class); + } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java index 00d8ef87..b5b51d2b 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtUtils.java @@ -10,11 +10,6 @@ package org.opendaylight.unimgr.mef.netvirt; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.MefInterfaces; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.Unis; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniKey; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder; @@ -33,25 +28,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import com.google.common.util.concurrent.CheckedFuture; - public class NetvirtUtils { - public static void createElanInstanceSync(DataBroker dataBroker, String instanceName) { + public final static String VLAN_SEPARATOR = "."; + public static void createElanInstance(DataBroker dataBroker, String instanceName) { ElanInstanceBuilder einstBuilder = createElanInstance(instanceName); MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, getElanInstanceInstanceIdentifier(instanceName), einstBuilder.build()); } - public static void createElanInterfaceSync(DataBroker dataBroker, String instanceName, String interfaceName) { + public static void createElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { ElanInterfaceBuilder einterfaceBuilder = createElanInterface(instanceName, interfaceName); MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, getElanInterfaceInstanceIdentifier(interfaceName), einterfaceBuilder.build()); } - public static void updateElanInstanceSync(DataBroker dataBroker, String instanceName) { + public static void updateElanInstance(DataBroker dataBroker, String instanceName) { ElanInstanceBuilder einstBuilder = createElanInstance(instanceName); @@ -59,63 +53,23 @@ public class NetvirtUtils { getElanInstanceInstanceIdentifier(instanceName), einstBuilder.build()); } - public static void updateElanInterfaceSync(DataBroker dataBroker, String instanceName, String interfaceName) { + public static void updateElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { ElanInterfaceBuilder einterfaceBuilder = createElanInterface(instanceName, interfaceName); MdsalUtils.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, getElanInterfaceInstanceIdentifier(interfaceName), einterfaceBuilder.build()); } - public static void deleteElanInstanceSync(DataBroker dataBroker, String instanceName) { + public static void deleteElanInstance(DataBroker dataBroker, String instanceName) { MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, getElanInstanceInstanceIdentifier(instanceName)); } - public static void deleteElanInterfaceSync(DataBroker dataBroker, String instanceName, String interfaceName) { + public static void deleteElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, getElanInterfaceInstanceIdentifier(interfaceName)); } - public static CheckedFuture createElanInstance(DataBroker dataBroker, String instanceName) { - - ElanInstanceBuilder einstBuilder = createElanInstance(instanceName); - - return MdsalUtils.write(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInstanceInstanceIdentifier(instanceName), einstBuilder.build()); - } - - public static void createElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { - ElanInterfaceBuilder einterfaceBuilder = createElanInterface(instanceName, interfaceName); - - MdsalUtils.write(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInterfaceInstanceIdentifier(interfaceName), einterfaceBuilder.build()); - } - - public static void updateElanInstance(DataBroker dataBroker, String instanceName) { - - ElanInstanceBuilder einstBuilder = createElanInstance(instanceName); - - MdsalUtils.update(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInstanceInstanceIdentifier(instanceName), einstBuilder.build()); - } - - public static void updateElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { - ElanInterfaceBuilder einterfaceBuilder = createElanInterface(instanceName, interfaceName); - - MdsalUtils.update(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInterfaceInstanceIdentifier(interfaceName), einterfaceBuilder.build()); - } - - public static void deleteElanInstance(DataBroker dataBroker, String instanceName) { - MdsalUtils.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInstanceInstanceIdentifier(instanceName)); - } - - public static void deleteElanInterface(DataBroker dataBroker, String instanceName, String interfaceName) { - MdsalUtils.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, - getElanInterfaceInstanceIdentifier(interfaceName)); - } - public static Interface createTrunkInterface(String interfaceName, String parentIfaceName) { IfL2vlanBuilder ifL2vlanBuilder = new IfL2vlanBuilder(); ifL2vlanBuilder.setL2vlanMode(IfL2vlan.L2vlanMode.Trunk); @@ -131,13 +85,13 @@ public class NetvirtUtils { private static Interface createInterface(String interfaceName, String parentIfaceName, IfL2vlan ifL2vlan) { InterfaceBuilder interfaceBuilder = new InterfaceBuilder(); ParentRefsBuilder parentRefsBuilder = new ParentRefsBuilder().setParentInterface(parentIfaceName); - interfaceBuilder.setEnabled(true).setName(interfaceName).setType(L2vlan.class).addAugmentation(IfL2vlan - .class, ifL2vlan).addAugmentation(ParentRefs.class, parentRefsBuilder.build()); + interfaceBuilder.setEnabled(true).setName(interfaceName).setType(L2vlan.class) + .addAugmentation(IfL2vlan.class, ifL2vlan).addAugmentation(ParentRefs.class, parentRefsBuilder.build()); return interfaceBuilder.build(); - } + } public static String getInterfaceNameForVlan(String uniId, String vlanId) { - return uniId + "." + vlanId; + return uniId + VLAN_SEPARATOR + vlanId; } private static ElanInstanceBuilder createElanInstance(String instanceName) { @@ -154,18 +108,13 @@ public class NetvirtUtils { return einterfaceBuilder; } - private static InstanceIdentifier getElanInstanceInstanceIdentifier(String instanceName) { + private static InstanceIdentifier getElanInstanceInstanceIdentifier(String instanceName) { return InstanceIdentifier.builder(ElanInstances.class) .child(ElanInstance.class, new ElanInstanceKey(instanceName)).build(); } - private static InstanceIdentifier getElanInterfaceInstanceIdentifier(String interfaceName) { + private static InstanceIdentifier getElanInterfaceInstanceIdentifier(String interfaceName) { return InstanceIdentifier.builder(ElanInterfaces.class) .child(ElanInterface.class, new ElanInterfaceKey(interfaceName)).build(); } - - private static InstanceIdentifier getUniInterfaceInstanceIdentifier(String interfaceName) { - return InstanceIdentifier.builder(MefInterfaces.class).child(Unis.class) - .child(Uni.class, new UniKey(new Identifier45(interfaceName))).build(); - } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java index 6a308696..fc894562 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NodeConnectorListener.java @@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.genius.interfacemanager.globals.IfmConstants; import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayersBuilder; @@ -43,7 +44,6 @@ import com.google.common.util.concurrent.CheckedFuture; public class NodeConnectorListener extends UnimgrDataTreeChangeListener { - private static final String OF_URI_SEPARATOR = ":"; private static final Logger log = LoggerFactory.getLogger(NodeConnectorListener.class); private static final Logger logger = LoggerFactory.getLogger(NodeConnectorListener.class); private static boolean handleRemovedNodeConnectors = false; @@ -129,10 +129,10 @@ public class NodeConnectorListener extends UnimgrDataTreeChangeListener - - - - diff --git a/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListenerTest.java b/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListenerTest.java deleted file mode 100644 index 9a105b7d..00000000 --- a/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/EvcUniListenerTest.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 2016 Hewlett Packard Enterprise, Co. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.unimgr.mef.netvirt; - -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.ExecutionException; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; -import org.mockito.internal.stubbing.answers.Returns; -import org.mockito.internal.stubbing.answers.ReturnsArgumentAt; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.mockito.stubbing.OngoingStubbing; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType; -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.ReadTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -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.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.CeVlans; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayers; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.PhysicalLayersBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.Links; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.LinksBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.Link; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.uni.physical.layers.links.LinkBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.UniBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlans; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.EvcUniCeVlansBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlan; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.uni.evc.uni.ce.vlans.EvcUniCeVlanBuilder; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.Identifier45; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.types.rev150526.VlanIdType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; - -import scala.collection.TraversableOnce.OnceCanBuildFrom; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({ LogicalDatastoreType.class, EvcUniListener.class }) -public class EvcUniListenerTest { - - @Mock - private DataBroker dataBroker; - @Mock - private WriteTransaction transaction; - private EvcUniListener uniListener; - - @Before - public void setUp() { - dataBroker = mock(DataBroker.class); - uniListener = new EvcUniListener(dataBroker); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniAdded() throws Exception { - String uniId = "MMPOP1-ce0-Slot0-Port1"; - String deviceName = "ce0"; - String interfaceName = "GigabitEthernet-0-1"; - Uni uni = evcUni(uniId, deviceName, interfaceName); - - prepareWriteTransaction(); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE)); - - prepareReadTransaction(uniId, deviceName, interfaceName); - - uniListener.onDataTreeChanged(collection); - - Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, interfaceName)); - - verifyWriteInterface(trunkInterface); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniWithVlansAdded() throws Exception { - String uniId = "MMPOP1-ce0-Slot1-Port1"; - String deviceName = "ce0"; - String interfaceName = "GigabitEthernet-1-1"; - Uni uni = evcUni(uniId, deviceName, interfaceName, 3, 4); - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, interfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(null, uni, ModificationType.WRITE)); - uniListener.onDataTreeChanged(collection); - - Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, interfaceName)); - verifyWriteInterface(trunkInterface); - Interface vlan3Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".3", uniId, 3); - verifyWriteInterface(vlan3Interface); - Interface vlan4Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".4", uniId, 4); - verifyWriteInterface(vlan4Interface); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniRemoved() throws Exception { - String uniId = "MMPOP1-ce0-Slot0-Port1"; - String deviceName = "ce0"; - String interfaceName = "GigabitEthernet-0-1"; - Uni uni = evcUni(uniId, deviceName, interfaceName); - - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, interfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE)); - - uniListener.onDataTreeChanged(collection); - - verifyDeleteInterface(uniId); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniWithVlansRemoved() throws Exception { - String uniId = "MMPOP1-ce0-Slot1-Port1"; - String deviceName = "ce0"; - String interfaceName = "GigabitEthernet-1-1"; - Uni uni = evcUni(uniId, deviceName, interfaceName, 3, 4); - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, interfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(uni, null, ModificationType.DELETE)); - - uniListener.onDataTreeChanged(collection); - - verifyDeleteInterface(uniId); - verifyDeleteInterface(uniId + ".3"); - verifyDeleteInterface(uniId + ".4"); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniInterfaceUpdated() throws Exception { - String uniId = "MMPOP1-ce0-Slot0-Port1"; - String deviceName = "ce0"; - String origInterfaceName = "GigabitEthernet-0-1"; - String updatedInterfaceName = "GigabitEthernet-1-1"; - Uni origUni = evcUni(uniId, deviceName, origInterfaceName); - Uni updatedUni = evcUni(uniId, deviceName, updatedInterfaceName); - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, origInterfaceName, updatedInterfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED)); - - uniListener.onDataTreeChanged(collection); - - Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName)); - verifyWriteInterface(trunkInterface); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniWithVlanInterfaceUpdated() throws Exception { - String uniId = "MMPOP1-ce0-Slot0-Port1"; - String deviceName = "ce0"; - String origInterfaceName = "GigabitEthernet-0-1"; - String updatedInterfaceName = "GigabitEthernet-1-1"; - Uni origUni = evcUni(uniId, deviceName, origInterfaceName, 3, 4); - Uni updatedUni = evcUni(uniId, deviceName, updatedInterfaceName, 3, 4); - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, origInterfaceName, updatedInterfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED)); - - uniListener.onDataTreeChanged(collection); - - Interface trunkInterface = NetvirtUtils.createTrunkInterface(uniId, getParentIfaceName(deviceName, updatedInterfaceName)); - verifyWriteInterface(trunkInterface); - } - - @SuppressWarnings("unchecked") - @Test - public void testUniVlanUpdated() throws Exception { - String uniId = "MMPOP1-ce0-Slot0-Port1"; - String deviceName = "ce0"; - String interfaceName = "GigabitEthernet-1-1"; - Uni origUni = evcUni(uniId, deviceName, interfaceName, 1, 2, 3); - Uni updatedUni = evcUni(uniId, deviceName, interfaceName, 2, 3, 4, 5); - prepareWriteTransaction(); - prepareReadTransaction(uniId, deviceName, interfaceName); - - Collection> collection = new ArrayList(); - collection.add(TestHelper.getUni(origUni, updatedUni, ModificationType.SUBTREE_MODIFIED)); - - uniListener.onDataTreeChanged(collection); - - Interface vlan4Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".4", uniId, 4); - verifyWriteInterface(vlan4Interface); - Interface vlan5Interface = NetvirtUtils.createTrunkMemberInterface(uniId + ".5", uniId, 5); - verifyWriteInterface(vlan5Interface); - verifyDeleteInterface(uniId + ".1"); - - } - - private void verifyWriteInterface(Interface iface) { - verify(transaction).put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(iface.getName()), iface, - true); - verify(transaction).submit(); - } - - private void verifyDeleteInterface(String interfaceName) { - verify(transaction).delete(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier(interfaceName)); - verify(transaction).submit(); - } - - @SuppressWarnings("unchecked") - private void prepareWriteTransaction() { - transaction = mock(WriteTransaction.class); - when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction); - CheckedFuture future = mock(CheckedFuture.class); - when(transaction.submit()).thenReturn(future); - } - - @SuppressWarnings("unchecked") - private void prepareReadTransaction(String uniId, String deviceName, String... interfaceNames) - throws InterruptedException, ExecutionException { - - ReadOnlyTransaction readTransaction = mock(ReadOnlyTransaction.class); - when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction); - - CheckedFuture, ReadFailedException> future = mock( - CheckedFuture.class); - - OngoingStubbing> ongoingStubbing = when(future.get()); - - for (String interfaceName : interfaceNames) - { - ongoingStubbing = ongoingStubbing.thenReturn(Optional.of(uni(uniId, deviceName, interfaceName))); - } - - when(readTransaction.read(LogicalDatastoreType.CONFIGURATION, MefUtils.getUniInstanceIdentifier(uniId))) - .thenReturn(future); - } - - private InstanceIdentifier interfaceInstanceIdentifier(String interfaceName) { - return InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName)) - .build(); - } - - private org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni( - String uniId, String deviceName, String interfaceName) { - Link link = new LinkBuilder().setDevice(new Identifier45(deviceName)).setInterface(interfaceName).build(); - Links links = new LinksBuilder().setLink(Arrays.asList(link)).build(); - PhysicalLayers physicalLayers = new PhysicalLayersBuilder().setLinks(links).build(); - org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder uniBuilder = new org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.UniBuilder() - .setUniId(new Identifier45(uniId)).setPhysicalLayers(physicalLayers); - - return uniBuilder.build(); - } - - private Uni evcUni(String uniId, String deviceName, String interfaceName, long... vlans) { - UniBuilder uniBuilder = new UniBuilder().setUniId(new Identifier45(uniId)); - - if (vlans != null) { - List vlanList = new ArrayList<>(); - for (long vlan : vlans) { - vlanList.add(ceVlan(vlan)); - } - EvcUniCeVlans ceVlans = new EvcUniCeVlansBuilder().setEvcUniCeVlan(vlanList).build(); - uniBuilder.setEvcUniCeVlans(ceVlans); - } - - return uniBuilder.build(); - } - - private EvcUniCeVlan ceVlan(long vlanId) { - return new EvcUniCeVlanBuilder().setVid(new VlanIdType(vlanId)).build(); - } - - private String getParentIfaceName(String deviceName, String interfaceName) { - return deviceName + ":" + interfaceName; - } -} diff --git a/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/TestHelper.java b/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/TestHelper.java deleted file mode 100644 index 71154207..00000000 --- a/netvirt/src/test/java/org/opendaylight/unimgr/mef/netvirt/TestHelper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2016 Hewlett Packard Enterprise, Co. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.unimgr.mef.netvirt; - -import java.util.Collection; - -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType; -import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.evc.unis.Uni; -import org.opendaylight.yangtools.yang.binding.Augmentation; -import org.opendaylight.yangtools.yang.binding.ChildOf; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.Identifiable; -import org.opendaylight.yangtools.yang.binding.Identifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; - -public class TestHelper { - public static final DataTreeModification getUni(final Uni before, final Uni after, ModificationType modificationType) { - final DataTreeIdentifier uniDataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, MefUtils.getEvcUniInstanceIdentifier("testUni")); - final DataObjectModification uniDataTreeObj = new DataObjectModification() { - @Override - public Collection> getModifiedChildren() { - // TODO Auto-generated method stub - return null; - } - @Override - public & ChildOf, K extends Identifier> DataObjectModification getModifiedChildListItem( - Class arg0, K arg1) { - // TODO Auto-generated method stub - return null; - } - @Override - public > DataObjectModification getModifiedChildContainer(Class arg0) { - // TODO Auto-generated method stub - return null; - } - @Override - public DataObjectModification getModifiedChild(PathArgument arg0) { - // TODO Auto-generated method stub - return null; - } - @Override - public & DataObject> DataObjectModification getModifiedAugmentation( - Class arg0) { - // TODO Auto-generated method stub - return null; - } - @Override - public ModificationType getModificationType() { - return modificationType; - } - @Override - public PathArgument getIdentifier() { - // TODO Auto-generated method stub - return null; - } - @Override - public Class getDataType() { - // TODO Auto-generated method stub - return null; - } - @Override - public Uni getDataBefore() { - return before; - } - @Override - public Uni getDataAfter() { - return after; - } - }; - DataTreeModification uniUni = new DataTreeModification() { - @Override - public DataTreeIdentifier getRootPath() { - return uniDataTreeIid; - } - @Override - public DataObjectModification getRootNode() { - return uniDataTreeObj; - } - }; - return uniUni; - } -} -- 2.36.6