From 5d87e53cdbed3197a5035ae7452583bd5ae8c638 Mon Sep 17 00:00:00 2001 From: esravik Date: Tue, 14 Apr 2015 13:36:53 +0530 Subject: [PATCH] added modules to features and nexthopmgr updates. Change-Id: I3f58a3cd592d8c8ae04dc71c744714606aa86d1c Signed-off-by: esravik --- features/pom.xml | 61 ++- features/src/main/features/features.xml | 15 +- fibmanager/fibmanager-api/pom.xml | 2 +- nexthopmgr/nexthopmgr-api/pom.xml | 5 + .../src/main/yang/l3nexthop.yang | 19 +- nexthopmgr/nexthopmgr-impl/pom.xml | 9 +- .../AbstractDataChangeListener.java | 4 +- .../vpnservice/nexthopmgr/NexthopManager.java | 388 +++++++++++------- .../nexthopmgr/NexthopmgrProvider.java | 22 +- .../OdlInterfaceChangeListener.java | 108 +++++ .../VpnInterfaceChangeListener.java | 142 +++++++ nexthopmgr/pom.xml | 2 +- pom.xml | 6 +- vpnservice-artifacts/pom.xml | 4 +- 14 files changed, 612 insertions(+), 175 deletions(-) create mode 100644 nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/OdlInterfaceChangeListener.java create mode 100644 nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/VpnInterfaceChangeListener.java diff --git a/features/pom.xml b/features/pom.xml index c9514273..995a768e 100644 --- a/features/pom.xml +++ b/features/pom.xml @@ -24,7 +24,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL 1.2.0-SNAPSHOT 0.1.0-SNAPSHOT 0.7.0-SNAPSHOT + 0.0.1-SNAPSHOT 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT @@ -74,12 +78,12 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL ${project.groupId} vpnmanager-impl - ${project.version} + ${vpnmanager.version} ${project.groupId} vpnmanager-impl - ${project.version} + ${vpnmanager.version} config xml @@ -103,7 +107,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL ${project.groupId} vpnmanager-api - ${project.version} + ${vpnmanager.version} ${project.groupId} @@ -126,6 +130,57 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL ${project.groupId} model-bgp 2013.07.15.7-SNAPSHOT + + + ${project.groupId} + nexthopmgr-impl + ${nexthopmgr.version} + + + ${project.groupId} + nexthopmgr-impl + ${nexthopmgr.version} + config + xml + + + ${project.groupId} + nexthopmgr-api + ${nexthopmgr.version} + + + ${project.groupId} + fibmanager-impl + ${fibmanager.version} + + + ${project.groupId} + fibmanager-impl + ${fibmanager.version} + config + xml + + + ${project.groupId} + fibmanager-api + ${fibmanager.version} + + + ${project.groupId} + idmanager-impl + ${idmanager.version} + + + ${project.groupId} + idmanager-impl + ${idmanager.version} + config + xml + + + ${project.groupId} + idmanager-api + ${idmanager.version} org.apache.thrift diff --git a/features/src/main/features/features.xml b/features/src/main/features/features.xml index 684ed855..65cd4382 100644 --- a/features/src/main/features/features.xml +++ b/features/src/main/features/features.xml @@ -18,21 +18,30 @@ and is available at http://www.eclipse.org/legal/epl-v10.html odl-yangtools-models odl-openflowplugin-nsf-model mvn:org.opendaylight.vpnservice/model-bgp/{{VERSION}} - mvn:org.opendaylight.vpnservice/vpnmanager-api/${project.version} + mvn:org.opendaylight.vpnservice/vpnmanager-api/${vpnmanager.version} mvn:org.opendaylight.vpnservice/interfacemgr-api/${interfacemgr.version} + mvn:org.opendaylight.vpnservice/nexthopmgr-api/${nexthopmgr.version} + mvn:org.opendaylight.vpnservice/idmanager-api/${idmanager.version} + mvn:org.opendaylight.vpnservice/fibmanager-api/${fibmanager.version} mvn:org.opendaylight.vpnservice/bgpmanager-api/${project.version} odl-mdsal-broker odl-vpnservice-api - mvn:org.opendaylight.vpnservice/vpnmanager-impl/${project.version} + mvn:org.opendaylight.vpnservice/vpnmanager-impl/${vpnmanager.version} mvn:org.opendaylight.vpnservice/interfacemgr-impl/${interfacemgr.version} + mvn:org.opendaylight.vpnservice/nexthopmgr-impl/${nexthopmgr.version} + mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version} + mvn:org.opendaylight.vpnservice/fibmanager-impl/${fibmanager.version} mvn:org.opendaylight.vpnservice/bgpmanager-impl/${project.version} wrap:mvn:org.apache.thrift/libthrift/0.9.1$overwrite=merge&Bundle-Version=0.9.1&Export-Package=*;-noimport:=true;version="0.9.1" - mvn:org.opendaylight.vpnservice/vpnmanager-impl/${project.version}/xml/config + mvn:org.opendaylight.vpnservice/vpnmanager-impl/${vpnmanager.version}/xml/config mvn:org.opendaylight.vpnservice/interfacemgr-impl/${interfacemgr.version}/xml/config + mvn:org.opendaylight.vpnservice/nexthopmgr-impl/${nexthopmgr.version}/xml/config + mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version}/xml/config + mvn:org.opendaylight.vpnservice/fibmanager-impl/${fibmanager.version}/xml/config mvn:org.opendaylight.vpnservice/bgpmanager-impl/${project.version}/xml/config diff --git a/fibmanager/fibmanager-api/pom.xml b/fibmanager/fibmanager-api/pom.xml index a66b1c31..89ff83d9 100644 --- a/fibmanager/fibmanager-api/pom.xml +++ b/fibmanager/fibmanager-api/pom.xml @@ -17,7 +17,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html 4.0.0 org.opendaylight.vpnservice fibmanager-api - 1.0-SNAPSHOT + 0.0.1-SNAPSHOT bundle diff --git a/nexthopmgr/nexthopmgr-api/pom.xml b/nexthopmgr/nexthopmgr-api/pom.xml index dec5ae45..f4022970 100644 --- a/nexthopmgr/nexthopmgr-api/pom.xml +++ b/nexthopmgr/nexthopmgr-api/pom.xml @@ -40,6 +40,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html yang-common ${yangtools.version} + + org.opendaylight.yangtools.model + yang-ext + ${yang.ext.version} + org.opendaylight.yangtools.model ietf-inet-types diff --git a/nexthopmgr/nexthopmgr-api/src/main/yang/l3nexthop.yang b/nexthopmgr/nexthopmgr-api/src/main/yang/l3nexthop.yang index cc86285b..7a287b5b 100644 --- a/nexthopmgr/nexthopmgr-api/src/main/yang/l3nexthop.yang +++ b/nexthopmgr/nexthopmgr-api/src/main/yang/l3nexthop.yang @@ -4,34 +4,39 @@ module l3nexthop { namespace "urn:opendaylight:vpnservice:l3nexthop"; prefix l3nexthop; - revision "2015-03-30" { + revision "2015-04-09" { description "L3 NextHop module"; } container l3nexthop { + config false; list vpnNexthops{ key "vpnId"; leaf vpnId {type uint32;} list vpnNexthop{ key "IpAddress"; leaf IpAddress {type string;} - leaf dpnId {type uint32;} leaf egressPointer {type uint32;} } } - list genNexthops{ - key "IpAddress"; - leaf IpAddress {type string;} + list tunnelNexthops{ + key "dpnId"; leaf dpnId {type uint32;} - leaf egressPointer {type uint32;} + list tunnelNexthop{ + key "IpAddress"; + leaf IpAddress {type string;} + leaf egressPointer {type uint32;} + } } } + rpc getEgressPointer { description "returns egress pointer, an OF Group Id"; input { leaf dpnId {type uint32;} leaf vpnId { type uint32;} /* optional */ - leaf ipAddress{type string;} + leaf ipPrefix {type string;} + leaf nexthopIp {type string;} } output { leaf egressPointer {type uint32;} diff --git a/nexthopmgr/nexthopmgr-impl/pom.xml b/nexthopmgr/nexthopmgr-impl/pom.xml index 3078bc22..c519fe5e 100644 --- a/nexthopmgr/nexthopmgr-impl/pom.xml +++ b/nexthopmgr/nexthopmgr-impl/pom.xml @@ -23,12 +23,17 @@ and is available at http://www.eclipse.org/legal/epl-v10.html ${project.groupId} - nexthopmgr-api + vpnmanager-api + 0.0.1-SNAPSHOT + + + ${project.groupId} + interfacemgr-api ${project.version} ${project.groupId} - vpnmanager-api + nexthopmgr-api ${project.version} diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/AbstractDataChangeListener.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/AbstractDataChangeListener.java index bca90b63..2b962b7c 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/AbstractDataChangeListener.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/AbstractDataChangeListener.java @@ -23,7 +23,7 @@ import java.util.Set; * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for * VPN related Data Objects. */ -public abstract class AbstractDataChangeListener implements DataChangeListener { +public abstract class AbstractDataChangeListener implements DataChangeListener { protected final Class clazz; @@ -37,7 +37,7 @@ public abstract class AbstractDataChangeListener implemen /* All DataObjects for create */ final Map, DataObject> createdData = changeEvent.getCreatedData() != null - ? changeEvent.getCreatedData() : Collections., DataObject> emptyMap(); + ? changeEvent.getCreatedData() : Collections., DataObject>emptyMap(); /* All DataObjects for remove */ final Set> removeData = changeEvent.getRemovedPaths() != null ? changeEvent.getRemovedPaths() : Collections.> emptySet(); diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java index 71cfad78..38b0d6e3 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java @@ -6,175 +6,277 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.vpnservice.nexthopmgr; -/********************************************************************************** -** NextHop MD-SAL DS -** ------------------------------------------------ -** DP_ID | VPN | IP Address | GroupId | -** ------------------------------------------------ -** -** Listen to DCNs from vpn-inetrfaces -** if a next-hop is added/removed in vpn-interfaces DS -** call add/removeNextHop(interface.dpn, interface.port, vpn_instance.vpnId, AdjacencyIpAddress); -** -** if a tunnel-interface is added inn interfaces DS -- -** call add/removeNextHop(interface.dpn, interface.port, 00, RemoteIpAddress); -*************************************************************************************/ -import java.util.Collections; -import java.util.Map; -import java.util.Set; - -import java.util.List; -import com.google.common.base.Optional; -import com.google.common.collect.FluentIterable; +import com.google.common.base.Optional; +import java.util.concurrent.Future; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.FutureCallback; 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.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.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; - -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.opendaylight.l3vpn.rev130911.NextHopList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.next.hop.list.L3NextHops; -import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; -import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInterface1; -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.opendaylight.vpnservice.l3nexthop.rev150330.L3nexthop; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150330.l3nexthop.VpnNexthops; - +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.l3vpn.rev130911.VpnInstance1; +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.slf4j.Logger; import org.slf4j.LoggerFactory; -public class NexthopManager extends AbstractDataChangeListener implements AutoCloseable{ - private static final Logger LOG = LoggerFactory.getLogger(L3nexthop.class); - private ListenerRegistration listenerRegistration; +public class NexthopManager implements L3nexthopService, AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(NexthopManager.class); private final DataBroker broker; + private static final FutureCallback DEFAULT_CALLBACK = + new FutureCallback() { + public void onSuccess(Void result) { + LOG.info("Success in Datastore write operation"); + } + public void onFailure(Throwable error) { + LOG.error("Error in Datastore write operation", error); + }; + }; + + /** + * Provides nexthop functions + * Creates group ID pool + * + * @param db - dataBroker reference + */ public NexthopManager(final DataBroker db) { - super(L3nexthop.class); + // create nexhhop ID pool + // getIdManager.createIdPool("nextHopGroupIdPool", 10000, 100000); broker = db; - registerListener(db); } - @Override + + @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("NextHop Manager Closed"); + } + + + public void createLocalNextHop(String ifName, String vpnName, String ipAddress) + { + String nhKey = new String("nexthop." + vpnName + ipAddress); + int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey); + + long vpnId = getVpnId(vpnName); + VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress); + if (nexthop == null) { + + /* List listBucketInfo = new ArrayList(); + List 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???); + */ + + //update MD-SAL DS + addVpnNexthopToDS(vpnId, ipAddress, groupId); + } else { + //check update + } + } + + private long getVpnId(String vpnName) { + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(VpnInstances.class) + .child(VpnInstance.class, new VpnInstanceKey(vpnName)); + + InstanceIdentifier id = idBuilder.build(); + InstanceIdentifier idx = id.augmentation(VpnInstance1.class); + Optional vpn = read(LogicalDatastoreType.CONFIGURATION, idx); + + if (vpn.isPresent()) return vpn.get().getVpnId(); + else return 0; + } + + private long getDpnId(String ifName) { + return 1; + } + + public void createRemoteNextHop(String ifName, String ipAddress) + { + String nhKey = new String("nexthop." + ifName + ipAddress); + int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey); + + long dpnId = getDpnId(ifName); + TunnelNexthop nexthop = getTunnelNexthop(dpnId, ipAddress); + if (nexthop == null) { + + /* List listBucketInfo = new ArrayList(); + List 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???); + */ + + //update MD-SAL DS + addTunnelNexthopToDS(dpnId, ipAddress, groupId); + } else { + //check update } - LOG.info("VPN Interface Manager Closed"); } + private void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer){ + + + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(VpnNexthops.class, new VpnNexthopsKey(vpnId)); + + // check if vpn node is there or to be created + InstanceIdentifier id = idBuilder.build(); + Optional nexthops = read(LogicalDatastoreType.CONFIGURATION, id); + if (!nexthops.isPresent()) { + // create a new node + VpnNexthops node = new VpnNexthopsBuilder().setKey(new VpnNexthopsKey(vpnId)).setVpnId(vpnId).build(); + asyncWrite(LogicalDatastoreType.OPERATIONAL, id, node, DEFAULT_CALLBACK); + } + + // Add nexthop to vpn node + VpnNexthop nh = new VpnNexthopBuilder(). + setKey(new VpnNexthopKey(ipPrefix)). + setIpAddress(ipPrefix). + setEgressPointer(egressPointer).build(); + + InstanceIdentifier id1 = idBuilder + .child(VpnNexthop.class, new VpnNexthopKey(ipPrefix)).build(); - private void registerListener(final DataBroker db) { + asyncWrite(LogicalDatastoreType.OPERATIONAL, id1, nh, DEFAULT_CALLBACK); + + } + + private void addTunnelNexthopToDS(long dpnId, String ipPrefix, long egressPointer){ + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId)); + + // check if dpn node is there or to be created + InstanceIdentifier id = idBuilder.build(); + Optional nexthops = read(LogicalDatastoreType.CONFIGURATION, id); + if (!nexthops.isPresent()) { + // create a new node + TunnelNexthops node = new TunnelNexthopsBuilder().setKey(new TunnelNexthopsKey(dpnId)).setDpnId(dpnId).build(); + asyncWrite(LogicalDatastoreType.OPERATIONAL, id, node, DEFAULT_CALLBACK); + } + + // Add nexthop to dpn node + TunnelNexthop nh = new TunnelNexthopBuilder(). + setKey(new TunnelNexthopKey(ipPrefix)). + setIpAddress(ipPrefix). + setEgressPointer(egressPointer).build(); + + InstanceIdentifier id1 = idBuilder + .child(TunnelNexthop.class, new TunnelNexthopKey(ipPrefix)).build(); + + asyncWrite(LogicalDatastoreType.OPERATIONAL, id1, nh, DEFAULT_CALLBACK); + + } + + private VpnNexthop getVpnNexthop(long vpnId, String ipAddress) { + + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(VpnNexthops.class, new VpnNexthopsKey(vpnId)) + .child(VpnNexthop.class, new VpnNexthopKey(ipAddress)); + InstanceIdentifier id = idBuilder.build(); + Optional nextHop = read(LogicalDatastoreType.CONFIGURATION, id); + + if(nextHop.isPresent()) return nextHop.get(); + else return null; + } + + private TunnelNexthop getTunnelNexthop(long dpnId, String ipAddress) { + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId)) + .child(TunnelNexthop.class, new TunnelNexthopKey(ipAddress)); + InstanceIdentifier id = idBuilder.build(); + Optional nextHop = read(LogicalDatastoreType.CONFIGURATION, id); + + if(nextHop.isPresent()) return nextHop.get(); + else return null; + } + + public long getNextHopPointer(long dpnId, long vpnId, String prefixIp, String nextHopIp) { + String endpointIp = "10.10.10.1";//interfaceManager.getLocalEndpointIp(dpnId); + if (nextHopIp.equals(endpointIp)) { + VpnNexthop vpnNextHop = getVpnNexthop(vpnId, prefixIp); + return vpnNextHop.getEgressPointer(); + } else { + TunnelNexthop tunnelNextHop = getTunnelNexthop(dpnId, nextHopIp); + return tunnelNextHop.getEgressPointer(); + } + } + + public void removeRemoteNextHop(String ifname, String IpAddress) + { + String nhKey = new String("nexthop" + ifname + IpAddress); + int groupId = 1;//getIdManager().getUniqueId(L3Constants.L3NEXTHOP_GROUPID_POOL, nhKey); + +/* if (getNextHop(groupId) != Null){ + List listBucketInfo = new ArrayList(); + List 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???); + + //update MD-SAL DS + removeNextHopFromDS(dpId, vpn, ipAddress); + }else{ + //check update + }*/ + } + + private Optional read(LogicalDatastoreType datastoreType, + InstanceIdentifier path) { + + ReadOnlyTransaction tx = broker.newReadOnlyTransaction(); + + Optional result = Optional.absent(); try { - listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, - getWildCardPath(), NexthopManager.this, DataChangeScope.SUBTREE); - } catch (final Exception e) { - LOG.error("Nexthop Manager DataChange listener registration fail!", e); - throw new IllegalStateException("Nexthop Manager registration Listener failed.", e); + result = tx.read(datastoreType, path).get(); + } catch (Exception e) { + throw new RuntimeException(e); } + + return result; } - - public void addNextHop(long dpnId, int port, String vpnRD, String IpAddress) - { - String nhKey = new String("nexthop"+vpnRD+IpAddress); - - int groupId = 1;//getIdManager().getUniqueId("nextHopGroupIdPool", nhKey); - -/* if (getNextHop(groupId) == Null){ - List listBucketInfo = new ArrayList(); - List 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().installGroup(groupEntity, objTransaction???); - - //update MD-SAL DS - addNextHopToDS(dpId, vpn, ipAddress, groupId); - }else{ - //check update - }*/ - } - - public void removeNextHop(long dpnId, int port, String vpnRD, String IpAddress) - { - String nhKey = new String("nexthop"+vpnRD+IpAddress); - int groupId = 1;//getIdManager().getUniqueId(L3Constants.L3NEXTHOP_GROUPID_POOL, nhKey); - -/* if (getNextHop(groupId) != Null){ - List listBucketInfo = new ArrayList(); - List 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???); - - //update MD-SAL DS - removeNextHopFromDS(dpId, vpn, ipAddress); - }else{ - //check update - }*/ - } - - public long getNextHopPointer(long dpnId, int vpnId, String prefixIp, String nxetHopIp) - { -/* String endpointIp = interfaceManager.getLocalEndpointIp(dpnId); - if (nextHopIp.equals(endpointIp)) { - return getGidFromDS(dpnId, vpnId, prefixIp); - } else { - return getGidFromDS(dpnId, 00, nextHopIp); - }*/ - return 0; - } - - private InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(L3nexthop.class);//.child(l3nexthop.vpnNexthops.class); + + private void asyncWrite(LogicalDatastoreType datastoreType, + InstanceIdentifier path, T data, FutureCallback callback) { + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.put(datastoreType, path, data, true); + Futures.addCallback(tx.submit(), callback); } - private void addNextHopToDS(long dpId, int vpnId, String ipAddress, long groupId) - { - - } - - private long getGidFromDS(String ipaddress) - { - return 0; - - } - - @Override - protected void remove(InstanceIdentifier identifier, - L3nexthop del) { - // TODO Auto-generated method stub - - } - - @Override - protected void update(InstanceIdentifier identifier, - L3nexthop original, L3nexthop update) { - // TODO Auto-generated method stub - - } - - @Override - protected void add(InstanceIdentifier identifier, L3nexthop add) { - // TODO Auto-generated method stub - - } + + @Override + public Future> getEgressPointer( + GetEgressPointerInput input) { + long egressGroupId = + getNextHopPointer(input.getDpnId(), input.getVpnId(), input.getIpPrefix(), input.getNexthopIp()); + + GetEgressPointerOutputBuilder output = new GetEgressPointerOutputBuilder(); + output.setEgressPointer(egressGroupId); + + /*RpcResult result = Rpcs. getRpcResult(false, output.build()); + return Futures.immediateFuture(result);*/ + return null; + } } \ No newline at end of file diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java index 23397f76..68758b6d 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopmgrProvider.java @@ -10,27 +10,33 @@ package org.opendaylight.vpnservice.nexthopmgr; 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.slf4j.Logger; import org.slf4j.LoggerFactory; -public class NexthopmgrProvider implements BindingAwareProvider, - AutoCloseable { +public class NexthopmgrProvider implements BindingAwareProvider, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NexthopmgrProvider.class); - // private nexthopmgr nhManager; + private VpnInterfaceChangeListener vpnIfListener; + private OdlInterfaceChangeListener odlIfListener; + private NexthopManager nhManager; @Override public void onSessionInitiated(ProviderContext session) { - final DataBroker dataBroker = session.getSALService(DataBroker.class); - // nhManager = new nexthopManager(dataBroker); - LOG.info("NexthopmgrProvider Session Initiated"); + final DataBroker dbx = session.getSALService(DataBroker.class); + nhManager = new NexthopManager(dbx); + vpnIfListener = new VpnInterfaceChangeListener(dbx, nhManager); + odlIfListener = new OdlInterfaceChangeListener(dbx, nhManager); + LOG.info("NexthopmgrProvider Session Initiated"); } @Override public void close() throws Exception { - //nhManager.close(); - LOG.info("NexthopmgrProvider Closed"); + vpnIfListener.close(); + odlIfListener.close(); + nhManager.close(); + LOG.info("NexthopmgrProvider Closed"); } } diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/OdlInterfaceChangeListener.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/OdlInterfaceChangeListener.java new file mode 100644 index 00000000..d97fc88e --- /dev/null +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/OdlInterfaceChangeListener.java @@ -0,0 +1,108 @@ +/* + * 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.nexthopmgr; + + +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.InstanceIdentifier; +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.vpnservice.interfacemgr.rev150331.L3tunnel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL3tunnel; + +import org.opendaylight.vpnservice.nexthopmgr.AbstractDataChangeListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class OdlInterfaceChangeListener extends AbstractDataChangeListener implements AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(OdlInterfaceChangeListener.class); + + private ListenerRegistration listenerRegistration; + private final DataBroker broker; + private NexthopManager nexthopManager; + + public OdlInterfaceChangeListener(final DataBroker db, NexthopManager nhm) { + super(Interface.class); + broker = db; + nexthopManager = nhm; + 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("odlInterface listener Closed"); + } + + + private void registerListener(final DataBroker db) { + try { + listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, + getWildCardPath(), OdlInterfaceChangeListener.this, DataChangeScope.SUBTREE); + } catch (final Exception e) { + LOG.error("Nexthop Manager Interfaces DataChange listener registration fail!", e); + throw new IllegalStateException("Nexthop Manager registration Listener failed.", e); + } + } + + @Override + + protected void add(InstanceIdentifier identifier, Interface intrf) { + LOG.info("key: " + identifier + ", value=" + intrf ); + + if (intrf.getType().equals(L3tunnel.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); + } + } + + + private InstanceIdentifier getWildCardPath() { + return InstanceIdentifier.create(Interfaces.class).child(Interface.class); + } + + @Override + protected void remove(InstanceIdentifier identifier, + Interface intrf) { + if (intrf.getType().equals(L3tunnel.class)) { + 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); + } + } + + @Override + protected void update(InstanceIdentifier identifier, + Interface original, Interface update) { + // TODO Auto-generated method stub + + } + +} \ No newline at end of file diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/VpnInterfaceChangeListener.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/VpnInterfaceChangeListener.java new file mode 100644 index 00000000..855f387d --- /dev/null +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/VpnInterfaceChangeListener.java @@ -0,0 +1,142 @@ +/* + * 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.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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; +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 implements AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceChangeListener.class); + + private ListenerRegistration listenerRegistration; + private final DataBroker broker; + private NexthopManager nexthopManager; + + public VpnInterfaceChangeListener(final DataBroker db, NexthopManager nhm) { + super(VpnInterface.class); + broker = db; + nexthopManager = nhm; + 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("VPN Interface Manager Closed"); + } + + + private void registerListener(final DataBroker db) { + try { + listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, + getWildCardPath(), VpnInterfaceChangeListener.this, DataChangeScope.SUBTREE); + } catch (final Exception e) { + LOG.error("Nexthop Manager DataChange listener registration fail!", e); + throw new IllegalStateException("Nexthop Manager registration Listener failed.", e); + } + } + + @Override + protected void add(InstanceIdentifier 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 idBuilder = + InstanceIdentifier.builder(Interfaces.class).child(Interface.class, new InterfaceKey(interfaceName)); + InstanceIdentifier id = idBuilder.build(); + Optional port = read(LogicalDatastoreType.CONFIGURATION, id); + if (port.isPresent()) { + //Interface interf = port.get(); + + //Read NextHops + InstanceIdentifier path = identifier.augmentation(Adjacencies.class); + Optional adjacencies = read(LogicalDatastoreType.CONFIGURATION, path); + + if (adjacencies.isPresent()) { + List nextHops = adjacencies.get().getAdjacency(); + List value = new ArrayList<>(); + + if (!nextHops.isEmpty()) { + LOG.info("NextHops are " + nextHops); + for (Adjacency nextHop : nextHops) { + nexthopManager.createLocalNextHop(interfaceName, vpnName, nextHop.getIpAddress()); + } + } + } + } + + } + + private Optional read(LogicalDatastoreType datastoreType, + InstanceIdentifier path) { + + ReadOnlyTransaction tx = broker.newReadOnlyTransaction(); + + Optional result = Optional.absent(); + try { + result = tx.read(datastoreType, path).get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return result; + } + + private InstanceIdentifier getWildCardPath() { + return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class); + } + + @Override + protected void remove(InstanceIdentifier identifier, + VpnInterface del) { + // TODO Auto-generated method stub + } + + @Override + protected void update(InstanceIdentifier identifier, + VpnInterface original, VpnInterface update) { + // TODO Auto-generated method stub + + } + +} \ No newline at end of file diff --git a/nexthopmgr/pom.xml b/nexthopmgr/pom.xml index 5c0be225..061a8091 100644 --- a/nexthopmgr/pom.xml +++ b/nexthopmgr/pom.xml @@ -11,7 +11,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL org.opendaylight.odlparent odlparent 1.5.0-SNAPSHOT - + org.opendaylight.vpnservice diff --git a/pom.xml b/pom.xml index 0db9c69d..dacac321 100644 --- a/pom.xml +++ b/pom.xml @@ -18,15 +18,15 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL model-bgp vpnmanager - distribution/karaf - features - vpnservice-artifacts interfacemgr nexthopmgr idmanager fibmanager mdsalutil bgpmanager + distribution/karaf + features + vpnservice-artifacts diff --git a/vpnservice-artifacts/pom.xml b/vpnservice-artifacts/pom.xml index a30b9989..766bb87f 100644 --- a/vpnservice-artifacts/pom.xml +++ b/vpnservice-artifacts/pom.xml @@ -17,7 +17,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html - + ${project.groupId} vpnservice-features -- 2.36.6