X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=fibmanager%2Ffibmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Ffibmanager%2FNexthopManager.java;h=a3cd7c4eea9af109c9fde30e87a205b3441bbad3;hb=35a4833050305a6426ec0b937942f1d6f8578102;hp=b762ced40ca7f359103f7b0f474c754ee4b97c60;hpb=fd902f24e59b49b7c0461cb2862e77c2134bec6f;p=vpnservice.git diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/NexthopManager.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/NexthopManager.java index b762ced4..a3cd7c4e 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/NexthopManager.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/NexthopManager.java @@ -24,6 +24,7 @@ import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; 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.inet.types.rev100924.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase; @@ -33,9 +34,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.GetTunnelInterfaceIdInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.GetTunnelInterfaceIdOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.itm.rpcs.rev151217.ItmRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetExternalTunnelInterfaceNameInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetExternalTunnelInterfaceNameOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetInternalOrExternalInterfaceNameInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetInternalOrExternalInterfaceNameOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetTunnelInterfaceNameInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetTunnelInterfaceNameOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdOutput; @@ -78,6 +83,7 @@ public class NexthopManager implements AutoCloseable { private static final short FIB_TABLE = 21; private static final short DEFAULT_FLOW_PRIORITY = 10; private static final String NEXTHOP_ID_POOL_NAME = "nextHopPointerPool"; + private static final long FIXED_DELAY_IN_MILLISECONDS = 4000; private static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { @@ -214,23 +220,39 @@ public class NexthopManager implements AutoCloseable { return listActionInfo; } - protected Integer getTunnelInterfaceId(BigInteger srcDpId, BigInteger dstDpId) { - // FIXME: Enable during itm integration - /* + protected String getTunnelInterfaceName(BigInteger srcDpId, BigInteger dstDpId) { try { - Future> result = itmManager.getTunnelInterfaceId(new GetTunnelInterfaceIdInputBuilder() + Future> result = itmManager.getTunnelInterfaceName(new GetTunnelInterfaceNameInputBuilder() .setSourceDpid(srcDpId) .setDestinationDpid(dstDpId).build()); - RpcResult rpcResult = result.get(); + RpcResult rpcResult = result.get(); if(!rpcResult.isSuccessful()) { LOG.warn("RPC Call to getTunnelInterfaceId returned with Errors {}", rpcResult.getErrors()); } else { - return rpcResult.getResult().getInterfaceid(); + return rpcResult.getResult().getInterfaceName(); } } catch (InterruptedException | ExecutionException e) { LOG.warn("Exception when getting tunnel interface Id for tunnel between {} and {}", srcDpId, dstDpId, e); } - */ + + return null; + } + + protected String getTunnelInterfaceName(BigInteger srcDpId, IpAddress dstIp) { + try { + Future> result = itmManager.getInternalOrExternalInterfaceName(new GetInternalOrExternalInterfaceNameInputBuilder() + .setSourceDpid(srcDpId) + .setDestinationIp(dstIp).build()); + RpcResult rpcResult = result.get(); + if(!rpcResult.isSuccessful()) { + LOG.warn("RPC Call to getTunnelInterfaceName returned with Errors {}", rpcResult.getErrors()); + } else { + return rpcResult.getResult().getInterfaceName(); + } + } catch (InterruptedException | ExecutionException e) { + LOG.warn("Exception when getting tunnel interface Id for tunnel between {} and {}", srcDpId, dstIp, e); + } + return null; } @@ -264,8 +286,7 @@ public class NexthopManager implements AutoCloseable { addVpnNexthopToDS(dpnId, vpnId, ipAddress, groupId); // install Group - // FIXME: mdsalManager.syncInstallGroup(groupEntity); - mdsalManager.installGroup(groupEntity); + mdsalManager.syncInstallGroup(groupEntity, FIXED_DELAY_IN_MILLISECONDS); } else { //nexthop exists already; a new flow is going to point to it, increment the flowrefCount by 1 @@ -334,41 +355,22 @@ public class NexthopManager implements AutoCloseable { } - public List getRemoteNextHopPointer(BigInteger localDpnId, BigInteger remoteDpnId, + public String getRemoteNextHopPointer(BigInteger localDpnId, BigInteger remoteDpnId, long vpnId, String prefixIp, String nextHopIp) { - List remoteNextHopActions = null; + String tunnelIfName = null; LOG.trace("getRemoteNextHopPointer: input [localDpnId {} remoteDpnId {}, vpnId {}, prefixIp {}, nextHopIp {} ]", localDpnId, remoteDpnId, vpnId, prefixIp, nextHopIp); - // check if the incoming VM is within the same DC. If so, retrieve the local tunnel group pointer. - // Else retrieve the tunnel to DC gateway group pointer. - - if (localDpnId == null || BigInteger.ZERO.equals(localDpnId)) { - VpnNexthop vpnNexthop = getVpnNexthop(vpnId, prefixIp); - //If the vrf entry is a static/extra route, the nexthop of the entry would be a adjacency in the vpn - if(vpnNexthop == null) { - vpnNexthop = getVpnNexthop(vpnId, nextHopIp + "/32"); - } - localDpnId = (vpnNexthop == null) ? null : vpnNexthop.getDpnId(); - } LOG.trace("getRemoteNextHopPointer: Calling ITM with localDpnId {} ", localDpnId); - try{ - if(localDpnId != null){ - Integer interfaceId = getTunnelInterfaceId(remoteDpnId, localDpnId); - if(interfaceId != null) { - remoteNextHopActions = - getEgressActionsForInterface( - getTunnelInterfaceId(remoteDpnId, localDpnId).toString()); - } - } else { - // FIXME: dynamically build and use tunnel to dc gateway. - // remoteNextHopActions = itmManager.getEgressOutputForDCGateway(remoteDpnId, - // IpAddressBuilder.getDefaultInstance(nextHopIp)); + if (nextHopIp != null && !nextHopIp.isEmpty()) { + try{ + // here use the config for tunnel type param + tunnelIfName = getTunnelInterfaceName(remoteDpnId, IpAddressBuilder.getDefaultInstance(nextHopIp)); + }catch(Exception ex){ + LOG.error("Error while retrieving nexthop pointer for nexthop {} : ", nextHopIp, ex.getMessage()); } - }catch(Exception ex){ - LOG.error("Error while retrieving nexthop pointer for DC Gateway : ", ex.getMessage()); } - return remoteNextHopActions; + return tunnelIfName; } public BigInteger getDpnForPrefix(long vpnId, String prefixIp) { @@ -401,8 +403,7 @@ public class NexthopManager implements AutoCloseable { GroupEntity groupEntity = MDSALUtil.buildGroupEntity( dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null); // remove Group ... - // FIXME: mdsalManager.syncRemoveGroup(groupEntity); - mdsalManager.removeGroup(groupEntity); + mdsalManager.syncRemoveGroup(groupEntity); //update MD-SAL DS removeVpnNexthopFromDS(vpnId, ipAddress); //release groupId @@ -463,4 +464,10 @@ public class NexthopManager implements AutoCloseable { .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).augmentation( Adjacencies.class).child(Adjacency.class, new AdjacencyKey(ipAddress)).build(); } + + InstanceIdentifier getAdjListPath(String vpnInterfaceName) { + return InstanceIdentifier.builder(VpnInterfaces.class) + .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).augmentation( + Adjacencies.class).build(); + } }