Merge "Adding Unit Test Cases for MDSALUTIL- updated"
authorVivek Srivastava <vivek.v.srivastava@ericsson.com>
Mon, 4 May 2015 14:19:32 +0000 (14:19 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 4 May 2015 14:19:32 +0000 (14:19 +0000)
interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfaceManager.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java
nexthopmgr/nexthopmgr-impl/pom.xml
nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/OdlInterfaceChangeListener.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/VpnInterfaceChangeListener.java
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java
nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang

index 2680e04e6e0cd6cf3d7214777dfe69e72dd4eb33..206e6e1170dcbde74b4a68f341757d0521689f34 100644 (file)
@@ -1,7 +1,7 @@
 package org.opendaylight.vpnservice.interfacemgr.interfaces;
 
 import java.util.List;
-import org.opendaylight.vpnservice.mdsalutil.InstructionInfo;
+import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
 import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
 
 public interface IInterfaceManager {
@@ -10,6 +10,6 @@ public interface IInterfaceManager {
     public long getDpnForInterface(String ifName);
     public String getEndpointIpForDpn(long dpnId);
     public List<MatchInfo> getInterfaceIngressRule(String ifName);
-    public List<InstructionInfo> getInterfaceEgressActions(String ifName);
+    public List<ActionInfo> getInterfaceEgressActions(String ifName);
 
 }
\ No newline at end of file
index ba531b6f25b20cb72fc51b48535f9570e1f4620b..8f0a4aa381c96369ef4d46952e6d783ad497e407 100644 (file)
@@ -7,15 +7,18 @@
  */
 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 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;
+
 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;
@@ -25,8 +28,7 @@ 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.InstructionInfo;
-import org.opendaylight.vpnservice.mdsalutil.InstructionType;
+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;
@@ -138,10 +140,13 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
         return id;
     }
 
-    private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> buildStateInterfaceId(String interfaceName) {
+    private InstanceIdentifier
+        <org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 
+        buildStateInterfaceId(String interfaceName) {
         //TODO Make this generic and move to AbstractDataChangeListener or Utils.
-        InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> idBuilder =
-                InstanceIdentifier.builder(InterfacesState.class)
+        InstanceIdentifierBuilder
+            <org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> 
+            idBuilder = InstanceIdentifier.builder(InterfacesState.class)
                 .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.class,
                                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey(interfaceName));
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> id = idBuilder.build();
@@ -470,19 +475,22 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
         return dbDpnEndpoints.get(dpnNodeId);
     }
 
-    List<MatchInfo> getInterfaceIngressRule(String ifName){
+    List<MatchInfo> getInterfaceIngressRule(String ifName) {
         Interface iface = getInterfaceByIfName(ifName);
         List<MatchInfo> matches = new ArrayList<MatchInfo>();
         Class<? extends InterfaceType> ifType = iface.getType();
         long dpn = this.getDpnForInterface(ifName);
         long portNo = this.getPortNumForInterface(iface).longValue();
         matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {dpn, portNo}));
-        if(ifType.getClass().isInstance(L2vlan.class)) {
+        if (ifType.isInstance(L2vlan.class)) {
             IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class);
-            matches.add(new MatchInfo(MatchFieldType.vlan_vid, 
-                            new long[] {vlanIface.getVlanId().longValue()}));
-            LOG.trace("L2Vlan: {}",vlanIface);
-        } else if (ifType.getClass().isInstance(L3tunnel.class)) {
+            long vlanVid = vlanIface.getVlanId().longValue();
+            if (vlanVid != 0) {
+                matches.add(new MatchInfo(MatchFieldType.vlan_vid, 
+                            new long[] {vlanVid}));
+                LOG.trace("L2Vlan: {}",vlanIface);
+            }
+        } else if (ifType.isInstance(L3tunnel.class)) {
             //TODO: Handle different tunnel types
             IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class);
             Class<? extends TunnelTypeBase> tunnType = ifL3Tunnel.getTunnelType();
@@ -497,22 +505,47 @@ public class InterfaceManager extends AbstractDataChangeListener<Interface> impl
         return matches;
     }
 
-    public List<InstructionInfo> getInterfaceEgressActions(String ifName) {
+    public List<ActionInfo> getInterfaceEgressActions(String ifName) {
         Interface iface = getInterfaceByIfName(ifName);
 
-        List<InstructionInfo> instructions = new ArrayList<InstructionInfo>();
-        List<ActionInfo> actionInfos = new ArrayList<ActionInfo>();
+        List<ActionInfo> listActionInfo = new ArrayList<ActionInfo>();
         Class<? extends InterfaceType> ifType = iface.getType();
         long dpn = this.getDpnForInterface(ifName);
         long portNo = this.getPortNumForInterface(iface).longValue();
-        instructions.add(new InstructionInfo(InstructionType.apply_actions,
-                        actionInfos));
-        /*TODO: Refer getInterfaceIngressRules on how to get interface details
-                for different types
-        */
 
+        if (iface.isEnabled()) {
+
+            if(ifType.isInstance(L2vlan.class)) {
+                IfL2vlan vlanIface = iface.getAugmentation(IfL2vlan.class);
+                long vlanVid = vlanIface.getVlanId();
+                LOG.trace("L2Vlan: {}",vlanIface);
+                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.isInstance(L3tunnel.class)) {
+                //TODO: Handle different tunnel types
+                IfL3tunnel ifL3Tunnel = iface.getAugmentation(IfL3tunnel.class);
+                Class<? extends TunnelTypeBase> tunnType = ifL3Tunnel.getTunnelType();
+                LOG.trace("L3Tunnel: {}",ifL3Tunnel);
+                //TODO: check switch_type and configure accordingly
+                listActionInfo.add(new ActionInfo(ActionType.output, new String[] { Long.toString(portNo)}));
+                
+            } else if (ifType.isInstance(StackedVlan.class)) {
+                IfStackedVlan ifStackedVlan = iface.getAugmentation(IfStackedVlan.class);
+                LOG.trace("StackedVlan: {}",ifStackedVlan);
+                // TBD
+            } else if (ifType.isInstance(Mpls.class)) {
+                IfMpls ifMpls = iface.getAugmentation(IfMpls.class);
+                LOG.trace("Mpls: {}",ifMpls);
+                // TBD
+            }
+        }
+        return listActionInfo;
 
-        return instructions;
     }
 
     private NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
index f177f17b07ac25a87eed75f13c0f6fafc4d8bfe0..01bf1f7ca662c11d96160ccb72a0037e577bdfd9 100644 (file)
@@ -8,10 +8,11 @@
 package org.opendaylight.vpnservice.interfacemgr;
 
 import java.util.concurrent.ExecutionException;
-
 import java.math.BigInteger;
 import java.util.List;
 import java.util.concurrent.Future;
+import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
+import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
@@ -92,7 +93,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
     }
 
     @Override
-    public List<InstructionInfo> getInterfaceEgressActions(String ifName) {
+    public List<ActionInfo> getInterfaceEgressActions(String ifName) {
         return interfaceManager.getInterfaceEgressActions(ifName);
     }
 }
index c519fe5e887246d970aa86a98d94bed8d7233c36..a6f04dd24895268fea1cb83ddf2b154ba86f0654 100644 (file)
@@ -31,11 +31,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>interfacemgr-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>idmanager-api</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.vpnservice</groupId>
+      <artifactId>idmanager-impl</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>nexthopmgr-api</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>mdsalutil-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
 
     <!-- Testing Dependencies -->
     <dependency>
index c44c0b3b0fd611eb9cef42179c5a39c19cb11206..18c12e6176a418225d97c27a43dff7b2b516fb4a 100644 (file)
@@ -11,6 +11,8 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <required-capabilities>
       <capability>urn:opendaylight:params:xml:ns:yang:nexthopmgr:impl?module=nexthopmgr-impl&amp;revision=2015-03-25</capability>
       <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
+      <capability>urn:opendaylight:params:xml:ns:yang:mdsalutil:api?module=odl-mdsalutil&amp;revision=2015-04-10</capability>
+      <capability>urn:opendaylight:vpnservice:interfacemgr?module=odl-interface&amp;revision=2015-03-31</capability>
   </required-capabilities>
   <configuration>
 
@@ -23,6 +25,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
           </broker>
+          <mdsalutil>
+            <type xmlns:mdsalutil="urn:opendaylight:params:xml:ns:yang:mdsalutil:api">mdsalutil:odl-mdsalutil</type>
+            <name>mdsalutil-service</name>
+          </mdsalutil>
+          <odlinterface>
+            <type xmlns:odlif="urn:opendaylight:vpnservice:interfacemgr">odlif:odl-interface</type>
+            <name>interfacemgr-service</name>
+          </odlinterface>
         </module>
       </modules>
     </data>
index 38b0d6e344dccdddf3f824e8fbcda199d9660a60..8e1a4fc2e37d7cdf0d1eeec7af8d750baa389570 100644 (file)
@@ -8,33 +8,58 @@
 package org.opendaylight.vpnservice.nexthopmgr;
 
 
-import com.google.common.base.Optional;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.Future;
+
+import com.google.common.base.Optional;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.FutureCallback;
+
+//import org.opendaylight.controller.netconf.confignetconfconnector.mapping.rpc.Rpcs;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 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.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstanceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.tunnelnexthops.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.*;
+import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
+import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
+import org.opendaylight.vpnservice.mdsalutil.ActionType;
+import org.opendaylight.vpnservice.mdsalutil.BucketInfo;
+import org.opendaylight.vpnservice.mdsalutil.GroupEntity;
+import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
+import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.idmanager.IdManager;
+
+import java.util.concurrent.ExecutionException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class NexthopManager implements L3nexthopService, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NexthopManager.class);
     private final DataBroker broker;
+    private IMdsalApiManager mdsalManager;
+    private IInterfaceManager interfaceManager;
+    private IdManager idManager;
 
     private static final FutureCallback<Void> DEFAULT_CALLBACK =
         new FutureCallback<Void>() {
@@ -53,44 +78,45 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
     * @param db - dataBroker reference
     */
     public NexthopManager(final DataBroker db) {
-        // create nexhhop ID pool
-      //  getIdManager.createIdPool("nextHopGroupIdPool", 10000, 100000);
         broker = db;
+        createNexthopPointerPool();
     }
 
-
     @Override
     public void close() throws Exception {
         LOG.info("NextHop Manager Closed");
     }
 
+    public void setInterfaceManager(IInterfaceManager ifManager) {
+        this.interfaceManager = ifManager;
+    }
 
-    public void createLocalNextHop(String ifName, String vpnName, String ipAddress)
-    {
-        String nhKey = new String("nexthop." + vpnName + ipAddress);
-        int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey);
+    public void setMdsalManager(IMdsalApiManager mdsalManager) {
+        this.mdsalManager = mdsalManager;
+    }
 
-        long vpnId = getVpnId(vpnName);
-        VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress);
-        if (nexthop == null) {
+    public void setIdManager(IdManager idManager) {
+        this.idManager = idManager;
+    }
 
-         /*   List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
-            List<ActionInfo> listActionInfo = interfacemgr.getEgressGroupActions(ifName);
-            BucketInfo bucket = new BucketInfo(listActionInfo);
-            // MAC re-write??
-            listBucketInfo.add(bucket);
-            GroupEntity groupEntity = MDSALUtil.buildGroupEntity
-                (dpId, groupId, IPAddress, GroupTypes.GroupIndirect, listBucketInfo);
-            getMdsalApiManager().installGroup(groupEntity, objTransaction???);
-            */
+    private void createNexthopPointerPool() {
+        CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
+            .setPoolName("nextHopPointerPool")
+            .setIdStart(1L)
+            .setPoolSize(new BigInteger("65535"))
+            .build();
+        //TODO: Error handling
+        Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
+//            try {
+//                LOG.info("Result2: {}",result.get());
+//            } catch (InterruptedException | ExecutionException e) {
+//                // TODO Auto-generated catch block
+//                LOG.error("Error in result.get");
+//            }
 
-            //update MD-SAL DS
-            addVpnNexthopToDS(vpnId, ipAddress, groupId);
-        } else {
-            //check update
-        }
     }
 
+
     private long getVpnId(String vpnName) {
         InstanceIdentifierBuilder<VpnInstance> idBuilder = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName));
@@ -99,32 +125,81 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         InstanceIdentifier<VpnInstance1> idx = id.augmentation(VpnInstance1.class);
         Optional<VpnInstance1> vpn = read(LogicalDatastoreType.CONFIGURATION, idx);
 
-        if (vpn.isPresent()) return vpn.get().getVpnId();
-        else return 0;
+        if (vpn.isPresent()) {
+            return vpn.get().getVpnId();
+        } else {
+            return 0;
+        }
     }
 
     private long getDpnId(String ifName) {
-        return 1;
+        String[] fields = ifName.split(":");
+        long dpn = Integer.parseInt(fields[1]);
+        return dpn;
     }
 
-    public void createRemoteNextHop(String ifName, String ipAddress)
-    {
+    private int createNextHopPointer(String nexthopKey) {
+        GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder()
+            .setPoolName("nextHopPointerPool").setIdKey(nexthopKey)
+            .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);
+        }
+        return 0;
+    }
+
+    public void createLocalNextHop(String ifName, String vpnName, String ipAddress, String macAddress) {
+        String nhKey = new String("nexthop." + vpnName + ipAddress);
+        int groupId = createNextHopPointer(nhKey);
+
+        long vpnId = getVpnId(vpnName);
+        long dpnId = interfaceManager.getDpnForInterface(ifName);
+        VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress);
+        if (nexthop == null) {
+            List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
+            List<ActionInfo> listActionInfo = interfaceManager.getInterfaceEgressActions(ifName);
+            BucketInfo bucket = new BucketInfo(listActionInfo);
+            // MAC re-write
+            if (macAddress != null) {
+                listActionInfo.add(new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress}));
+            } else {
+                //FIXME: Log message here.
+            }
+            listBucketInfo.add(bucket);
+            GroupEntity groupEntity = MDSALUtil.buildGroupEntity(
+                dpnId, groupId, ipAddress, GroupTypes.GroupIndirect, listBucketInfo);
+
+            // install Group
+            mdsalManager.installGroup(groupEntity);
+
+            //update MD-SAL DS
+            addVpnNexthopToDS(vpnId, ipAddress, groupId);
+        } else {
+            //check update
+        }
+    }
+
+    public void createRemoteNextHop(String ifName, String ofPortId, String ipAddress) {
         String nhKey = new String("nexthop." + ifName + ipAddress);
-        int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey);
+        int groupId = createNextHopPointer(nhKey);
 
-        long dpnId = getDpnId(ifName);
+        long dpnId = getDpnId(ofPortId);
         TunnelNexthop nexthop = getTunnelNexthop(dpnId, ipAddress);
         if (nexthop == null) {
 
-         /*   List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
-            List<ActionInfo> listActionInfo = interfacemgr.getEgressGroupActions(ifName);
+            List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
+            List<ActionInfo> listActionInfo = interfaceManager.getInterfaceEgressActions(ifName);
             BucketInfo bucket = new BucketInfo(listActionInfo);
-            // MAC re-write??
+            // MAC re-write??           
             listBucketInfo.add(bucket);
-            GroupEntity groupEntity = MDSALUtil.buildGroupEntity
-                (dpId, groupId, IPAddress, GroupTypes.GroupIndirect, listBucketInfo);
-            getMdsalApiManager().installGroup(groupEntity, objTransaction???);
-            */
+            GroupEntity groupEntity = MDSALUtil.buildGroupEntity(
+                dpnId, groupId, ipAddress, GroupTypes.GroupIndirect, listBucketInfo);
+            mdsalManager.installGroup(groupEntity);
 
             //update MD-SAL DS
             addTunnelNexthopToDS(dpnId, ipAddress, groupId);
@@ -133,8 +208,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    private void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer){
-
+    private void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
 
         InstanceIdentifierBuilder<VpnNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
@@ -161,7 +235,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
     }
 
-    private void addTunnelNexthopToDS(long dpnId, String ipPrefix, long egressPointer){
+    private void addTunnelNexthopToDS(long dpnId, String ipPrefix, long egressPointer) {
         InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
 
@@ -170,7 +244,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         Optional<TunnelNexthops> nexthops = read(LogicalDatastoreType.CONFIGURATION, id);
         if (!nexthops.isPresent()) {
             // create a new node
-            TunnelNexthops node = new TunnelNexthopsBuilder().setKey(new TunnelNexthopsKey(dpnId)).setDpnId(dpnId).build();
+            TunnelNexthops node = new TunnelNexthopsBuilder()
+                .setKey(new TunnelNexthopsKey(dpnId))
+                .setDpnId(dpnId)
+                .build();
             asyncWrite(LogicalDatastoreType.OPERATIONAL, id, node, DEFAULT_CALLBACK);
         }
 
@@ -189,29 +266,47 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
     private VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
 
-        InstanceIdentifierBuilder<VpnNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
-                .child(VpnNexthops.class, new VpnNexthopsKey(vpnId))
-                .child(VpnNexthop.class, new VpnNexthopKey(ipAddress));
-        InstanceIdentifier<VpnNexthop> id = idBuilder.build();
-        Optional<VpnNexthop> nextHop = read(LogicalDatastoreType.CONFIGURATION, id);
-
-        if(nextHop.isPresent()) return nextHop.get();
-        else return null;
+        // check if vpn node is there 
+        InstanceIdentifierBuilder<VpnNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
+                .child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
+        InstanceIdentifier<VpnNexthops> id = idBuilder.build();
+        Optional<VpnNexthops> vpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id);
+        if (!vpnNexthops.isPresent()) {
+
+            // get nexthops list for vpn
+            List<VpnNexthop> nexthops = vpnNexthops.get().getVpnNexthop();
+            for (VpnNexthop nexthop : nexthops) {
+                if (nexthop.getIpAddress().equals(ipAddress)) {
+                    // return nexthop 
+                    return nexthop;
+                }
+            }
+        }
+        //return null if not found
+        return null;
     }
 
     private TunnelNexthop getTunnelNexthop(long dpnId, String ipAddress) {
-        InstanceIdentifierBuilder<TunnelNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
-                .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId))
-                .child(TunnelNexthop.class, new TunnelNexthopKey(ipAddress));
-        InstanceIdentifier<TunnelNexthop> id = idBuilder.build();
-        Optional<TunnelNexthop> nextHop = read(LogicalDatastoreType.CONFIGURATION, id);
+        
+        InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
+                .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
 
-        if(nextHop.isPresent()) return nextHop.get();
-        else return null;
+        // check if vpn node is there 
+        InstanceIdentifier<TunnelNexthops> id = idBuilder.build();
+        Optional<TunnelNexthops> dpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id);
+        if (!dpnNexthops.isPresent()) {
+            List<TunnelNexthop> nexthops = dpnNexthops.get().getTunnelNexthop();
+            for (TunnelNexthop nexthop : nexthops) {
+                if (nexthop.getIpAddress().equals(ipAddress)) {
+                    return nexthop;
+                }
+            }
+        }
+        return null;
     }
 
     public long getNextHopPointer(long dpnId, long vpnId, String prefixIp, String nextHopIp) {
-        String endpointIp = "10.10.10.1";//interfaceManager.getLocalEndpointIp(dpnId);
+        String endpointIp = interfaceManager.getEndpointIpForDpn(dpnId);
         if (nextHopIp.equals(endpointIp)) {
             VpnNexthop vpnNextHop = getVpnNexthop(vpnId, prefixIp);
             return vpnNextHop.getEgressPointer();
@@ -221,25 +316,74 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    public void removeRemoteNextHop(String ifname, String IpAddress)
-    {
-        String nhKey = new String("nexthop" + ifname + IpAddress);
-        int groupId = 1;//getIdManager().getUniqueId(L3Constants.L3NEXTHOP_GROUPID_POOL, nhKey);
+    private void removeTunnelNexthopFromDS(long dpnId, String ipPrefix) {
 
-/*        if (getNextHop(groupId) != Null){
-            List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
-            List<ActionInfo> listActionInfo = null;//nextHop.getActions({output to port});
-            BucketInfo bucket = new BucketInfo(listActionInfo);
-            listBucketInfo.add(bucket);
-            //GroupEntity groupEntity = MDSALUtil.buildGroupEntity
-              (dpId, groupId, IPAddress, GroupTypes.GroupIndirect, listBucketInfo);
-            //getMdsalApiManager().removeGroup(groupEntity, objTransaction???);
+        InstanceIdentifierBuilder<TunnelNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
+                .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId))
+                .child(TunnelNexthop.class, new TunnelNexthopKey(ipPrefix));
+        InstanceIdentifier<TunnelNexthop> id = idBuilder.build();
+        // remove from DS     
+        delete(LogicalDatastoreType.OPERATIONAL, id);
+    }
+
+    private void removeVpnNexthopFromDS(long vpnId, String ipPrefix) {
+
+        InstanceIdentifierBuilder<VpnNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
+                .child(VpnNexthops.class, new VpnNexthopsKey(vpnId))
+                .child(VpnNexthop.class, new VpnNexthopKey(ipPrefix));
+        InstanceIdentifier<VpnNexthop> id = idBuilder.build();
+        // remove from DS
+        delete(LogicalDatastoreType.OPERATIONAL, id);
+    }
+
+    public void removeLocalNextHop(String vpnName, String ipAddress) {
 
+        long vpnId = getVpnId(vpnName);
+
+        VpnNexthop nh = getVpnNexthop(vpnId, ipAddress);
+        if (nh != null) {
+            // how to inform and remove dependent FIB entries??
+            // we need to do it before the group is removed
+            
+            // remove Group ...
+            
             //update MD-SAL DS
-            removeNextHopFromDS(dpId, vpn, ipAddress);
-        }else{
-            //check update
-        }*/
+            removeVpnNexthopFromDS(vpnId, ipAddress);
+        } else {
+            //throw error
+        }
+
+    }
+
+    public void removeRemoteNextHop(long dpnId, String ipAddress) {
+
+        TunnelNexthop nh = getTunnelNexthop(dpnId, ipAddress);
+        if (nh != null) {
+            // how to inform and remove dependent FIB entries??
+            // we need to do it before the group is removed
+
+            // remove Group ...
+            //update MD-SAL DS
+            removeTunnelNexthopFromDS(dpnId, ipAddress);
+        } else {
+            //throw error
+        }
+
+    }
+
+    @Override
+    public Future<RpcResult<GetEgressPointerOutput>> getEgressPointer(
+            GetEgressPointerInput input) {
+        long egressGroupId =
+                getNextHopPointer(input.getDpnId(), input.getVpnId(), input.getIpPrefix(), input.getNexthopIp());
+
+        GetEgressPointerOutputBuilder output = new GetEgressPointerOutputBuilder();
+        output.setEgressPointer(egressGroupId);
+
+        RpcResult<GetEgressPointerOutput> result = null;
+        //Rpcs.<GetEgressPointerOutput> getRpcResult(false, output.build());
+        return Futures.immediateFuture(result); 
     }
 
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
@@ -265,18 +409,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
     }
 
 
-    @Override
-    public Future<RpcResult<GetEgressPointerOutput>> getEgressPointer(
-            GetEgressPointerInput input) {
-        long egressGroupId =
-                getNextHopPointer(input.getDpnId(), input.getVpnId(), input.getIpPrefix(), input.getNexthopIp());
-
-        GetEgressPointerOutputBuilder output = new GetEgressPointerOutputBuilder();
-        output.setEgressPointer(egressGroupId);
-
-        /*RpcResult<GetEgressPointerOutput> result = Rpcs.<GetEgressPointerOutput> getRpcResult(false, output.build());
-        return Futures.immediateFuture(result);*/
-        return null;
+    private <T extends DataObject> void delete(LogicalDatastoreType datastoreType, InstanceIdentifier<T> path) {
+        WriteTransaction tx = broker.newWriteOnlyTransaction();
+        tx.delete(datastoreType, path);
+        Futures.addCallback(tx.submit(), DEFAULT_CALLBACK);
     }
 
 }
\ No newline at end of file
index 68758b6d079de4c3420fb75f228ea4249a996e97..57b7a766746b63f4fa92f96a3d7479a0e4d62a35 100644 (file)
@@ -11,6 +11,9 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.vpnservice.nexthopmgr.NexthopManager;
+import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
+import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.idmanager.IdManager;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -21,16 +24,31 @@ public class NexthopmgrProvider implements BindingAwareProvider, AutoCloseable {
     private VpnInterfaceChangeListener vpnIfListener;
     private OdlInterfaceChangeListener odlIfListener;
     private NexthopManager nhManager;
+    private IMdsalApiManager mdsalManager;
+    private IInterfaceManager interfaceManager;
+    private IdManager idManager;
 
     @Override
     public void onSessionInitiated(ProviderContext session) {
         final  DataBroker dbx = session.getSALService(DataBroker.class);
         nhManager = new NexthopManager(dbx);
         vpnIfListener = new VpnInterfaceChangeListener(dbx, nhManager);
-        odlIfListener = new OdlInterfaceChangeListener(dbx, nhManager);
+        odlIfListener = new OdlInterfaceChangeListener(dbx, nhManager, interfaceManager);
+        idManager = new IdManager(dbx);
+        nhManager.setMdsalManager(mdsalManager);
+        nhManager.setInterfaceManager(interfaceManager);
+        nhManager.setIdManager(idManager);
         LOG.info("NexthopmgrProvider Session Initiated");
     }
 
+    public void setMdsalManager(IMdsalApiManager mdsalManager) {
+        this.mdsalManager = mdsalManager;
+    }
+
+    public void setInterfaceManager(IInterfaceManager interfaceManager) {
+        this.interfaceManager = interfaceManager;
+    }
+
     @Override
     public void close() throws Exception {
         vpnIfListener.close();
index d97fc88efb5996640fb4bd2a9e082bfa7071f68c..e8a5bc2e1561fd58698a297990b7e99d40047a02 100644 (file)
@@ -16,11 +16,12 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 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.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.BaseIds;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.L3tunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL3tunnel;
-
+import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.nexthopmgr.AbstractDataChangeListener;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,11 +32,14 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener<Inter
     private ListenerRegistration<DataChangeListener> listenerRegistration;
     private final DataBroker broker;
     private NexthopManager nexthopManager;
+    private IInterfaceManager interfaceManager;
+
 
-    public OdlInterfaceChangeListener(final DataBroker db, NexthopManager nhm) {
+    public OdlInterfaceChangeListener(final DataBroker db, NexthopManager nhm, IInterfaceManager ifManager) {
         super(Interface.class);
         broker = db;
         nexthopManager = nhm;
+        interfaceManager = ifManager;
         registerListener(db);
     }
 
@@ -62,24 +66,24 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener<Inter
             throw new IllegalStateException("Nexthop Manager registration Listener failed.", e);
         }
     }
-    
+
     @Override
-    
-       protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
+    protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.info("key: " + identifier + ", value=" + intrf );
 
         if (intrf.getType().equals(L3tunnel.class)) {
-               IfL3tunnel intfData = intrf.getAugmentation(IfL3tunnel.class);
+            IfL3tunnel intfData = intrf.getAugmentation(IfL3tunnel.class);
             String gwIp = intfData.getGatewayIp().toString();
             String remoteIp = intfData.getRemoteIp().toString();
             if (gwIp != null) {
                 remoteIp = gwIp;
             }
-            nexthopManager.createRemoteNextHop(intrf.getName(), remoteIp);
+            NodeConnectorId ofPort = intrf.getAugmentation(BaseIds.class).getOfPortId();
+            nexthopManager.createRemoteNextHop(intrf.getName(), ofPort.toString(), remoteIp);
         }
     }
 
-    
+
     private InstanceIdentifier<Interface> getWildCardPath() {
         return InstanceIdentifier.create(Interfaces.class).child(Interface.class);
     }
@@ -88,13 +92,14 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener<Inter
     protected void remove(InstanceIdentifier<Interface> identifier,
             Interface intrf) {
         if (intrf.getType().equals(L3tunnel.class)) {
+            long dpnId = interfaceManager.getDpnForInterface(intrf.getName());
             IfL3tunnel intfData = intrf.getAugmentation(IfL3tunnel.class);
             String gwIp = intfData.getGatewayIp().toString();
             String remoteIp = intfData.getRemoteIp().toString();
             if (gwIp != null) {
                 remoteIp = gwIp;
             }
-            nexthopManager.removeRemoteNextHop(intrf.getName(), remoteIp);
+            nexthopManager.removeRemoteNextHop(dpnId, remoteIp);
         }
     }
 
index 855f387d3b8f7e4511977808291fd0adb61a4392..1245a12ad9da2699894aaa6dcf375946c75342fc 100644 (file)
@@ -8,16 +8,12 @@
 package org.opendaylight.vpnservice.nexthopmgr;
 
 import java.util.List;
-import java.util.ArrayList;
-
 import com.google.common.base.Optional;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 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.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
@@ -25,17 +21,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.l
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
-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.vpnservice.nexthopmgr.AbstractDataChangeListener;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-public class VpnInterfaceChangeListener extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {
+public class VpnInterfaceChangeListener extends AbstractDataChangeListener<Adjacencies> implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceChangeListener.class);
 
     private ListenerRegistration<DataChangeListener> listenerRegistration;
@@ -43,7 +35,7 @@ public class VpnInterfaceChangeListener extends AbstractDataChangeListener<VpnIn
     private NexthopManager nexthopManager;
 
     public VpnInterfaceChangeListener(final DataBroker db, NexthopManager nhm) {
-        super(VpnInterface.class);
+        super(Adjacencies.class);
         broker = db;
         nexthopManager = nhm;
         registerListener(db);
@@ -74,39 +66,45 @@ public class VpnInterfaceChangeListener extends AbstractDataChangeListener<VpnIn
     }
 
     @Override
-    protected void add(InstanceIdentifier<VpnInterface> identifier,
-            VpnInterface vpnIf) {
-        LOG.info("key: " + identifier + ", value=" + vpnIf );
-
-        String vpnName = vpnIf.getVpnInstanceName();
-        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
-        String interfaceName = key.getName();
-        InstanceIdentifierBuilder<Interface> idBuilder =
-                InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName));
-        InstanceIdentifier<Interface> id = idBuilder.build();
-        Optional<Interface> port = read(LogicalDatastoreType.CONFIGURATION, id);
-        if (port.isPresent()) {
-            //Interface interf = port.get();
-
-            //Read NextHops
-            InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-            Optional<Adjacencies> adjacencies = read(LogicalDatastoreType.CONFIGURATION, path);
-
-            if (adjacencies.isPresent()) {
-                List<Adjacency> nextHops = adjacencies.get().getAdjacency();
-                List<Adjacency> value = new ArrayList<>();
-
-                if (!nextHops.isEmpty()) {
-                    LOG.info("NextHops are " + nextHops);
-                    for (Adjacency nextHop : nextHops) {
-                        nexthopManager.createLocalNextHop(interfaceName, vpnName, nextHop.getIpAddress());
-                    }
-                }
-            }
+    protected void add(InstanceIdentifier<Adjacencies> identifier,
+            Adjacencies adjs) {
+
+        InstanceIdentifier<VpnInterface> vpnIfId = identifier.firstIdentifierOf(VpnInterface.class);
+        Optional<VpnInterface> vpnIf = read(LogicalDatastoreType.CONFIGURATION, vpnIfId);
+        VpnInterface vpnIfData = vpnIf.get();
+
+        List<Adjacency> adjList = adjs.getAdjacency();
+        for (Adjacency adjacency : adjList) {
+            nexthopManager.createLocalNextHop(
+                    vpnIfData.getName(),
+                    vpnIfData.getVpnInstanceName(),
+                    adjacency.getIpAddress(),
+                    adjacency.getMacAddress());
         }
+    }
+
+
+    @Override
+    protected void remove(InstanceIdentifier<Adjacencies> identifier,
+            Adjacencies adjs) {
+        InstanceIdentifier<VpnInterface> vpnIfId = identifier.firstIdentifierOf(VpnInterface.class);
+        Optional<VpnInterface> vpnIf = read(LogicalDatastoreType.CONFIGURATION, vpnIfId);
+        VpnInterface vpnIfData = vpnIf.get();
+
+        List<Adjacency> adjList = adjs.getAdjacency();
+        for (Adjacency adjacency : adjList) {
+            nexthopManager.removeLocalNextHop(vpnIfData.getVpnInstanceName(), adjacency.getIpAddress());
+        }
+
+    }
 
+    @Override
+    protected void update(InstanceIdentifier<Adjacencies> identifier,
+            Adjacencies original, Adjacencies update) {
+        // TODO Auto-generated method stub
     }
 
+
     private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
             InstanceIdentifier<T> path) {
 
@@ -122,21 +120,9 @@ public class VpnInterfaceChangeListener extends AbstractDataChangeListener<VpnIn
         return result;
     }
 
-    private InstanceIdentifier<VpnInterface> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
+    private InstanceIdentifier<Adjacencies> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.class);
     }
 
-    @Override
-    protected void remove(InstanceIdentifier<VpnInterface> identifier,
-            VpnInterface del) {
-            // TODO Auto-generated method stub
-    }
-
-    @Override
-    protected void update(InstanceIdentifier<VpnInterface> identifier,
-                VpnInterface original, VpnInterface update) {
-            // TODO Auto-generated method stub
-
-    }
 
 }
\ No newline at end of file
index 90470f0ce61d73aa3be6d46422202d521098a1d1..4b7d4aeac0b4b6383594d0cf477110b95f8df7fe 100644 (file)
@@ -19,6 +19,9 @@ public class NexthopmgrImplModule extends org.opendaylight.yang.gen.v1.urn.opend
     @Override
     public java.lang.AutoCloseable createInstance() {
         NexthopmgrProvider provider = new NexthopmgrProvider();
+        provider.setMdsalManager(getMdsalutilDependency());
+        provider.setInterfaceManager(getOdlinterfaceDependency());
+
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index 8c60aba879f5aa43df0d25feef23c1ab28759fec..3b50fdaf2309b1cb021c1babc642d4e3075bdf59 100644 (file)
@@ -5,6 +5,8 @@ module nexthopmgr-impl {
 
     import config { prefix config; revision-date 2013-04-05; }
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
+    import odl-mdsalutil { prefix odl-mdsal; revision-date 2015-04-10;}
+    import odl-interface {prefix odlif; revision-date 2015-03-31;}
 
     description
         "Service definition for nexthopmgr project";
@@ -30,6 +32,22 @@ module nexthopmgr-impl {
                     }
                 }
             }
+            container mdsalutil {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity odl-mdsal:odl-mdsalutil;
+                    }
+                }
+            }
+            container odlinterface {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity odlif:odl-interface;
+                    }
+                }
+            }
         }
     }
 }