Fix the tunnel creation logic when the tunnel starts with adjacency Sid with multiiple ports (not using all ports) such as 101 11111 102 103

Change-Id: I3e67c87b0ef29c903503b0345ee2352046b88792
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index 5d280ae..711c2b1 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -1409,6 +1409,7 @@
         return adjecencyInfo.keySet();
     }
 
+
     /**
      * Send a Barrier request message and wait for the reply.
      * It waits for the reply for 2 seconds and it cause exception when timer
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingTunnel.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingTunnel.java
index 91acfe5..d1deb55 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingTunnel.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingTunnel.java
@@ -219,6 +219,7 @@
             NeighborSet ns) {
 
         IOF13Switch targetSw = srManager.getIOF13Switch(routeInfo.srcSwDpid);
+        int groupId = -1;
 
         if (targetSw == null) {
             log.debug("Switch {} is gone.", routeInfo.srcSwDpid);
@@ -229,8 +230,20 @@
         for (String IdStr: routeInfo.route)
             Ids.add(Integer.parseInt(IdStr));
 
-        List<PortNumber> ports = getPortsFromNeighborSet(routeInfo.srcSwDpid, ns);
-        int groupId = targetSw.createGroup(Ids, ports);
+        List<PortNumber> portNumbers = new ArrayList<PortNumber>();
+        if (routeInfo.getSrcAdjanceySid() != null) {
+            String nodeSid = srManager.getMplsLabel(routeInfo.getSrcSwDpid());
+            List<Integer> ports = srManager.getAdacencyPorts(Integer.parseInt(nodeSid),
+                    Integer.parseInt(routeInfo.getSrcAdjanceySid()));
+            for (int port: ports) {
+                portNumbers.add(PortNumber.uint32(port));
+            }
+        }
+        else {
+            portNumbers = getPortsFromNeighborSet(routeInfo.srcSwDpid, ns);
+        }
+
+        groupId = targetSw.createGroup(Ids, portNumbers);
 
         return groupId;
     }
@@ -300,6 +313,9 @@
                         routeInfo.addRoute(nodeId);
                         i++;
                     }
+                    else if (srManager.isAdjacencySid(nodeId)) {
+                        routeInfo.setSrcAdjacencySid(nodeId);
+                    }
                     routeInfo.setFwdSwDpid(fwdSws);
                     // we check only the next node ID of the source router
                     checkNeighbor = false;
@@ -573,12 +589,17 @@
         private List<Dpid> fwdSwDpids;
         private List<String> route;
         private int gropuId;
+        private String srcAdjSid;
 
         public TunnelRouteInfo() {
             fwdSwDpids = new ArrayList<Dpid>();
             route = new ArrayList<String>();
         }
 
+        public void setSrcAdjacencySid(String nodeId) {
+            this.srcAdjSid = nodeId;
+        }
+
         private void setSrcDpid(String dpid) {
             this.srcSwDpid = dpid;
         }
@@ -595,6 +616,10 @@
             this.gropuId = groupId;
         }
 
+        private String getSrcAdjanceySid() {
+            return this.srcAdjSid;
+        }
+
         public String getSrcSwDpid() {
             return this.srcSwDpid;
         }
@@ -610,6 +635,7 @@
         public int getGroupId() {
             return this.gropuId;
         }
+
     }
 
 }