ELAN FT Support for BE
[vpnservice.git] / nexthopmgr / nexthopmgr-impl / src / main / java / org / opendaylight / vpnservice / nexthopmgr / NexthopManager.java
old mode 100644 (file)
new mode 100755 (executable)
index 5c0184e..cb1447f
@@ -34,12 +34,15 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 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.l3vpn.rev130911.VpnInstance1;
+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;
 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.idmanager.rev150403.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInputBuilder;
 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.*;
@@ -61,7 +64,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
     private final DataBroker broker;
     private IMdsalApiManager mdsalManager;
     private IInterfaceManager interfaceManager;
-    private IdManager idManager;
+    private IdManagerService idManager;
     private static final short LPORT_INGRESS_TABLE = 0;
     private static final short LFIB_TABLE = 20;
     private static final short FIB_TABLE = 21;
@@ -100,26 +103,19 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         this.mdsalManager = mdsalManager;
     }
 
-    public void setIdManager(IdManager idManager) {
+    public void setIdManager(IdManagerService idManager) {
         this.idManager = idManager;
     }
 
     protected void createNexthopPointerPool() {
         CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
-            .setPoolName("nextHopPointerPool")
-            .setIdStart(1L)
-            .setPoolSize(new BigInteger("65535"))
-            .build();
+                .setPoolName("nextHopPointerPool")
+                .setLow(150000L)
+                .setHigh(175000L)
+                .build();
         //TODO: Error handling
         Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
         LOG.trace("NextHopPointerPool result : {}", result);
-//            try {
-//                LOG.info("Result2: {}",result.get());
-//            } catch (InterruptedException | ExecutionException e) {
-//                // TODO Auto-generated catch block
-//                LOG.error("Error in result.get");
-//            }
-
     }
 
 
@@ -128,33 +124,36 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName));
 
         InstanceIdentifier<VpnInstance> id = idBuilder.build();
-        InstanceIdentifier<VpnInstance1> idx = id.augmentation(VpnInstance1.class);
-        Optional<VpnInstance1> vpn = read(LogicalDatastoreType.OPERATIONAL, idx);
-
-        if (vpn.isPresent()) {
-            LOG.debug("VPN id returned: {}", vpn.get().getVpnId());
-            return vpn.get().getVpnId();
-        } else {
-            return -1;
-        }
+        //FIXME [ELAnBE] Commenting out below 2 lines
+        //InstanceIdentifier<VpnInstance1> idx = id.augmentation(VpnInstance1.class);
+        //Optional<VpnInstance1> vpn = read(LogicalDatastoreType.OPERATIONAL, idx);
+
+
+//        if (vpn.isPresent()) {
+//            LOG.debug("VPN id returned: {}", vpn.get().getVpnId());
+//            return vpn.get().getVpnId();
+//        } else {
+//            return -1;
+//        }
+        return -1;
     }
 
-    private long getDpnId(String ifName) {
-        String[] fields = ifName.split(":");
-        long dpn = Integer.parseInt(fields[1]);
+    private BigInteger getDpnId(String ofPortId) {
+        String[] fields = ofPortId.split(":");
+        BigInteger dpn = new BigInteger(fields[1]);
         LOG.debug("DpnId: {}", dpn);
         return dpn;
     }
 
-    protected int createNextHopPointer(String nexthopKey) {
-        GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder()
-            .setPoolName("nextHopPointerPool").setIdKey(nexthopKey)
-            .build();
+    protected long createNextHopPointer(String nexthopKey) {
+        AllocateIdInput getIdInput = new AllocateIdInputBuilder()
+                .setPoolName("nextHopPointerPool").setIdKey(nexthopKey)
+                .build();
         //TODO: Proper error handling once IdManager code is complete
         try {
-            Future<RpcResult<GetUniqueIdOutput>> result = idManager.getUniqueId(getIdInput);
-            RpcResult<GetUniqueIdOutput> rpcResult = result.get();
-            return rpcResult.getResult().getIdValue().intValue();
+            Future<RpcResult<AllocateIdOutput>> result = idManager.allocateId(getIdInput);
+            RpcResult<AllocateIdOutput> rpcResult = result.get();
+            return rpcResult.getResult().getIdValue();
         } catch (NullPointerException | InterruptedException | ExecutionException e) {
             LOG.trace("",e);
         }
@@ -163,10 +162,10 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
     public void createLocalNextHop(String ifName, String vpnName, String ipAddress, String macAddress) {
         String nhKey = new String("nexthop." + vpnName + ipAddress);
-        int groupId = createNextHopPointer(nhKey);
+        long groupId = createNextHopPointer(nhKey);
 
         long vpnId = getVpnId(vpnName);
-        long dpnId = interfaceManager.getDpnForInterface(ifName);
+        BigInteger dpnId = interfaceManager.getDpnForInterface(ifName);
         VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress, 0);
         LOG.trace("nexthop: {}", nexthop);
         if (nexthop == null) {
@@ -195,11 +194,11 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    public void createRemoteNextHop(String ifName, String ofPortId, String ipAddress) {
+    public void createRemoteNextHop(String ifName, String ipAddress) {
         String nhKey = new String("nexthop." + ifName + ipAddress);
-        int groupId = createNextHopPointer(nhKey);
+        long groupId = createNextHopPointer(nhKey);
 
-        long dpnId = getDpnId(ofPortId);
+        BigInteger dpnId = interfaceManager.getDpnForInterface(ifName);
         TunnelNexthop nexthop = getTunnelNexthop(dpnId, ipAddress);
         if (nexthop == null) {
             List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
@@ -210,7 +209,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
             GroupEntity groupEntity = MDSALUtil.buildGroupEntity(
                 dpnId, groupId, ipAddress, GroupTypes.GroupIndirect, listBucketInfo);
             mdsalManager.installGroup(groupEntity);
-            makeRemoteFlow(dpnId, ifName, NwConstants.ADD_FLOW);
+            //makeRemoteFlow(dpnId, ifName, NwConstants.ADD_FLOW);
 
             //update MD-SAL DS
             addTunnelNexthopToDS(dpnId, ipAddress, groupId);
@@ -219,21 +218,21 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    private void makeRemoteFlow(long dpId, String ifName, int addOrRemoveFlow) {
+    private void makeRemoteFlow(BigInteger dpnId, String ifName, int addOrRemoveFlow) {
         long portNo = 0;
         String flowName = ifName;
-        String flowRef = getTunnelInterfaceFlowRef(dpId, LPORT_INGRESS_TABLE, ifName);
+        String flowRef = getTunnelInterfaceFlowRef(dpnId, LPORT_INGRESS_TABLE, ifName);
         List<MatchInfo> matches = new ArrayList<MatchInfo>();
         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
-            interfaceManager.getPortForInterface(ifName);
-            matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {
-                dpId, portNo }));
+            portNo = interfaceManager.getPortForInterface(ifName);
+            matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {
+                dpnId, BigInteger.valueOf(portNo) }));
             mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {LFIB_TABLE}));
         }
 
         BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
-        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, LPORT_INGRESS_TABLE, flowRef,
+        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, LPORT_INGRESS_TABLE, flowRef,
                                                           DEFAULT_FLOW_PRIORITY, flowName, 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
 
         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
@@ -243,8 +242,8 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    private String getTunnelInterfaceFlowRef(long dpId, short tableId, String ifName) {
-                return new StringBuilder().append(dpId).append(tableId).append(ifName).toString();
+    private String getTunnelInterfaceFlowRef(BigInteger dpnId, short tableId, String ifName) {
+                return new StringBuilder().append(dpnId).append(tableId).append(ifName).toString();
             }
 
     protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
@@ -266,7 +265,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
     }
 
-    private void addTunnelNexthopToDS(long dpnId, String ipPrefix, long egressPointer) {
+    private void addTunnelNexthopToDS(BigInteger dpnId, String ipPrefix, long egressPointer) {
         InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
 
@@ -313,7 +312,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         return null;
     }
 
-    private TunnelNexthop getTunnelNexthop(long dpnId, String ipAddress) {
+    private TunnelNexthop getTunnelNexthop(BigInteger dpnId, String ipAddress) {
         
         InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
@@ -333,7 +332,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         return null;
     }
 
-    public long getNextHopPointer(long dpnId, long vpnId, String prefixIp, String nextHopIp) {
+    public long getNextHopPointer(BigInteger dpnId, long vpnId, String prefixIp, String nextHopIp) {
         String endpointIp = interfaceManager.getEndpointIpForDpn(dpnId);
         if (nextHopIp.equals(endpointIp)) {
             VpnNexthop vpnNextHop = getVpnNexthop(vpnId, prefixIp, 0);
@@ -345,7 +344,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         }
     }
 
-    private void removeTunnelNexthopFromDS(long dpnId, String ipPrefix) {
+    private void removeTunnelNexthopFromDS(BigInteger dpnId, String ipPrefix) {
 
         InstanceIdentifierBuilder<TunnelNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
                 .child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId))
@@ -368,14 +367,14 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
     }
 
  
-    public void removeLocalNextHop(Long dpId, Long vpnId, String ipAddress) {
+    public void removeLocalNextHop(BigInteger dpnId, Long vpnId, String ipAddress) {
 
         VpnNexthop nh = getVpnNexthop(vpnId, ipAddress, 0);
         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);
+                    dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null);
             // remove Group ...
             mdsalManager.removeGroup(groupEntity);
             //update MD-SAL DS
@@ -387,7 +386,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
     }
 
-    public void removeRemoteNextHop(long dpnId, String ifName, String ipAddress) {
+    public void removeRemoteNextHop(BigInteger dpnId, String ifName, String ipAddress) {
 
         TunnelNexthop nh = getTunnelNexthop(dpnId, ipAddress);
         if (nh != null) {
@@ -399,7 +398,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
                     dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null);
             // remove Group ...
             mdsalManager.removeGroup(groupEntity);
-            makeRemoteFlow(dpnId, ifName, NwConstants.DEL_FLOW);
+            //makeRemoteFlow(dpnId, ifName, NwConstants.DEL_FLOW);
             //update MD-SAL DS
             removeTunnelNexthopFromDS(dpnId, ipAddress);
         } else {
@@ -417,7 +416,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
 
         String endpointIp = interfaceManager.getEndpointIpForDpn(input.getDpnId());
         LOG.trace("getEgressPointer: input {}, endpointIp {}", input, endpointIp);
-        if (input.getNexthopIp().equals(endpointIp)) {
+        if (input.getNexthopIp() == null || input.getNexthopIp().equals(endpointIp)) {
             VpnNexthop vpnNextHop = getVpnNexthop(input.getVpnId(), input.getIpPrefix(), 5);
             output.setEgressPointer(vpnNextHop.getEgressPointer());
             output.setLocalDestination(true);
@@ -434,7 +433,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         
     }
 
-    private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
+    <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
             InstanceIdentifier<T> path) {
 
         ReadOnlyTransaction tx = broker.newReadOnlyTransaction();