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=29d5acd9bd677fcfd791664a264e651b6c385855;hb=78638a6543c647ffff30d36e52604f5b7b5e785b;hp=8239e9a8eb8c90e702e815ed30eaf12c19998068;hpb=4117a803b76e256de9d447c886b16de34f4c2793;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 8239e9a8..29d5acd9 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 @@ -64,7 +64,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { private static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { public void onSuccess(Void result) { - LOG.info("Success in Datastore write operation"); + LOG.debug("Success in Datastore write operation"); } public void onFailure(Throwable error) { LOG.error("Error in Datastore write operation", error); @@ -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) @@ -107,6 +106,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { .build(); //TODO: Error handling Future> result = idManager.createIdPool(createPool); + LOG.trace("NextHopPointerPool result : {}", result); // try { // LOG.info("Result2: {}",result.get()); // } catch (InterruptedException | ExecutionException e) { @@ -123,18 +123,20 @@ 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()) { + LOG.debug("VPN id returned: {}", vpn.get().getVpnId()); return vpn.get().getVpnId(); } else { - return 0; + return -1; } } private long getDpnId(String ifName) { String[] fields = ifName.split(":"); long dpn = Integer.parseInt(fields[1]); + LOG.debug("DpnId: {}", dpn); return dpn; } @@ -160,15 +162,18 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { long vpnId = getVpnId(vpnName); long dpnId = interfaceManager.getDpnForInterface(ifName); VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress); + LOG.trace("nexthop: {}", nexthop); 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})); + listActionInfo.add(0, new ActionInfo(ActionType.set_field_eth_dest, new String[]{macAddress})); + listActionInfo.add(0, new ActionInfo(ActionType.pop_mpls, new String[]{})); } else { //FIXME: Log message here. + LOG.debug("mac address for new local nexthop is null"); } listBucketInfo.add(bucket); GroupEntity groupEntity = MDSALUtil.buildGroupEntity( @@ -215,7 +220,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(); @@ -230,7 +235,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { InstanceIdentifier id1 = idBuilder .child(VpnNexthop.class, new VpnNexthopKey(ipPrefix)).build(); - + LOG.trace("Adding vpnnextHop {} to Operational DS", nh); asyncWrite(LogicalDatastoreType.OPERATIONAL, id1, nh, DEFAULT_CALLBACK); } @@ -241,13 +246,14 @@ 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() .setKey(new TunnelNexthopsKey(dpnId)) .setDpnId(dpnId) .build(); + LOG.trace("Adding tunnelnextHop {} to Operational DS for a new node", node); asyncWrite(LogicalDatastoreType.OPERATIONAL, id, node, DEFAULT_CALLBACK); } @@ -259,7 +265,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { InstanceIdentifier id1 = idBuilder .child(TunnelNexthop.class, new TunnelNexthopKey(ipPrefix)).build(); - + LOG.trace("Adding tunnelnextHop {} to Operational DS for a dpn node", nh); asyncWrite(LogicalDatastoreType.OPERATIONAL, id1, nh, DEFAULT_CALLBACK); } @@ -270,14 +276,15 @@ 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(); for (VpnNexthop nexthop : nexthops) { if (nexthop.getIpAddress().equals(ipAddress)) { // return nexthop + LOG.trace("VpnNextHop : {}",nexthop); return nexthop; } } @@ -293,11 +300,12 @@ 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)) { + LOG.trace("TunnelNextHop : {}",nexthop); return nexthop; } } @@ -312,6 +320,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { return vpnNextHop.getEgressPointer(); } else { TunnelNexthop tunnelNextHop = getTunnelNexthop(dpnId, nextHopIp); + LOG.trace("NExtHopPointer : {}", tunnelNextHop.getEgressPointer()); return tunnelNextHop.getEgressPointer(); } } @@ -323,6 +332,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { .child(TunnelNexthop.class, new TunnelNexthopKey(ipPrefix)); InstanceIdentifier id = idBuilder.build(); // remove from DS + LOG.trace("Removing tunnel next hop from datastore : {}", id); delete(LogicalDatastoreType.OPERATIONAL, id); } @@ -333,25 +343,26 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { .child(VpnNexthop.class, new VpnNexthopKey(ipPrefix)); InstanceIdentifier id = idBuilder.build(); // remove from DS + LOG.trace("Removing vpn next hop from datastore : {}", id); delete(LogicalDatastoreType.OPERATIONAL, id); } - 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 { //throw error + LOG.error("removal of local next hop failed"); } } @@ -364,10 +375,15 @@ 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 { //throw error + LOG.error("removal of remote next hop failed : dpnid : {}, ipaddress : {}", dpnId, ipAddress); } } @@ -375,11 +391,20 @@ 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); + + String endpointIp = interfaceManager.getEndpointIpForDpn(input.getDpnId()); + LOG.trace("getEgressPointer: input {}, endpointIp {}", input, endpointIp); + 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()); @@ -417,4 +442,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()); + } + +}