X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=nexthopmgr%2Fnexthopmgr-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Fnexthopmgr%2FNexthopManager.java;h=a8f411c7ddb301a471b71d0bb1da7476daaa921d;hb=f712d08c9d4d33d7c3f8373a5796d617c523f2b8;hp=8e1a4fc2e37d7cdf0d1eeec7af8d750baa389570;hpb=7cecb2563e0ae0f68015a3b8b0495e7ea9881080;p=vpnservice.git 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 8e1a4fc2..a8f411c7 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 @@ -17,13 +17,13 @@ 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.yangtools.yang.common.RpcResultBuilder; 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; @@ -79,7 +79,6 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { */ public NexthopManager(final DataBroker db) { broker = db; - createNexthopPointerPool(); } @Override @@ -99,7 +98,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { this.idManager = idManager; } - private void createNexthopPointerPool() { + protected void createNexthopPointerPool() { CreateIdPoolInput createPool = new CreateIdPoolInputBuilder() .setPoolName("nextHopPointerPool") .setIdStart(1L) @@ -123,12 +122,12 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { InstanceIdentifier id = idBuilder.build(); InstanceIdentifier idx = id.augmentation(VpnInstance1.class); - Optional vpn = read(LogicalDatastoreType.CONFIGURATION, idx); + Optional vpn = read(LogicalDatastoreType.OPERATIONAL, idx); if (vpn.isPresent()) { return vpn.get().getVpnId(); } else { - return 0; + return -1; } } @@ -166,7 +165,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { BucketInfo bucket = new BucketInfo(listActionInfo); // MAC re-write if (macAddress != null) { - listActionInfo.add(new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress})); + listActionInfo.add(0, new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress})); + listActionInfo.add(new ActionInfo(ActionType.pop_mpls, new String[]{})); } else { //FIXME: Log message here. } @@ -215,7 +215,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { // check if vpn node is there or to be created InstanceIdentifier id = idBuilder.build(); - Optional nexthops = read(LogicalDatastoreType.CONFIGURATION, id); + Optional nexthops = read(LogicalDatastoreType.OPERATIONAL, id); if (!nexthops.isPresent()) { // create a new node VpnNexthops node = new VpnNexthopsBuilder().setKey(new VpnNexthopsKey(vpnId)).setVpnId(vpnId).build(); @@ -241,7 +241,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { // check if dpn node is there or to be created InstanceIdentifier id = idBuilder.build(); - Optional nexthops = read(LogicalDatastoreType.CONFIGURATION, id); + Optional nexthops = read(LogicalDatastoreType.OPERATIONAL, id); if (!nexthops.isPresent()) { // create a new node TunnelNexthops node = new TunnelNexthopsBuilder() @@ -270,8 +270,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { 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()) { + Optional vpnNexthops = read(LogicalDatastoreType.OPERATIONAL, id); + if (vpnNexthops.isPresent()) { // get nexthops list for vpn List nexthops = vpnNexthops.get().getVpnNexthop(); @@ -293,8 +293,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { // check if vpn node is there InstanceIdentifier id = idBuilder.build(); - Optional dpnNexthops = read(LogicalDatastoreType.CONFIGURATION, id); - if (!dpnNexthops.isPresent()) { + Optional dpnNexthops = read(LogicalDatastoreType.OPERATIONAL, id); + if (dpnNexthops.isPresent()) { List nexthops = dpnNexthops.get().getTunnelNexthop(); for (TunnelNexthop nexthop : nexthops) { if (nexthop.getIpAddress().equals(ipAddress)) { @@ -337,17 +337,16 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { } - public void removeLocalNextHop(String vpnName, String ipAddress) { - - long vpnId = getVpnId(vpnName); + public void removeLocalNextHop(Long dpId, Long vpnId, String ipAddress) { 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 - + GroupEntity groupEntity = MDSALUtil.buildGroupEntity( + dpId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null); // remove Group ... - + mdsalManager.removeGroup(groupEntity); //update MD-SAL DS removeVpnNexthopFromDS(vpnId, ipAddress); } else { @@ -364,6 +363,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { // we need to do it before the group is removed // remove Group ... + GroupEntity groupEntity = MDSALUtil.buildGroupEntity( + dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null); + // remove Group ... + mdsalManager.removeGroup(groupEntity); //update MD-SAL DS removeTunnelNexthopFromDS(dpnId, ipAddress); } else { @@ -375,15 +378,25 @@ 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 = null; - //Rpcs. getRpcResult(false, output.build()); - return Futures.immediateFuture(result); + String endpointIp = interfaceManager.getEndpointIpForDpn(input.getDpnId()); + if (input.getNexthopIp().equals(endpointIp)) { + VpnNexthop vpnNextHop = getVpnNexthop(input.getVpnId(), input.getIpPrefix()); + output.setEgressPointer(vpnNextHop.getEgressPointer()); + output.setLocalDestination(true); + } else { + TunnelNexthop tunnelNextHop = getTunnelNexthop(input.getDpnId(), input.getNexthopIp()); + output.setEgressPointer(tunnelNextHop.getEgressPointer()); + output.setLocalDestination(false); + } + + RpcResultBuilder rpcResultBuilder = RpcResultBuilder.success(); + rpcResultBuilder.withResult(output.build()); + + return Futures.immediateFuture(rpcResultBuilder.build()); + } private Optional read(LogicalDatastoreType datastoreType, @@ -415,4 +428,20 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { Futures.addCallback(tx.submit(), DEFAULT_CALLBACK); } -} \ No newline at end of file + @Override + public Future> removeLocalNextHop(RemoveLocalNextHopInput input) { + VpnNexthop vpnNextHop = getVpnNexthop(input.getVpnId(), input.getIpPrefix()); + RpcResultBuilder rpcResultBuilder; + LOG.debug("vpnnexthop is: {}", vpnNextHop); + try { + removeLocalNextHop(input.getDpnId(),input.getVpnId(), input.getIpPrefix()); + rpcResultBuilder = RpcResultBuilder.success(); + } + catch(Exception e){ + LOG.error("Removal of local next hop for vpnNextHop {} failed {}" ,vpnNextHop, e); + rpcResultBuilder = RpcResultBuilder.failed(); + } + return Futures.immediateFuture(rpcResultBuilder.build()); + } + +}