From cd331f15ad231c081bf3725fd10e8cfd39f58241 Mon Sep 17 00:00:00 2001 From: esravik Date: Mon, 4 May 2015 11:21:20 +0530 Subject: [PATCH] 1. nexthopMgr intg with MdSalUtil & IdMgr 2. Updates to interfacemanager Change-Id: Id670b92cbdc5a283a2cf26775cd81dfd46baaa1e Signed-off-by: esravik --- .../interfaces/IInterfaceManager.java | 4 +- .../interfacemgr/InterfaceManager.java | 73 ++-- .../interfacemgr/InterfacemgrProvider.java | 5 +- nexthopmgr/nexthopmgr-impl/pom.xml | 15 + .../src/main/config/default-config.xml | 10 + .../vpnservice/nexthopmgr/NexthopManager.java | 312 +++++++++++++----- .../nexthopmgr/NexthopmgrProvider.java | 20 +- .../OdlInterfaceChangeListener.java | 25 +- .../VpnInterfaceChangeListener.java | 92 +++--- .../impl/rev150325/NexthopmgrImplModule.java | 3 + .../src/main/yang/nexthopmgr-impl.yang | 18 + 11 files changed, 401 insertions(+), 176 deletions(-) diff --git a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java index 2680e04e..206e6e11 100644 --- a/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java +++ b/interfacemgr/interfacemgr-api/src/main/java/org/opendaylight/vpnservice/interfacemgr/interfaces/IInterfaceManager.java @@ -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 getInterfaceIngressRule(String ifName); - public List getInterfaceEgressActions(String ifName); + public List getInterfaceEgressActions(String ifName); } \ No newline at end of file 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 index ba531b6f..8f0a4aa3 100644 --- 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 @@ -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 impl return id; } - private InstanceIdentifier buildStateInterfaceId(String interfaceName) { + private InstanceIdentifier + + buildStateInterfaceId(String interfaceName) { //TODO Make this generic and move to AbstractDataChangeListener or Utils. - InstanceIdentifierBuilder idBuilder = - InstanceIdentifier.builder(InterfacesState.class) + InstanceIdentifierBuilder + + 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 id = idBuilder.build(); @@ -470,19 +475,22 @@ public class InterfaceManager extends AbstractDataChangeListener impl return dbDpnEndpoints.get(dpnNodeId); } - List getInterfaceIngressRule(String ifName){ + List getInterfaceIngressRule(String ifName) { Interface iface = getInterfaceByIfName(ifName); List matches = new ArrayList(); Class 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 tunnType = ifL3Tunnel.getTunnelType(); @@ -497,22 +505,47 @@ public class InterfaceManager extends AbstractDataChangeListener impl return matches; } - public List getInterfaceEgressActions(String ifName) { + public List getInterfaceEgressActions(String ifName) { Interface iface = getInterfaceByIfName(ifName); - List instructions = new ArrayList(); - List actionInfos = new ArrayList(); + List listActionInfo = new ArrayList(); Class 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 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) { diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index f177f17b..01bf1f7c 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -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 getInterfaceEgressActions(String ifName) { + public List getInterfaceEgressActions(String ifName) { return interfaceManager.getInterfaceEgressActions(ifName); } } diff --git a/nexthopmgr/nexthopmgr-impl/pom.xml b/nexthopmgr/nexthopmgr-impl/pom.xml index c519fe5e..a6f04dd2 100644 --- a/nexthopmgr/nexthopmgr-impl/pom.xml +++ b/nexthopmgr/nexthopmgr-impl/pom.xml @@ -31,11 +31,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html interfacemgr-api ${project.version} + + org.opendaylight.vpnservice + idmanager-api + 0.0.1-SNAPSHOT + + + org.opendaylight.vpnservice + idmanager-impl + 0.0.1-SNAPSHOT + ${project.groupId} nexthopmgr-api ${project.version} + + ${project.groupId} + mdsalutil-api + ${project.version} + diff --git a/nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml b/nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml index c44c0b3b..18c12e61 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml +++ b/nexthopmgr/nexthopmgr-impl/src/main/config/default-config.xml @@ -11,6 +11,8 @@ and is available at http://www.eclipse.org/legal/epl-v10.html urn:opendaylight:params:xml:ns:yang:nexthopmgr:impl?module=nexthopmgr-impl&revision=2015-03-25 urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + urn:opendaylight:params:xml:ns:yang:mdsalutil:api?module=odl-mdsalutil&revision=2015-04-10 + urn:opendaylight:vpnservice:interfacemgr?module=odl-interface&revision=2015-03-31 @@ -23,6 +25,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html binding:binding-broker-osgi-registry binding-osgi-broker + + mdsalutil:odl-mdsalutil + mdsalutil-service + + + odlif:odl-interface + interfacemgr-service + 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 38b0d6e3..8e1a4fc2 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 @@ -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 DEFAULT_CALLBACK = new FutureCallback() { @@ -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 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???); - */ + private void createNexthopPointerPool() { + CreateIdPoolInput createPool = new CreateIdPoolInputBuilder() + .setPoolName("nextHopPointerPool") + .setIdStart(1L) + .setPoolSize(new BigInteger("65535")) + .build(); + //TODO: Error handling + Future> 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 idBuilder = InstanceIdentifier.builder(VpnInstances.class) .child(VpnInstance.class, new VpnInstanceKey(vpnName)); @@ -99,32 +125,81 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { InstanceIdentifier idx = id.augmentation(VpnInstance1.class); Optional 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> result = idManager.getUniqueId(getIdInput); + RpcResult 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 listBucketInfo = new ArrayList(); + List 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 listBucketInfo = new ArrayList(); - List listActionInfo = interfacemgr.getEgressGroupActions(ifName); + List listBucketInfo = new ArrayList(); + List 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 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 idBuilder = InstanceIdentifier.builder(L3nexthop.class) .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId)); @@ -170,7 +244,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { Optional 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 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; + // check if vpn node is there + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(VpnNexthops.class, new VpnNexthopsKey(vpnId)); + InstanceIdentifier id = idBuilder.build(); + Optional vpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id); + if (!vpnNexthops.isPresent()) { + + // get nexthops list for vpn + List 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 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); + + InstanceIdentifierBuilder 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 id = idBuilder.build(); + Optional dpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id); + if (!dpnNexthops.isPresent()) { + List 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 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???); + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId)) + .child(TunnelNexthop.class, new TunnelNexthopKey(ipPrefix)); + InstanceIdentifier id = idBuilder.build(); + // remove from DS + delete(LogicalDatastoreType.OPERATIONAL, id); + } + + private void removeVpnNexthopFromDS(long vpnId, String ipPrefix) { + + InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) + .child(VpnNexthops.class, new VpnNexthopsKey(vpnId)) + .child(VpnNexthop.class, new VpnNexthopKey(ipPrefix)); + InstanceIdentifier 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> getEgressPointer( + GetEgressPointerInput input) { + long egressGroupId = + getNextHopPointer(input.getDpnId(), input.getVpnId(), input.getIpPrefix(), input.getNexthopIp()); + + GetEgressPointerOutputBuilder output = new GetEgressPointerOutputBuilder(); + output.setEgressPointer(egressGroupId); + + RpcResult result = null; + //Rpcs. getRpcResult(false, output.build()); + return Futures.immediateFuture(result); } private Optional read(LogicalDatastoreType datastoreType, @@ -265,18 +409,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { } - @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; + private void delete(LogicalDatastoreType datastoreType, InstanceIdentifier path) { + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.delete(datastoreType, path); + Futures.addCallback(tx.submit(), DEFAULT_CALLBACK); } } \ 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 68758b6d..57b7a766 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 @@ -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(); 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 index d97fc88e..e8a5bc2e 100644 --- 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 @@ -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 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 identifier, Interface intrf) { + 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); + 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 getWildCardPath() { return InstanceIdentifier.create(Interfaces.class).child(Interface.class); } @@ -88,13 +92,14 @@ public class OdlInterfaceChangeListener extends AbstractDataChangeListener 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); } } 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 index 855f387d..1245a12a 100644 --- 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 @@ -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 implements AutoCloseable { +public class VpnInterfaceChangeListener extends AbstractDataChangeListener implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceChangeListener.class); private ListenerRegistration listenerRegistration; @@ -43,7 +35,7 @@ public class VpnInterfaceChangeListener extends AbstractDataChangeListener 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()); - } - } - } + protected void add(InstanceIdentifier identifier, + Adjacencies adjs) { + + InstanceIdentifier vpnIfId = identifier.firstIdentifierOf(VpnInterface.class); + Optional vpnIf = read(LogicalDatastoreType.CONFIGURATION, vpnIfId); + VpnInterface vpnIfData = vpnIf.get(); + + List adjList = adjs.getAdjacency(); + for (Adjacency adjacency : adjList) { + nexthopManager.createLocalNextHop( + vpnIfData.getName(), + vpnIfData.getVpnInstanceName(), + adjacency.getIpAddress(), + adjacency.getMacAddress()); } + } + + + @Override + protected void remove(InstanceIdentifier identifier, + Adjacencies adjs) { + InstanceIdentifier vpnIfId = identifier.firstIdentifierOf(VpnInterface.class); + Optional vpnIf = read(LogicalDatastoreType.CONFIGURATION, vpnIfId); + VpnInterface vpnIfData = vpnIf.get(); + + List adjList = adjs.getAdjacency(); + for (Adjacency adjacency : adjList) { + nexthopManager.removeLocalNextHop(vpnIfData.getVpnInstanceName(), adjacency.getIpAddress()); + } + + } + @Override + protected void update(InstanceIdentifier identifier, + Adjacencies original, Adjacencies update) { + // TODO Auto-generated method stub } + private Optional read(LogicalDatastoreType datastoreType, InstanceIdentifier path) { @@ -122,21 +120,9 @@ public class VpnInterfaceChangeListener extends AbstractDataChangeListener getWildCardPath() { - return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class); + private InstanceIdentifier getWildCardPath() { + return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.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/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java index 90470f0c..4b7d4aea 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nexthopmgr/impl/rev150325/NexthopmgrImplModule.java @@ -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; } diff --git a/nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang b/nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang index 8c60aba8..3b50fdaf 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang +++ b/nexthopmgr/nexthopmgr-impl/src/main/yang/nexthopmgr-impl.yang @@ -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; + } + } + } } } } -- 2.36.6