JUnits for Interface Manager 27/30527/1
authorFaseela K <faseela.k@ericsson.com>
Thu, 3 Dec 2015 07:31:00 +0000 (13:01 +0530)
committerFaseela K <faseela.k@ericsson.com>
Thu, 3 Dec 2015 07:31:00 +0000 (13:01 +0530)
   - 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 <faseela.k@ericsson.com>
13 files changed:
interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmNodeConnectorListener.java [deleted file]
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java [deleted file]
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceTopologyStateAddHelper.java
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/IfmUtilTest.java
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTest.java [deleted file]
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java [new file with mode: 0644]
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/MockDataChangedEvent.java [deleted file]
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java [new file with mode: 0644]
interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java [new file with mode: 0644]

index 64c98b9f2e189f65cdf83019fbb0aaf1014d5106..f3ba03d3cfd0723b270433ea26f431f47cfa4b0d 100644 (file)
@@ -29,13 +29,9 @@ public interface IInterfaceManager {
     @Deprecated
     public String getEndpointIpForDpn(BigInteger dpnId);
 
-    @Deprecated
-    public List<MatchInfo> getInterfaceIngressRule(String ifName);
-
     @Deprecated
     public List<ActionInfo> 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 (file)
index f5c5ec1..0000000
+++ /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<NodeConnector> implements AutoCloseable{
-    private static final Logger LOG = LoggerFactory.getLogger(IfmNodeConnectorListener.class);
-    private ListenerRegistration<DataChangeListener> 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<NodeConnector> 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<NodeConnector> identifier, NodeConnector node) {
-        LOG.trace("NodeConnectorAdded: key: " + identifier + ", value=" + node );
-        ifManager.processPortAdd(node);
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<NodeConnector> identifier, NodeConnector del) {
-        LOG.trace("NodeConnectorRemoved: key: " + identifier + ", value=" + del );
-        ifManager.processPortDelete(del);
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<NodeConnector> 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 (file)
index bd643ba..0000000
+++ /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<Interface> implements AutoCloseable {
-    private static final Logger LOG = LoggerFactory.getLogger(InterfaceManager.class);
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private final DataBroker broker;
-    private final IdManager idManager;
-    private final Map<NodeConnectorId, String> mapNcToInterfaceName = new ConcurrentHashMap<>();
-    private final Map<NodeId, String> dbDpnEndpoints = new ConcurrentHashMap<>();
-
-    private static final FutureCallback<Void> DEFAULT_CALLBACK =
-                    new FutureCallback<Void>() {
-                        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<Interface> identifier,
-            final Interface imgrInterface) {
-        LOG.trace("Adding interface key: " + identifier + ", value=" + imgrInterface );
-        addInterface(identifier, imgrInterface);
-    }
-
-    private InstanceIdentifier<Interface> buildId(final InstanceIdentifier<Interface> 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<Interface> buildId(String interfaceName) {
-        //TODO Make this generic and move to AbstractDataChangeListener or Utils.
-        InstanceIdentifierBuilder<Interface> idBuilder =
-                InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName));
-        InstanceIdentifier<Interface> id = idBuilder.build();
-        return id;
-    }
-
-
-    private void addInterface(final InstanceIdentifier<Interface> 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<Interface> 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<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id =
-                        IfmUtil.buildStateInterfaceId(interf.getName());
-        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<RpcResult<GetUniqueIdOutput>> result = idManager.getUniqueId(getIdInput);
-            RpcResult<GetUniqueIdOutput> 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<IdPool> id = IfmUtil.getPoolId(IfmConstants.IFM_IDPOOL_NAME);
-        Optional<IdPool> globalPool = read(LogicalDatastoreType.OPERATIONAL, id );
-        Long newIdValue = null;
-        if (globalPool.isPresent()) {
-            IdPool pool = globalPool.get();
-            List<GeneratedIds> 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<NodeConnector> ncIdentifier = InstanceIdentifier.builder(Nodes.class)
-                        .child(Node.class, new NodeKey(nodeId))
-                        .child(NodeConnector.class, new NodeConnectorKey(ncId)).build();
-
-        Optional<NodeConnector> 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<Interface> identifier,
-                              final Interface delInterface) {
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id =
-                        IfmUtil.buildStateInterfaceId(delInterface.getName());
-        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Node> ncIdentifier = InstanceIdentifier.builder(Nodes.class)
-                        .child(Node.class, new NodeKey(nodeId)).build();
-
-        Optional<Node> 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<Interface> identifier,
-                              final Interface original, final Interface update) {
-        InstanceIdentifier<Interface> id = buildId(identifier);
-        Optional<Interface> 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 <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
-            InstanceIdentifier<T> path) {
-
-        ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
-
-        Optional<T> result = Optional.absent();
-        try {
-            result = tx.read(datastoreType, path).get();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        return result;
-    }
-
-    private InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
-    }
-
-    @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface del) {
-        LOG.trace("remove - key: " + identifier + ", value=" + del );
-        delInterface(identifier, del);
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
-        LOG.trace("update - key: " + identifier + ", original=" + original + ", update=" + update );
-        updateInterface(identifier, original, update);
-    }
-
-    protected <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
-                    InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.put(datastoreType, path, data, true);
-        Futures.addCallback(tx.submit(), callback);
-    }
-
-    protected <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
-                    InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.merge(datastoreType, path, data, true);
-        Futures.addCallback(tx.submit(), callback);
-    }
-
-    protected <T extends DataObject> void asyncRemove(LogicalDatastoreType datastoreType,
-                    InstanceIdentifier<T> path, FutureCallback<Void> 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<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id =
-                            IfmUtil.buildStateInterfaceId(ifName);
-            Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Interface> id = buildId(ifName);
-        Optional<Interface> 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<MatchInfo> getInterfaceIngressRule(String ifName) {
-        Interface iface = getInterfaceByIfName(ifName);
-        List<MatchInfo> matches = new ArrayList<MatchInfo>();
-        Class<? extends InterfaceType> 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<? extends TunnelTypeBase> 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<ActionInfo> getInterfaceEgressActions(String ifName) {
-        Interface iface = getInterfaceByIfName(ifName);
-
-        List<ActionInfo> listActionInfo = new ArrayList<ActionInfo>();
-        Class<? extends InterfaceType> 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<? extends TunnelTypeBase> 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;
-    }
-
-}
index ace54f553cffe0d9be4d894bd4a25495bee22475..b2003ff79792881a809f235892b818adf0cc99a8 100644 (file)
@@ -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<MatchInfo> getInterfaceIngressRule(String ifName) {
-        return interfaceManager.getInterfaceIngressRule(ifName);
-    }
-
     @Override
     public List<ActionInfo> getInterfaceEgressActions(String ifName) {
         return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName);
index 8a03e5e11db66e524ca03c694a875767ace77f79..323ac88052362a0612fb5f7ccb8ef9eae3682147 100644 (file)
@@ -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<BridgeEntry> 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);
-        }
-    }
 }
index edb6d27e30dcbdb8336db2319bf94f8b08546a00..bb55c4f7261ef361ef5583b84f39f3fe4fb6f903 100644 (file)
@@ -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<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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;
index 6a4724487f05e8ccb0f412872608919c95d0f158..4b426a09f7a9282a582cf37350649fa05ae9fb17 100644 (file)
@@ -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);
index bc30c10079f2177ed8a8525783b17da39a52616c..ae5ba0ae4d525bf18f39bfc19e13f99667715b35 100644 (file)
@@ -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 (file)
index 4e154f1..0000000
+++ /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<InstanceIdentifier<?>,DataObject> written = new HashMap<>();
-    Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();
-    Set<InstanceIdentifier<?>> removed = new HashSet<>();
-
-    @Mock DataBroker dataBroker;
-    @Mock IdManager idManager;
-    @Mock ListenerRegistration<DataChangeListener> dataChangeListenerRegistration;
-    @Mock ReadOnlyTransaction mockReadTx;
-    @Mock WriteTransaction mockWriteTx;
-
-    MockDataChangedEvent dataChangeEvent;
-    InterfaceManager imgr;
-
-    NodeConnectorId ncId;
-    NodeConnector nc;
-    Interface interf;
-    InstanceIdentifier<Interface> ifIdent;
-    InstanceIdentifier<NodeConnector> ncIdent;
-    InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifsIdent;
-    org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateIface;
-    InstanceIdentifier<IdPool> 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 <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
-                            InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-                /*
-                 * Do nothing for now. Ideally we should capture this information
-                 * and use it to verify results.
-                 */
-                written.put(path, data);
-            }
-            protected <T extends DataObject> void asyncUpdate(LogicalDatastoreType datastoreType,
-                            InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-                updated.put(path, data);
-            }
-
-            protected <T extends DataObject> void asyncRemove(LogicalDatastoreType datastoreType,
-                            InstanceIdentifier<T> path, FutureCallback<Void> 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<Interface> expected = Optional.of(interf);
-        Optional<NodeConnector> 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<Interface> expected = Optional.of(interf);
-        Optional<NodeConnector> expectedNc = Optional.of(nc);
-        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<NodeConnector> 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<? extends InterfaceType> 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 (file)
index 0000000..1bcba00
--- /dev/null
@@ -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<NodeConnector> 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<? extends InterfaceType>) 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<? extends TunnelTypeBase> 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<BridgeInterfaceEntry> buildBridgeEntryId(BigInteger dpn, String interfaceName){
+        BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpn);
+        BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(interfaceName);
+        InstanceIdentifier<BridgeInterfaceEntry> 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<OvsdbBridgeAugmentation> getOvsdbAugmentationInstanceIdentifier(String portName,
+                                                                                                     org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node node) {
+        InstanceIdentifier<OvsdbBridgeAugmentation> 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<TerminationPoint> getTerminationPointId(InstanceIdentifier<?> bridgeIid, String portName){
+        InstanceIdentifier<TerminationPoint> 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<TerminationPoint> 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<String, String> 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<Options> optionsList = new ArrayList<Options>();
+            for (Map.Entry<String, String> 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 (file)
index 0d64eaa..0000000
+++ /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<InstanceIdentifier<?>, DataObject> {
-  Map<InstanceIdentifier<?>,DataObject> created = new HashMap<>();
-  Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();
-  Map<InstanceIdentifier<?>,DataObject> original = new HashMap<>();
-  Set<InstanceIdentifier<?>> removed = new HashSet<>();
-
-  @Override
-  public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {
-      return created;
-  }
-
-  @Override
-  public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() {
-      return updated;
-  }
-
-  @Override
-  public Set<InstanceIdentifier<?>> getRemovedPaths() {
-      return removed;
-  }
-
-  @Override
-  public Map<InstanceIdentifier<?>, 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 (file)
index 0000000..92c0b74
--- /dev/null
@@ -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<Interface> interfaceInstanceIdentifier = null;
+    InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier = null;
+    InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<BridgeRefEntry> dpnBridgeEntryIid = null;
+    BridgeEntryKey bridgeEntryKey = null;
+    BridgeEntry bridgeEntry = null;
+    InstanceIdentifier<BridgeEntry> bridgeEntryIid = null;
+    InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryInstanceIdentifier;
+    BridgeInterfaceEntry bridgeInterfaceEntry;
+    BridgeInterfaceEntryKey bridgeInterfaceEntryKey;
+    BridgeRefEntry bridgeRefEntry = null;
+    OvsdbBridgeAugmentation ovsdbBridgeAugmentation;
+    InstanceIdentifier<OvsdbBridgeAugmentation> ovsdbBridgeAugmentationInstanceIdentifier;
+    InstanceIdentifier<TerminationPoint> terminationPointInstanceIdentifier;
+    TerminationPoint terminationPoint;
+
+    @Mock DataBroker dataBroker;
+    @Mock IdManager idManager;
+    @Mock ListenerRegistration<DataChangeListener> 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<Interface> expectedInterface = Optional.of(tunnelInterfaceEnabled);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<BridgeRefEntry> expectedBridgeRefEntry = Optional.of(bridgeRefEntry);
+        Optional<OvsdbBridgeAugmentation> 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<BridgeRefEntry> expectedBridgeRefEntry = Optional.of(bridgeRefEntry);
+        Optional<BridgeEntry> 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 (file)
index 0000000..4b7adb0
--- /dev/null
@@ -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<DataChangeListener> dataChangeListenerRegistration;
+    @Mock ReadOnlyTransaction mockReadTx;
+    @Mock WriteTransaction mockWriteTx;
+
+    OvsInterfaceConfigAddHelper addHelper;
+    OvsInterfaceConfigRemoveHelper removeHelper;
+
+    NodeConnectorId nodeConnectorId;
+    NodeConnector nodeConnector;
+    Interface vlanInterfaceEnabled;
+    Interface vlanInterfaceDisabled;
+    InstanceIdentifier<Interface> interfaceInstanceIdentifier;
+    InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
+    InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Interface> expectedInterface = Optional.of(vlanInterfaceEnabled);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Interface> expectedInterface = Optional.of(vlanInterfaceEnabled);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Interface> expectedInterface = Optional.of(vlanInterfaceEnabled);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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<Interface> expected = Optional.of(vlanInterfaceEnabled);
+        Optional<NodeConnector> expectedNc = Optional.of(nodeConnector);
+        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 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);
+    }
+}