From 00bba75836165a4ae7a90d8d12ba06512b0d6821 Mon Sep 17 00:00:00 2001 From: Faseela K Date: Thu, 3 Dec 2015 13:01:00 +0530 Subject: [PATCH] JUnits for Interface Manager - Adding junits for vlan and tunnel interface configuration - Fixing some NPEs found during unit testing - Adding some more logs for debugging a random issue found during topology update - Cleaning up unused code Change-Id: Ib5fd2668ff14fe8583ac11c717c4cb23fc787755 Signed-off-by: Faseela K --- .../interfaces/IInterfaceManager.java | 4 - .../IfmNodeConnectorListener.java | 84 --- .../interfacemgr/InterfaceManager.java | 565 ------------------ .../interfacemgr/InterfacemgrProvider.java | 14 - .../OvsInterfaceConfigAddHelper.java | 18 +- .../OvsInterfaceConfigRemoveHelper.java | 27 +- .../OvsInterfaceTopologyStateAddHelper.java | 1 + .../interfacemgr/test/IfmUtilTest.java | 1 - .../test/InterfaceManagerTest.java | 217 ------- .../test/InterfaceManagerTestUtil.java | 236 ++++++++ .../test/MockDataChangedEvent.java | 53 -- .../TunnelInterfaceConfigurationTest.java | 204 +++++++ .../test/VlanInterfaceConfigurationTest.java | 172 ++++++ 13 files changed, 628 insertions(+), 968 deletions(-) delete mode 100644 interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmNodeConnectorListener.java delete mode 100644 interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java delete mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTest.java create mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java delete mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/MockDataChangedEvent.java create mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java create mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java diff --git a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java index 64c98b9f..f3ba03d3 100644 --- a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java +++ b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java @@ -29,13 +29,9 @@ public interface IInterfaceManager { @Deprecated public String getEndpointIpForDpn(BigInteger dpnId); - @Deprecated - public List getInterfaceIngressRule(String ifName); - @Deprecated public List getInterfaceEgressActions(String ifName); @Deprecated public Long getPortForInterface(Interface intf); - } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmNodeConnectorListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmNodeConnectorListener.java deleted file mode 100644 index f5c5ec18..00000000 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmNodeConnectorListener.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr; - -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.vpnservice.AbstractDataChangeListener; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IfmNodeConnectorListener extends AbstractDataChangeListener implements AutoCloseable{ - private static final Logger LOG = LoggerFactory.getLogger(IfmNodeConnectorListener.class); - private ListenerRegistration listenerRegistration; - private final DataBroker broker; - private InterfaceManager ifManager; - - public IfmNodeConnectorListener(final DataBroker db) { - super(NodeConnector.class); - broker = db; - registerListener(db); - } - - public IfmNodeConnectorListener(final DataBroker dataBroker, InterfaceManager interfaceManager) { - this(dataBroker); - ifManager = interfaceManager; - } - - private void registerListener(final DataBroker db) { - try { - listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, - getWildCardPath(), IfmNodeConnectorListener.this, DataChangeScope.SUBTREE); - } catch (final Exception e) { - LOG.error("IfmNodeConnectorListener: DataChange listener registration fail!", e); - throw new IllegalStateException("IfmNodeConnectorListener: registration Listener failed.", e); - } - } - - private InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Nodes.class).child(Node.class).child(NodeConnector.class); - } - - @Override - public void close() throws Exception { - if (listenerRegistration != null) { - try { - listenerRegistration.close(); - } catch (final Exception e) { - LOG.error("Error when cleaning up DataChangeListener.", e); - } - listenerRegistration = null; - } - LOG.info("IfmNodeConnectorListener Closed"); - } - - @Override - protected void add(InstanceIdentifier identifier, NodeConnector node) { - LOG.trace("NodeConnectorAdded: key: " + identifier + ", value=" + node ); - ifManager.processPortAdd(node); - } - - @Override - protected void remove(InstanceIdentifier identifier, NodeConnector del) { - LOG.trace("NodeConnectorRemoved: key: " + identifier + ", value=" + del ); - ifManager.processPortDelete(del); - } - - @Override - protected void update(InstanceIdentifier identifier, NodeConnector original, NodeConnector update) { - ifManager.processPortUpdate(original, update); - } - -} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java deleted file mode 100644 index bd643ba2..00000000 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.idmanager.IdManager; -import org.opendaylight.vpnservice.AbstractDataChangeListener; -import org.opendaylight.vpnservice.mdsalutil.ActionInfo; -import org.opendaylight.vpnservice.mdsalutil.ActionType; -import org.opendaylight.vpnservice.mdsalutil.MatchFieldType; -import org.opendaylight.vpnservice.mdsalutil.MatchInfo; -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.iana._if.type.rev140508.Tunnel; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; -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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.id.pool.GeneratedIds; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class InterfaceManager extends AbstractDataChangeListener implements AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class); - private ListenerRegistration listenerRegistration; - private final DataBroker broker; - private final IdManager idManager; - private final Map mapNcToInterfaceName = new ConcurrentHashMap<>(); - private final Map dbDpnEndpoints = new ConcurrentHashMap<>(); - - private static final FutureCallback DEFAULT_CALLBACK = - new FutureCallback() { - public void onSuccess(Void result) { - LOG.debug("Success in Datastore write operation"); - } - - public void onFailure(Throwable error) { - LOG.error("Error in Datastore write operation", error); - } - }; - - public InterfaceManager(final DataBroker db, final IdManager idmgr) { - super(Interface.class); - broker = db; - idManager = idmgr; - registerListener(db); - } - - @Override - public void close() throws Exception { - if (listenerRegistration != null) { - try { - listenerRegistration.close(); - } catch (final Exception e) { - LOG.error("Error when cleaning up DataChangeListener.", e); - } - listenerRegistration = null; - } - LOG.info("Interface Manager Closed"); - } - - private void registerListener(final DataBroker db) { - try { - listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, - getWildCardPath(), InterfaceManager.this, DataChangeScope.SUBTREE); - } catch (final Exception e) { - LOG.error("InterfaceManager DataChange listener registration fail!", e); - throw new IllegalStateException("InterfaceManager registration Listener failed.", e); - } - } - - @Override - protected void add(final InstanceIdentifier identifier, - final Interface imgrInterface) { - LOG.trace("Adding interface key: " + identifier + ", value=" + imgrInterface ); - addInterface(identifier, imgrInterface); - } - - private InstanceIdentifier buildId(final InstanceIdentifier identifier) { - //TODO Make this generic and move to AbstractDataChangeListener or Utils. - final InterfaceKey key = identifier.firstKeyOf(Interface.class, InterfaceKey.class); - return buildId(key.getName()); - } - - private InstanceIdentifier buildId(String interfaceName) { - //TODO Make this generic and move to AbstractDataChangeListener or Utils. - InstanceIdentifierBuilder idBuilder = - InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName)); - InstanceIdentifier id = idBuilder.build(); - return id; - } - - - private void addInterface(final InstanceIdentifier identifier, - final Interface interf) { - NodeConnector nodeConn = getNodeConnectorFromDataStore(interf); - NodeConnectorId ncId = null; - updateInterfaceState(identifier, interf, nodeConn); - if (nodeConn == null) { - ncId = getNodeConnectorIdFromInterface(interf); - } else { - ncId = nodeConn.getId(); - } - mapNcToInterfaceName.put(ncId, interf.getName()); - if(interf.getType().isAssignableFrom(Tunnel.class)) { - NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); - IfTunnel tunnel = interf.getAugmentation(IfTunnel.class); - dbDpnEndpoints.put(nodeId, tunnel.getTunnelSource().getIpv4Address().getValue()); - LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints); - } - } - - private void updateInterfaceState(InstanceIdentifier identifier, - Interface interf, NodeConnector nodeConn) { - /* Update InterfaceState - * 1. Get interfaces-state Identifier - * 2. Add interface to interfaces-state/interface - * 3. Get interface-id from id manager - * 4. Update interface-state with following: - * admin-status = set to enable value - * oper-status = Down [?] - * if-index = interface-id - */ - InstanceIdentifier id = - IfmUtil.buildStateInterfaceId(interf.getName()); - Optional stateIf = - read(LogicalDatastoreType.OPERATIONAL, id); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface; - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); - if(!stateIf.isPresent()) { - // TODO: Get interface-id from IdManager - String ifName = interf.getName(); - ifaceBuilder.setAdminStatus((interf.isEnabled()) ? org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up : - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Down); - ifaceBuilder.setOperStatus(getOperStatus(nodeConn)); - - ifaceBuilder.setIfIndex(getIfIndex(ifName)).setName(ifName).setType(interf.getType()); - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)); - stateIface = ifaceBuilder.build(); - LOG.trace("Adding stateIface {} and id {} to OPERATIONAL DS", stateIface, id); - asyncWrite(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); - } else { - if(interf.isEnabled() != null) { - ifaceBuilder.setAdminStatus((interf.isEnabled()) ? org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up : - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Down); - } - if(interf.getType() != null) { - ifaceBuilder.setType(interf.getType()); - } - ifaceBuilder.setOperStatus(getOperStatus(nodeConn)); - stateIface = ifaceBuilder.build(); - LOG.trace("updating OPERATIONAL data store with stateIface {} and id {}", stateIface, id); - asyncUpdate(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); - } - } - - private Integer getIfIndex(String ifName) { - GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder() - .setPoolName(IfmConstants.IFM_IDPOOL_NAME).setIdKey(ifName) - .build(); - //TODO: Proper error handling once IdManager code is complete - try { - Future> result = idManager.getUniqueId(getIdInput); - RpcResult rpcResult = result.get(); - return rpcResult.getResult().getIdValue().intValue(); - } catch (NullPointerException | InterruptedException | ExecutionException e) { - LOG.trace("",e); - } - /* This currently returns null, so let us get it from IdManager DS - * TODO: Start-delete-me - */ - - InstanceIdentifier id = IfmUtil.getPoolId(IfmConstants.IFM_IDPOOL_NAME); - Optional globalPool = read(LogicalDatastoreType.OPERATIONAL, id ); - Long newIdValue = null; - if (globalPool.isPresent()) { - IdPool pool = globalPool.get(); - List generatedIds = pool.getGeneratedIds(); - if ((generatedIds != null) && !generatedIds.isEmpty()) { - for (GeneratedIds gen_id : generatedIds) { - if (gen_id.getIdKey().equals(ifName)) { - newIdValue = gen_id.getIdValue(); - LOG.debug("Id {} found for interface %s ", newIdValue, ifName); - return newIdValue.intValue(); - } - } - } - } - //TODO: End-delete-me - LOG.debug("Unable to get valid ifIndex for interface {}", ifName); - return IfmConstants.DEFAULT_IFINDEX; - } - - private OperStatus getOperStatus(NodeConnector nodeConn) { - LOG.trace("nodeConn is {}", nodeConn); - if(nodeConn == null) { - return OperStatus.Down; - }else { - return OperStatus.Up; - } - } - - private NodeConnector getNodeConnectorFromDataStore(Interface interf) { - NodeConnectorId ncId = interf.getAugmentation(BaseIds.class).getOfPortId(); - //TODO: Replace with MDSAL Util method - NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); - InstanceIdentifier ncIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)) - .child(NodeConnector.class, new NodeConnectorKey(ncId)).build(); - - Optional nc = read(LogicalDatastoreType.OPERATIONAL, ncIdentifier); - if(nc.isPresent()) { - NodeConnector nodeConn = nc.get(); - LOG.trace("nodeConnector: {}",nodeConn); - return nodeConn; - } - return null; - } - - private NodeConnectorId getNodeConnectorIdFromInterface(Interface interf) { - return interf.getAugmentation(BaseIds.class).getOfPortId(); - } - - private void delInterface(final InstanceIdentifier identifier, - final Interface delInterface) { - InstanceIdentifier id = - IfmUtil.buildStateInterfaceId(delInterface.getName()); - Optional stateIf = - read(LogicalDatastoreType.OPERATIONAL, id); - if(stateIf.isPresent()) { - LOG.trace("deleting interfaces:state OPERATIONAL data store with id {}", id); - asyncRemove(LogicalDatastoreType.OPERATIONAL, id, DEFAULT_CALLBACK); - NodeConnectorId ncId = getNodeConnectorIdFromInterface(delInterface); - if(ncId != null) { - mapNcToInterfaceName.remove(ncId); - if(delInterface.getType().isAssignableFrom(Tunnel.class)) { - NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); - dbDpnEndpoints.remove(nodeId); - LOG.trace("dbDpnEndpoints: {}",dbDpnEndpoints); - } - } - } - } - - private Node getNodeFromDataStore(Interface interf) { - NodeConnectorId ncId = interf.getAugmentation(BaseIds.class).getOfPortId(); - //TODO: Replace with MDSAL Util method - NodeId nodeId = getNodeIdFromNodeConnectorId(ncId); - InstanceIdentifier ncIdentifier = InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(nodeId)).build(); - - Optional dpn = read(LogicalDatastoreType.OPERATIONAL, ncIdentifier); - if(dpn.isPresent()) { - Node node = dpn.get(); - LOG.trace("node: {}",node); - return node; - } - return null; - } - - private void updateInterface(final InstanceIdentifier identifier, - final Interface original, final Interface update) { - InstanceIdentifier id = buildId(identifier); - Optional port = read(LogicalDatastoreType.CONFIGURATION, id); - if(port.isPresent()) { - Interface interf = port.get(); - NodeConnector nc = getNodeConnectorFromDataStore(update); - updateInterfaceState(identifier, update, nc); - /* - * Alternative is to get from interf and update map irrespective if NCID changed or not. - */ - if(nc != null) { - // Name doesn't change. Is it present in update? - mapNcToInterfaceName.put(nc.getId(), original.getName()); - if(interf.getType().isAssignableFrom(Tunnel.class)) { - NodeId nodeId = getNodeIdFromNodeConnectorId(nc.getId()); - IfTunnel tunnel = interf.getAugmentation(IfTunnel.class); - dbDpnEndpoints.put(nodeId, tunnel.getTunnelSource().getIpv4Address().getValue()); - LOG.trace("dbEndpoints: {}",dbDpnEndpoints); - } - } - } - } - - private Optional read(LogicalDatastoreType datastoreType, - InstanceIdentifier path) { - - ReadOnlyTransaction tx = broker.newReadOnlyTransaction(); - - Optional result = Optional.absent(); - try { - result = tx.read(datastoreType, path).get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - - return result; - } - - private InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(Interfaces.class).child(Interface.class); - } - - @Override - protected void remove(InstanceIdentifier identifier, Interface del) { - LOG.trace("remove - key: " + identifier + ", value=" + del ); - delInterface(identifier, del); - } - - @Override - protected void update(InstanceIdentifier identifier, Interface original, Interface update) { - LOG.trace("update - key: " + identifier + ", original=" + original + ", update=" + update ); - updateInterface(identifier, original, update); - } - - protected void asyncWrite(LogicalDatastoreType datastoreType, - InstanceIdentifier path, T data, FutureCallback callback) { - WriteTransaction tx = broker.newWriteOnlyTransaction(); - tx.put(datastoreType, path, data, true); - Futures.addCallback(tx.submit(), callback); - } - - protected void asyncUpdate(LogicalDatastoreType datastoreType, - InstanceIdentifier path, T data, FutureCallback callback) { - WriteTransaction tx = broker.newWriteOnlyTransaction(); - tx.merge(datastoreType, path, data, true); - Futures.addCallback(tx.submit(), callback); - } - - protected void asyncRemove(LogicalDatastoreType datastoreType, - InstanceIdentifier path, FutureCallback callback) { - WriteTransaction tx = broker.newWriteOnlyTransaction(); - tx.delete(datastoreType, path); - Futures.addCallback(tx.submit(), callback); - } - - void processPortAdd(NodeConnector port) { - NodeConnectorId portId = port.getId(); - FlowCapableNodeConnector ofPort = port.getAugmentation(FlowCapableNodeConnector.class); - LOG.debug("PortAdd: PortId { " + portId.getValue() + "} PortName {" + ofPort.getName() + "}"); - String ifName = this.mapNcToInterfaceName.get(portId); - setInterfaceOperStatus(ifName, OperStatus.Up); - } - - void processPortUpdate(NodeConnector oldPort, NodeConnector update) { - //TODO: Currently nothing to do here. - } - - void processPortDelete(NodeConnector port) { - NodeConnectorId portId = port.getId(); - FlowCapableNodeConnector ofPort = port.getAugmentation(FlowCapableNodeConnector.class); - LOG.debug("PortDelete: PortId { "+portId.getValue()+"} PortName {"+ofPort.getName()+"}"); - String ifName = this.mapNcToInterfaceName.get(portId); - setInterfaceOperStatus(ifName, OperStatus.Down); - } - - private void setInterfaceOperStatus(String ifName, OperStatus opStatus) { - if (ifName != null) { - InstanceIdentifier id = - IfmUtil.buildStateInterfaceId(ifName); - Optional stateIf = - read(LogicalDatastoreType.OPERATIONAL, id); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface; - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); - if (stateIf.isPresent()) { - stateIface = ifaceBuilder.setOperStatus(opStatus).setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)).build(); - LOG.trace("Setting OperStatus for {} to {} in OPERATIONAL DS", ifName, opStatus); - asyncUpdate(LogicalDatastoreType.OPERATIONAL, id, stateIface, DEFAULT_CALLBACK); - } - } - } - - private Interface getInterfaceByIfName(String ifName) { - InstanceIdentifier id = buildId(ifName); - Optional port = read(LogicalDatastoreType.CONFIGURATION, id); - if(port.isPresent()) { - return port.get(); - } - return null; - } - - Long getPortForInterface(String ifName) { - Interface iface = getInterfaceByIfName(ifName); - return getPortNumForInterface(iface); - } - - Long getPortForInterface(Interface intrf) { - try { - NodeConnector port = getNodeConnectorFromDataStore(intrf); - NodeConnectorId id = null; - if(port == null) { - id = getNodeConnectorIdFromInterface(intrf); - } else { - id = port.getId(); - } - String portNo = IfmUtil.getPortNoFromNodeConnectorId(id); - return Long.parseLong(portNo); - } catch (NullPointerException e) { - LOG.error("Port for Interface {} not found", intrf.getName(), e); - } - return 0L; - } - - public BigInteger getDpnForInterface(Interface intrf) { - try { - NodeConnector port = getNodeConnectorFromDataStore(intrf); - NodeConnectorId id = null; - if(port == null) { - id = getNodeConnectorIdFromInterface(intrf); - } else { - id = port.getId(); - } - //TODO: This should be an MDSAL Util method - return new BigInteger(IfmUtil.getDpnFromNodeConnectorId(id)); - } catch (NullPointerException e) { - LOG.error("dpn for Interface {} not found", intrf.getName(), e); - } - return BigInteger.ZERO; - } - - BigInteger getDpnForInterface(String ifName) { - Interface iface = getInterfaceByIfName(ifName); - if(iface != null) { - return getDpnForInterface(iface); - } - LOG.error("Interface {} doesn't exist", ifName); - return BigInteger.ZERO; - } - - String getEndpointIpForDpn(BigInteger dpnId) { - //TODO: This should be MDSAL Util function - NodeId dpnNodeId = IfmUtil.buildDpnNodeId(dpnId); - return dbDpnEndpoints.get(dpnNodeId); - } - - List getInterfaceIngressRule(String ifName) { - Interface iface = getInterfaceByIfName(ifName); - List matches = new ArrayList(); - Class ifType = iface.getType(); - BigInteger dpn = this.getDpnForInterface(ifName); - long portNo = this.getPortNumForInterface(iface).longValue(); - matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {dpn, BigInteger.valueOf(portNo)})); - - if (ifType.isInstance(L2vlan.class)) { - IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); - long vlanVid = vlanIface.getVlanId().getValue().longValue(); - if (vlanVid != 0) { - matches.add(new MatchInfo(MatchFieldType.vlan_vid, - new long[] {vlanVid})); - LOG.trace("L2Vlan: {}",vlanIface); - } - } else if (ifType.isInstance(Tunnel.class)) { - //TODO: Handle different tunnel types - IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); - Class tunnType = ifTunnel.getTunnelInterfaceType(); - LOG.trace("L3Tunnel: {}",ifTunnel); - } else if (ifType.isAssignableFrom(StackedVlan.class)) { - IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); - LOG.trace("StackedVlan: {}",ifStackedVlan); - } else if (ifType.isAssignableFrom(Mpls.class)) { - IfMpls ifMpls = iface.getAugmentation(IfMpls.class); - LOG.trace("Mpls: {}",ifMpls); - } - return matches; - } - - public List getInterfaceEgressActions(String ifName) { - Interface iface = getInterfaceByIfName(ifName); - - List listActionInfo = new ArrayList(); - Class ifType = iface.getType(); - BigInteger dpn = this.getDpnForInterface(ifName); - long portNo = this.getPortNumForInterface(iface).longValue(); - if (iface.isEnabled()) { - - if(ifType.isAssignableFrom(L2vlan.class)) { - IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class); - LOG.trace("L2Vlan: {}",vlanIface); - long vlanVid = (vlanIface == null) ? 0 : vlanIface.getVlanId().getValue().longValue(); - if (vlanVid != 0) { - listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {})); - listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid, - new String[] { Long.toString(vlanVid) })); - } - listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)})); - - } else if (ifType.isAssignableFrom(Tunnel.class)) { - //TODO: Handle different tunnel types - IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); - Class tunnType = ifTunnel.getTunnelInterfaceType(); - LOG.trace("L3Tunnel: {}",ifTunnel); - //TODO: check switch_type and configure accordingly - listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)})); - - } else if (ifType.isAssignableFrom(StackedVlan.class)) { - IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class); - LOG.trace("StackedVlan: {}",ifStackedVlan); - // TODO: TBD - } else if (ifType.isAssignableFrom(Mpls.class)) { - IfMpls ifMpls = iface.getAugmentation(IfMpls.class); - LOG.trace("Mpls: {}",ifMpls); - // TODO: TBD - } - } - return listActionInfo; - - } - - private NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) { - return new NodeId(ncId.getValue().substring(0,ncId.getValue().lastIndexOf(":"))); - } - - private Long getPortNumForInterface(Interface iface) { - try { - NodeConnector port = getNodeConnectorFromDataStore(iface); - FlowCapableNodeConnector ofPort = port.getAugmentation(FlowCapableNodeConnector.class); - return ofPort.getPortNumber().getUint32(); - } catch (Exception e) { - LOG.error("OFPort for Interface {} not found", iface.getName()); - } - return 0L; - } - -} diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index ace54f55..b2003ff7 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -43,9 +43,6 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable private static final Logger LOG = LoggerFactory.getLogger(InterfacemgrProvider.class); private RpcProviderRegistry rpcProviderRegistry; - - private InterfaceManager interfaceManager; - private IfmNodeConnectorListener ifmNcListener; private IdManager idManager; private InterfaceConfigListener interfaceConfigListener; @@ -93,10 +90,6 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable vlanMemberConfigListener = new VlanMemberConfigListener(dataBroker, idManager); vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); - - - /*interfaceManager = new InterfaceManager(dataBroker, idManager); - ifmNcListener = new IfmNodeConnectorListener(dataBroker, interfaceManager);*/ } catch (Exception e) { LOG.error("Error initializing services", e); } @@ -122,8 +115,6 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable @Override public void close() throws Exception { LOG.info("InterfacemgrProvider Closed"); - interfaceManager.close(); - ifmNcListener.close(); interfaceConfigListener.close(); rpcRegistration.close(); } @@ -195,11 +186,6 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable return null; } - @Override - public List getInterfaceIngressRule(String ifName) { - return interfaceManager.getInterfaceIngressRule(ifName); - } - @Override public List getInterfaceEgressActions(String ifName) { return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java index 8a03e5e1..323ac880 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java @@ -137,7 +137,7 @@ public class OvsInterfaceConfigAddHelper { return; } - createBridgeEntryIfNotPresent(dpId, dataBroker, t); + //createBridgeEntryIfNotPresent(dpId, dataBroker, t); BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceNew.getName()); @@ -181,20 +181,4 @@ public class OvsInterfaceConfigAddHelper { t.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); } } - - private static void createBridgeEntryIfNotPresent(BigInteger dpId, - DataBroker dataBroker, WriteTransaction t) { - LOG.debug("creating bridge entry if not present for dpn {}",dpId); - BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); - InstanceIdentifier bridgeEntryInstanceIdentifier = - InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey); - BridgeEntry bridgeEntry = - InterfaceMetaUtils.getBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier, - dataBroker); - if (bridgeEntry == null) { - BridgeEntryBuilder bridgeEntryBuilder = new BridgeEntryBuilder().setKey(bridgeEntryKey) - .setDpid(dpId); - t.put(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, bridgeEntryBuilder.build(), true); - } - } } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java index edb6d27e..bb55c4f7 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java @@ -79,20 +79,21 @@ public class OvsInterfaceConfigRemoveHelper { NodeConnectorId nodeConnectorId = new NodeConnectorId(ncStr); NodeConnector nodeConnector = InterfaceManagerCommonUtils.getNodeConnectorFromInventoryOperDS(nodeConnectorId, dataBroker); - FlowCapableNodeConnector flowCapableNodeConnector = - nodeConnector.getAugmentation(FlowCapableNodeConnector.class); - //State state = flowCapableNodeConnector.getState(); - OperStatus operStatus = flowCapableNodeConnector == null ? OperStatus.Down : OperStatus.Up; - - if (ifState.getOperStatus() != operStatus) { - InstanceIdentifier ifStateId = - IfmUtil.buildStateInterfaceId(interfaceOld.getName()); - InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); - ifaceBuilder.setOperStatus(operStatus); - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceOld.getName())); - t.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); + if(nodeConnector != null) { + FlowCapableNodeConnector flowCapableNodeConnector = + nodeConnector.getAugmentation(FlowCapableNodeConnector.class); + //State state = flowCapableNodeConnector.getState(); + OperStatus operStatus = flowCapableNodeConnector == null ? OperStatus.Down : OperStatus.Up; + + if (ifState.getOperStatus() != operStatus) { + InstanceIdentifier ifStateId = + IfmUtil.buildStateInterfaceId(interfaceOld.getName()); + InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); + ifaceBuilder.setOperStatus(operStatus); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceOld.getName())); + t.merge(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build()); + } } - IfL2vlan ifL2vlan = interfaceOld.getAugmentation(IfL2vlan.class); if (ifL2vlan == null || ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.Trunk) { return; diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java index 6a472448..4b426a09 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java @@ -59,6 +59,7 @@ public class OvsInterfaceTopologyStateAddHelper { String dpId = bridgeNew.getDatapathId().getValue(); String bridgeName = bridgeNew.getBridgeName().getValue(); + LOG.info("adding dpId {} to bridge reference {}", dpId, bridgeNew); if (dpId == null) { LOG.error("Optained null dpid for bridge: {}", bridgeNew); diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/IfmUtilTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/IfmUtilTest.java index bc30c100..ae5ba0ae 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/IfmUtilTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/IfmUtilTest.java @@ -23,7 +23,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeCon public class IfmUtilTest { @Mock NodeConnectorId ncId; - MockDataChangedEvent event; @Before public void setUp() throws Exception { diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTest.java deleted file mode 100644 index 4e154f12..00000000 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTest.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.test; - -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.idmanager.IdManager; -import org.opendaylight.vpnservice.interfacemgr.IfmUtil; -import org.opendaylight.vpnservice.interfacemgr.InterfaceManager; -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.InterfaceType; -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; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIds; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIdsBuilder; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -@RunWith(MockitoJUnitRunner.class) -public class InterfaceManagerTest { - - private String ifName = "dpn1-if0"; - Map,DataObject> written = new HashMap<>(); - Map,DataObject> updated = new HashMap<>(); - Set> removed = new HashSet<>(); - - @Mock DataBroker dataBroker; - @Mock IdManager idManager; - @Mock ListenerRegistration dataChangeListenerRegistration; - @Mock ReadOnlyTransaction mockReadTx; - @Mock WriteTransaction mockWriteTx; - - MockDataChangedEvent dataChangeEvent; - InterfaceManager imgr; - - NodeConnectorId ncId; - NodeConnector nc; - Interface interf; - InstanceIdentifier ifIdent; - InstanceIdentifier ncIdent; - InstanceIdentifier ifsIdent; - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface; - InstanceIdentifier poolIdent; - - @Before - public void setUp() throws Exception { - when(dataBroker.registerDataChangeListener( - any(LogicalDatastoreType.class), - any(InstanceIdentifier.class), - any(DataChangeListener.class), - any(DataChangeScope.class))) - .thenReturn(dataChangeListenerRegistration); - dataChangeEvent = new MockDataChangedEvent(); - imgr = new InterfaceManager(dataBroker, idManager) { - protected void asyncWrite(LogicalDatastoreType datastoreType, - InstanceIdentifier path, T data, FutureCallback callback) { - /* - * Do nothing for now. Ideally we should capture this information - * and use it to verify results. - */ - written.put(path, data); - } - protected void asyncUpdate(LogicalDatastoreType datastoreType, - InstanceIdentifier path, T data, FutureCallback callback) { - updated.put(path, data); - } - - protected void asyncRemove(LogicalDatastoreType datastoreType, - InstanceIdentifier path, FutureCallback callback) { - removed.add(path); - } - - }; - setupMocks(); - } - - private void setupMocks() { - ncId = new NodeConnectorId("openflow:10:111"); - nc = buildNodeConnector(ncId); - interf = buildInterface(ifName, "Test Interface1", true, L2vlan.class, ncId); - ifIdent = IfmUtil.buildId(ifName); - ncIdent = getNcIdent("openflow:10",ncId); - ifsIdent = IfmUtil.buildStateInterfaceId(interf.getName()); - stateIface = buildStateInterface(ifName); - poolIdent = IfmUtil.getPoolId("interfaces"); - - // Setup mocks - when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx); - when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx); - } - - @Test - public void testAdd() { - Optional expected = Optional.of(interf); - Optional expectedNc = Optional.of(nc); - doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read( - LogicalDatastoreType.CONFIGURATION, ifIdent); - doReturn(Futures.immediateCheckedFuture(expectedNc)).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, ncIdent); - doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, ifsIdent); - doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, poolIdent); - - dataChangeEvent.created.put(IfmUtil.buildId(ifName), interf); - imgr.onDataChanged(dataChangeEvent); - //Add some verifications - assertEquals(1,written.size()); - assertEquals(0,updated.size()); - assertEquals(0, removed.size()); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface writtenIface = - (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface)written.get(ifsIdent); - assertEquals(stateIface.getKey(), writtenIface.getKey()); - assertEquals(65536, writtenIface.getIfIndex().intValue()); - assertEquals(OperStatus.Up, writtenIface.getOperStatus()); - } - - @Test - public void testUpdate() { - Optional expected = Optional.of(interf); - Optional expectedNc = Optional.of(nc); - Optional expectedStateIf = Optional.of(stateIface); - doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read( - LogicalDatastoreType.CONFIGURATION, ifIdent); - doReturn(Futures.immediateCheckedFuture(expectedNc)).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, ncIdent); - doReturn(Futures.immediateCheckedFuture(expectedStateIf)).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, ifsIdent); - doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( - LogicalDatastoreType.OPERATIONAL, poolIdent); - dataChangeEvent.original.put(IfmUtil.buildId(ifName), interf); - dataChangeEvent.updated.put(IfmUtil.buildId(ifName), interf); - imgr.onDataChanged(dataChangeEvent); - //Add some verifications - - assertEquals(0,written.size()); - assertEquals(1,updated.size()); - assertEquals(0, removed.size()); - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface updatedIface = - (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface)updated.get(ifsIdent); - assertNotEquals(stateIface.getKey(),updatedIface.getKey()); - assertNull(updatedIface.getIfIndex()); - assertEquals(OperStatus.Up, updatedIface.getOperStatus()); - } - - private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface( - String ifName) { - org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = - new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); - ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)); - return ifaceBuilder.build(); - } - - private InstanceIdentifier getNcIdent(String nodeKey, NodeConnectorId ncId) { - return InstanceIdentifier.builder(Nodes.class) - .child(Node.class, new NodeKey(new NodeId(nodeKey))) - .child(NodeConnector.class, new NodeConnectorKey(ncId)) - .build(); - } - - private Interface buildInterface(String ifName, String desc, boolean enabled, Class ifType, NodeConnectorId ncId) { - InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName) - .setDescription(desc).setEnabled(enabled).setType(ifType); - - BaseIds baseId = new BaseIdsBuilder().setOfPortId(ncId).build(); - builder.addAugmentation(BaseIds.class, baseId); - return builder.build(); - } - - private NodeConnector buildNodeConnector(NodeConnectorId ncId) { - NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder() - .setId(ncId) - .setKey(new NodeConnectorKey(ncId)); - return ncBuilder.build(); - } - -} diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java new file mode 100644 index 00000000..1bcba00d --- /dev/null +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.test; + +import com.google.common.base.Optional; +import com.google.common.collect.Maps; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.vpnservice.interfacemgr.IfmConstants; +import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.utilities.SouthboundUtils; +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.iana._if.type.rev140508.Tunnel; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; +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.InterfacesState; +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; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*; +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.vpnservice.idmanager.rev150403.Pools; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPoolKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +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.node.TerminationPoint; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class InterfaceManagerTestUtil { + public static final String interfaceName = "s1-eth1"; + public static final String tunnelInterfaceName = "s2-gre1"; + public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1")); + + public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface buildStateInterface( + String ifName, NodeConnectorId ncId) { + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = + new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifName)); + ifaceBuilder.setOperStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus.Up); + ifaceBuilder.setLowerLayerIf(Arrays.asList(ncId.getValue())); + return ifaceBuilder.build(); + } + + public static InstanceIdentifier getNcIdent(String nodeKey, NodeConnectorId ncId) { + return InstanceIdentifier.builder(Nodes.class) + .child(Node.class, new NodeKey(new NodeId(nodeKey))) + .child(NodeConnector.class, new NodeConnectorKey(ncId)) + .build(); + } + + public static Interface buildInterface(String ifName, String desc, boolean enabled, Object ifType, + BigInteger dpn) { + InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName) + .setDescription(desc).setEnabled(enabled).setType((Class) ifType); + ParentRefs parentRefs = new ParentRefsBuilder().setDatapathNodeIdentifier(dpn).build(); + builder.addAugmentation(ParentRefs.class, parentRefs); + if(ifType.equals(L2vlan.class)){ + IfL2vlan l2vlan = new IfL2vlanBuilder().setVlanId(VlanId.getDefaultInstance("0")) + .setL2vlanMode(IfL2vlan.L2vlanMode.Access).build(); + builder.addAugmentation(IfL2vlan.class, l2vlan); + }else if(ifType.equals(IfTunnel.class)){ + IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(null).setTunnelGateway(null).setTunnelSource(null) + .setTunnelInterfaceType(null).build(); + builder.addAugmentation(IfTunnel.class, tunnel); + } + return builder.build(); + } + + public static Interface buildTunnelInterface(BigInteger dpn, String ifName, String desc, boolean enabled, Class tunType, + String remoteIpStr, String localIpStr) { + InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName) + .setDescription(desc).setEnabled(enabled).setType(Tunnel.class); + ParentRefs parentRefs = new ParentRefsBuilder().setDatapathNodeIdentifier(dpn).build(); + builder.addAugmentation(ParentRefs.class, parentRefs); + IpAddress remoteIp = new IpAddress(Ipv4Address.getDefaultInstance(remoteIpStr)); + IpAddress localIp = new IpAddress(Ipv4Address.getDefaultInstance(localIpStr)); + IfTunnel tunnel = new IfTunnelBuilder().setTunnelDestination(remoteIp).setTunnelGateway(localIp).setTunnelSource(localIp) + .setTunnelInterfaceType( tunType).build(); + builder.addAugmentation(IfTunnel.class, tunnel); + return builder.build(); + } + + public static NodeConnector buildNodeConnector(NodeConnectorId ncId) { + NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder() + .setId(ncId) + .setKey(new NodeConnectorKey(ncId)); + return ncBuilder.build(); + } + + public static NodeConnectorId buildNodeConnectorId(BigInteger dpn, long portNo) { + return new NodeConnectorId(buildNodeConnectorString(dpn, portNo)); + } + + public static String buildNodeConnectorString(BigInteger dpn, long portNo){ + return new StringBuffer().append(IfmConstants.OF_URI_PREFIX). + append(dpn).append(IfmConstants.OF_URI_SEPARATOR). + append(portNo).toString(); + } + + public static InstanceIdentifier buildBridgeEntryId(BigInteger dpn, String interfaceName){ + BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpn); + BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceName); + InstanceIdentifier bridgeInterfaceEntryIid = + InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, bridgeInterfaceEntryKey); + return bridgeInterfaceEntryIid; + } + + public static BridgeEntry buildBridgeEntry(BigInteger dpn, BridgeInterfaceEntry bridgeInterfaceEntry){ + BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpn); + BridgeEntry bridgeEntry = new BridgeEntryBuilder().setKey(bridgeEntryKey).setDpid(dpn). + setBridgeInterfaceEntry(Arrays.asList(bridgeInterfaceEntry)).build(); + return bridgeEntry; + } + + public static BridgeInterfaceEntry buildBridgeInterfaceEntry(BigInteger dpn, String interfaceName){ + BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpn); + BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceName); + BridgeInterfaceEntryBuilder entryBuilder = new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey) + .setInterfaceName(interfaceName); + return entryBuilder.build(); + } + + public static InstanceIdentifier getOvsdbAugmentationInstanceIdentifier(String portName, + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node node) { + InstanceIdentifier ovsdbBridgeAugmentationInstanceIdentifier = InstanceIdentifier + .create(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology.class) + .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID)) + .child(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class,node.getKey()) + .augmentation(OvsdbBridgeAugmentation.class); + return ovsdbBridgeAugmentationInstanceIdentifier; + } + + public static OvsdbBridgeAugmentation getOvsdbBridgeRef(String bridgeName){ + OvsdbBridgeAugmentationBuilder builder = new OvsdbBridgeAugmentationBuilder().setBridgeName(new OvsdbBridgeName(bridgeName)); + return builder.build(); + } + + public static InstanceIdentifier getTerminationPointId(InstanceIdentifier bridgeIid, String portName){ + InstanceIdentifier tpIid = SouthboundUtils.createTerminationPointInstanceIdentifier( + InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class)), portName); + return tpIid; + } + + public static TerminationPoint getTerminationPoint(InstanceIdentifier bridgeIid, OvsdbBridgeAugmentation bridgeNode, + String portName, int vlanId, Class type, + Interface iface) { + InstanceIdentifier tpIid = SouthboundUtils.createTerminationPointInstanceIdentifier( + InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class)), portName); + OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder(); + + tpAugmentationBuilder.setName(portName); + + if (type != null) { + tpAugmentationBuilder.setInterfaceType(type); + } + IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class); + Map options = Maps.newHashMap(); + options.put("key", "flow"); + + IpAddress localIp = ifTunnel.getTunnelSource(); + options.put("local_ip", localIp.getIpv4Address().getValue()); + + IpAddress remoteIp = ifTunnel.getTunnelDestination(); + options.put("remote_ip", remoteIp.getIpv4Address().getValue()); + + if (options != null) { + List optionsList = new ArrayList(); + for (Map.Entry entry : options.entrySet()) { + OptionsBuilder optionsBuilder = new OptionsBuilder(); + optionsBuilder.setKey(new OptionsKey(entry.getKey())); + optionsBuilder.setOption(entry.getKey()); + optionsBuilder.setValue(entry.getValue()); + optionsList.add(optionsBuilder.build()); + } + tpAugmentationBuilder.setOptions(optionsList); + } + + if (vlanId != 0) { + tpAugmentationBuilder.setVlanMode(OvsdbPortInterfaceAttributes.VlanMode.Access); + tpAugmentationBuilder.setVlanTag(new VlanId(vlanId)); + } + + TerminationPointBuilder tpBuilder = new TerminationPointBuilder(); + tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid)); + tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build()); + return tpBuilder.build(); + } +} diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/MockDataChangedEvent.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/MockDataChangedEvent.java deleted file mode 100644 index 0d64eaac..00000000 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/MockDataChangedEvent.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.test; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -class MockDataChangedEvent implements AsyncDataChangeEvent, DataObject> { - Map,DataObject> created = new HashMap<>(); - Map,DataObject> updated = new HashMap<>(); - Map,DataObject> original = new HashMap<>(); - Set> removed = new HashSet<>(); - - @Override - public Map, DataObject> getCreatedData() { - return created; - } - - @Override - public Map, DataObject> getUpdatedData() { - return updated; - } - - @Override - public Set> getRemovedPaths() { - return removed; - } - - @Override - public Map, DataObject> getOriginalData() { - return original; - } - - @Override - public DataObject getOriginalSubtree() { - throw new UnsupportedOperationException("Not implemented by mock"); - } - - @Override - public DataObject getUpdatedSubtree() { - throw new UnsupportedOperationException("Not implemented by mock"); - } -} diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java new file mode 100644 index 00000000..92c0b743 --- /dev/null +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.test; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.Futures; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.idmanager.IdManager; +import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper; +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.state.Interface.OperStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.InterfaceTypeGre; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; +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.node.TerminationPoint; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +import java.math.BigInteger; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class TunnelInterfaceConfigurationTest { + BigInteger dpId = BigInteger.valueOf(1); + NodeConnectorId nodeConnectorId = null; + NodeConnector nodeConnector = null; + Interface tunnelInterfaceEnabled = null; + Interface tunnelInterfaceDisabled = null; + ParentRefs parentRefs = null; + InstanceIdentifier interfaceInstanceIdentifier = null; + InstanceIdentifier nodeConnectorInstanceIdentifier = null; + InstanceIdentifier interfaceStateIdentifier = null; + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateInterface; + + org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge.ref.info.BridgeRefEntryKey BridgeRefEntryKey; + InstanceIdentifier dpnBridgeEntryIid = null; + BridgeEntryKey bridgeEntryKey = null; + BridgeEntry bridgeEntry = null; + InstanceIdentifier bridgeEntryIid = null; + InstanceIdentifier bridgeInterfaceEntryInstanceIdentifier; + BridgeInterfaceEntry bridgeInterfaceEntry; + BridgeInterfaceEntryKey bridgeInterfaceEntryKey; + BridgeRefEntry bridgeRefEntry = null; + OvsdbBridgeAugmentation ovsdbBridgeAugmentation; + InstanceIdentifier ovsdbBridgeAugmentationInstanceIdentifier; + InstanceIdentifier terminationPointInstanceIdentifier; + TerminationPoint terminationPoint; + + @Mock DataBroker dataBroker; + @Mock IdManager idManager; + @Mock ListenerRegistration dataChangeListenerRegistration; + @Mock ReadOnlyTransaction mockReadTx; + @Mock WriteTransaction mockWriteTx; + + OvsInterfaceConfigAddHelper addHelper; + OvsInterfaceConfigRemoveHelper removeHelper; + + @Before + public void setUp() throws Exception { + when(dataBroker.registerDataChangeListener( + any(LogicalDatastoreType.class), + any(InstanceIdentifier.class), + any(DataChangeListener.class), + any(DataChangeScope.class))) + .thenReturn(dataChangeListenerRegistration); + setupMocks(); + } + + private void setupMocks() { + nodeConnectorId = InterfaceManagerTestUtil.buildNodeConnectorId(BigInteger.valueOf(1), 2); + nodeConnector = InterfaceManagerTestUtil.buildNodeConnector(nodeConnectorId); + tunnelInterfaceEnabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.tunnelInterfaceName, "Test Interface1", true, TunnelTypeGre.class + , "192.168.56.101", "192.168.56.102"); + tunnelInterfaceDisabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.tunnelInterfaceName, "Test Interface1", false, TunnelTypeGre.class + , "192.168.56.101", "192.168.56.102"); + interfaceInstanceIdentifier = IfmUtil.buildId(InterfaceManagerTestUtil.tunnelInterfaceName); + nodeConnectorInstanceIdentifier = InterfaceManagerTestUtil.getNcIdent("openflow:1", nodeConnectorId); + interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(tunnelInterfaceEnabled.getName()); + stateInterface = InterfaceManagerTestUtil.buildStateInterface(InterfaceManagerTestUtil.tunnelInterfaceName, nodeConnectorId); + parentRefs = tunnelInterfaceEnabled.getAugmentation(ParentRefs.class); + BridgeRefEntryKey = new BridgeRefEntryKey(parentRefs.getDatapathNodeIdentifier()); + dpnBridgeEntryIid = InterfaceMetaUtils.getBridgeRefEntryIdentifier(BridgeRefEntryKey); + bridgeEntryKey = new BridgeEntryKey(parentRefs.getDatapathNodeIdentifier()); + + bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(InterfaceManagerTestUtil.tunnelInterfaceName); + bridgeInterfaceEntryInstanceIdentifier = InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, + bridgeInterfaceEntryKey); + bridgeInterfaceEntry = + new BridgeInterfaceEntryBuilder().setKey(bridgeInterfaceEntryKey) + .setInterfaceName(tunnelInterfaceEnabled.getName()).build(); + + bridgeEntryIid = InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey); + bridgeEntry = InterfaceManagerTestUtil.buildBridgeEntry(dpId, bridgeInterfaceEntry); + + Node node = new NodeBuilder().setKey(null).setNodeId(null).build(); + ovsdbBridgeAugmentationInstanceIdentifier = InterfaceManagerTestUtil.getOvsdbAugmentationInstanceIdentifier( + InterfaceManagerTestUtil.tunnelInterfaceName, node); + ovsdbBridgeAugmentation = InterfaceManagerTestUtil.getOvsdbBridgeRef("s1"); + bridgeRefEntry = new BridgeRefEntryBuilder().setKey(BridgeRefEntryKey).setDpid(dpId). + setBridgeReference(new OvsdbBridgeRef(ovsdbBridgeAugmentationInstanceIdentifier)).build(); + + terminationPointInstanceIdentifier = InterfaceManagerTestUtil.getTerminationPointId(ovsdbBridgeAugmentationInstanceIdentifier, + InterfaceManagerTestUtil.tunnelInterfaceName); + terminationPoint = InterfaceManagerTestUtil.getTerminationPoint(ovsdbBridgeAugmentationInstanceIdentifier, ovsdbBridgeAugmentation, + InterfaceManagerTestUtil.tunnelInterfaceName, 0, InterfaceTypeGre.class, tunnelInterfaceEnabled); + // Setup mocks + when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx); + when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx); + } + + @Test + public void testAddGreInterfaceWhenSwitchIsNotConnected() { + Optional expectedInterface = Optional.of(tunnelInterfaceEnabled); + Optional expectedStateInterface = Optional.of(stateInterface); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid); + + addHelper.addConfiguration(dataBroker, parentRefs, tunnelInterfaceEnabled, idManager); + + //Add some verifications + verify(mockWriteTx).put(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryInstanceIdentifier, bridgeInterfaceEntry, true); + } + + @Test + public void testAddGreInterfaceWhenSwitchIsConnected() { + Optional expectedBridgeRefEntry = Optional.of(bridgeRefEntry); + Optional expectedOvsdbBridgeAugmentation = Optional.of(ovsdbBridgeAugmentation); + + doReturn(Futures.immediateCheckedFuture(expectedBridgeRefEntry)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid); + doReturn(Futures.immediateCheckedFuture(expectedOvsdbBridgeAugmentation)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, ovsdbBridgeAugmentationInstanceIdentifier); + + addHelper.addConfiguration(dataBroker, parentRefs, tunnelInterfaceEnabled, idManager); + + //Add some verifications + verify(mockWriteTx).put(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryInstanceIdentifier , + bridgeInterfaceEntry, true); + verify(mockWriteTx).put(LogicalDatastoreType.CONFIGURATION, terminationPointInstanceIdentifier , + terminationPoint, true); + } + + + @Test + public void testDeleteGreInterfaceWhenSwitchIsConnected() { + Optional expectedBridgeRefEntry = Optional.of(bridgeRefEntry); + Optional expectedBridgeEntry = Optional.of(bridgeEntry); + doReturn(Futures.immediateCheckedFuture(expectedBridgeRefEntry)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid); + doReturn(Futures.immediateCheckedFuture(expectedBridgeEntry)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, bridgeEntryIid); + + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + ifaceBuilder.setOperStatus(OperStatus.Down); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(tunnelInterfaceEnabled.getName())); + stateInterface = ifaceBuilder.build(); + + removeHelper.removeConfiguration(dataBroker, tunnelInterfaceEnabled, idManager, parentRefs); + + //Add some verifications + verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION, bridgeEntryIid); + verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION, terminationPointInstanceIdentifier); + } +} diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java new file mode 100644 index 00000000..4b7adb0f --- /dev/null +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr.test; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.Futures; + +import java.math.BigInteger; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.idmanager.IdManager; +import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper; +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.state.Interface.OperStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +@RunWith(MockitoJUnitRunner.class) +public class VlanInterfaceConfigurationTest { + + @Mock + DataBroker dataBroker; + @Mock IdManager idManager; + @Mock ListenerRegistration dataChangeListenerRegistration; + @Mock ReadOnlyTransaction mockReadTx; + @Mock WriteTransaction mockWriteTx; + + OvsInterfaceConfigAddHelper addHelper; + OvsInterfaceConfigRemoveHelper removeHelper; + + NodeConnectorId nodeConnectorId; + NodeConnector nodeConnector; + Interface vlanInterfaceEnabled; + Interface vlanInterfaceDisabled; + InstanceIdentifier interfaceInstanceIdentifier; + InstanceIdentifier nodeConnectorInstanceIdentifier; + InstanceIdentifier interfaceStateIdentifier; + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateInterface; + + @Before + public void setUp() throws Exception { + when(dataBroker.registerDataChangeListener( + any(LogicalDatastoreType.class), + any(InstanceIdentifier.class), + any(DataChangeListener.class), + any(DataChangeScope.class))) + .thenReturn(dataChangeListenerRegistration); + setupMocks(); + } + + @After + public void cleanUp(){ + } + + private void setupMocks() { + nodeConnectorId = InterfaceManagerTestUtil.buildNodeConnectorId(BigInteger.valueOf(1), 1); + nodeConnector = InterfaceManagerTestUtil.buildNodeConnector(nodeConnectorId); + vlanInterfaceEnabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", true, L2vlan.class, BigInteger.valueOf(1)); + vlanInterfaceDisabled = InterfaceManagerTestUtil.buildInterface(InterfaceManagerTestUtil.interfaceName, "Test Vlan Interface1", false, L2vlan.class, BigInteger.valueOf(1)); + interfaceInstanceIdentifier = IfmUtil.buildId(InterfaceManagerTestUtil.interfaceName); + nodeConnectorInstanceIdentifier = InterfaceManagerTestUtil.getNcIdent("openflow:1", nodeConnectorId); + interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(vlanInterfaceEnabled.getName()); + stateInterface = InterfaceManagerTestUtil.buildStateInterface(InterfaceManagerTestUtil.interfaceName, nodeConnectorId); + + // Setup mocks + when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx); + when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx); + } + + @Test + public void testAddVlanInterfaceWhenSwitchIsNotConnected() { + Optional expectedInterface = Optional.of(vlanInterfaceEnabled); + Optional expectedStateInterface = Optional.of(stateInterface); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + + addHelper.addConfiguration(dataBroker, null, vlanInterfaceEnabled, idManager); + + //Nothing to verify, since when switch is not connected we don't do any datastore operation + + } + + @Test + public void testAddVlanInterfaceWhenSwitchIsConnected() { + Optional expectedInterface = Optional.of(vlanInterfaceEnabled); + Optional expectedStateInterface = Optional.of(stateInterface); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + + addHelper.addConfiguration(dataBroker, null, vlanInterfaceEnabled, idManager); + + //Nothing to verify, since when adminstate is enabled and switch opstate is already up, + //we don't do any datastore operation + } + + @Test + public void testAddVlanInterfaceWhenAdminStateDisabled() { + Optional expectedInterface = Optional.of(vlanInterfaceEnabled); + Optional expectedStateInterface = + Optional.of(stateInterface); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + ifaceBuilder.setOperStatus(OperStatus.Down); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(vlanInterfaceEnabled.getName())); + stateInterface = ifaceBuilder.build(); + + addHelper.addConfiguration(dataBroker, null, vlanInterfaceDisabled, idManager); + + //verification + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, stateInterface); + } + + @Test + public void testDeleteVlanInterface() { + Optional expected = Optional.of(vlanInterfaceEnabled); + Optional expectedNc = Optional.of(nodeConnector); + Optional expectedStateIf = Optional.of(stateInterface); + doReturn(Futures.immediateCheckedFuture(expected)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedNc)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, nodeConnectorInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedStateIf)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + ifaceBuilder.setOperStatus(OperStatus.Down); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(vlanInterfaceEnabled.getName())); + stateInterface = ifaceBuilder.build(); + + removeHelper.removeConfiguration(dataBroker, vlanInterfaceEnabled, idManager, null); + + //verification + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, stateInterface); + } +} -- 2.36.6