[ONOS-700][ONOS-1801]refactor tunnel subsystem api.
1.use more abstract and more flexible entity[TunnelPoint] to represent
for source or destination point of tunnel,instead of Label
2.suport for muti-producer
3.use Order entity to record tunnel-order relationship
4.modify Tunnel entity to add more properties.
5.rename Label and LabelId to OpticalTunnelPoint and OpticalLogicId in
order to keep code style consistently,at the same time
OpticalTunnelPoint implements TunnelPoint
6.add junit test

Change-Id: I371afcef5501e468a43758c5982e7a93b443b114
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java
index 432f4c6..16585de 100644
--- a/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java
@@ -15,11 +15,13 @@
  */
 package org.onosproject.net.tunnel;
 
-import com.google.common.base.MoreObjects;
-
+import static com.google.common.base.Preconditions.checkNotNull;
+import org.onosproject.core.DefaultGroupId;
 import org.onosproject.net.AbstractDescription;
-import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.provider.ProviderId;
+
+import com.google.common.base.MoreObjects;
 
 /**
  * Default implementation of immutable tunnel description entity.
@@ -27,31 +29,46 @@
 public class DefaultTunnelDescription extends AbstractDescription
         implements TunnelDescription {
 
-    private final TunnelId  tunnelId;
-    private final ConnectPoint src;
-    private final ConnectPoint dst;
+    private final TunnelId tunnelId;
+    private final TunnelEndPoint src;
+    private final TunnelEndPoint dst;
     private final Tunnel.Type type;
-    private final boolean isBidirectional;
+    private final DefaultGroupId groupId; // represent for a group flow table
+    // which a tunnel match up
+    // tunnel producer
+    private final ProviderId producerName; // tunnel producer name
+    private final TunnelName tunnelName; // name of a tunnel
 
     /**
      * Creates a tunnel description using the supplied information.
      *
-     * @param id          TunnelId
-     * @param src         ConnectPoint source
-     * @param dst         ConnectPoint destination
-     * @param type        tunnel type
-     * @param isBidirectional        boolean
+     * @param id TunnelId
+     * @param src TunnelPoint source
+     * @param dst TunnelPoint destination
+     * @param type tunnel type
+     * @param groupId groupId
+     * @param producerName tunnel producer
+     * @param tunnelName tunnel name
      * @param annotations optional key/value annotations
      */
-    public DefaultTunnelDescription(TunnelId id, ConnectPoint src, ConnectPoint dst,
-                                  Tunnel.Type type, boolean isBidirectional,
-                                  SparseAnnotations... annotations) {
+    public DefaultTunnelDescription(TunnelId id, TunnelEndPoint src,
+                                    TunnelEndPoint dst, Tunnel.Type type,
+                                    DefaultGroupId groupId,
+                                    ProviderId producerName,
+                                    TunnelName tunnelName,
+                                    SparseAnnotations... annotations) {
         super(annotations);
+        checkNotNull(producerName, "producerName cannot be null");
+        checkNotNull(src, "src cannot be null");
+        checkNotNull(dst, "dst cannot be null");
+        checkNotNull(type, "type cannot be null");
         this.tunnelId = id;
         this.src = src;
         this.dst = dst;
         this.type = type;
-        this.isBidirectional = isBidirectional;
+        this.groupId = groupId;
+        this.producerName = producerName;
+        this.tunnelName = tunnelName;
     }
 
     @Override
@@ -60,12 +77,12 @@
     }
 
     @Override
-    public ConnectPoint src() {
+    public TunnelEndPoint src() {
         return src;
     }
 
     @Override
-    public ConnectPoint dst() {
+    public TunnelEndPoint dst() {
         return dst;
     }
 
@@ -75,8 +92,18 @@
     }
 
     @Override
-    public boolean isBidirectional() {
-        return isBidirectional;
+    public DefaultGroupId groupId() {
+        return groupId;
+    }
+
+    @Override
+    public ProviderId producerName() {
+        return producerName;
+    }
+
+    @Override
+    public TunnelName tunnelName() {
+        return tunnelName;
     }
 
     @Override
@@ -86,7 +113,9 @@
                 .add("src", src())
                 .add("dst", dst())
                 .add("type", type())
-                .add("isBidirectional", isBidirectional())
+                .add("tunnelName", tunnelName())
+                .add("producerName", producerName())
+                .add("groupId", groupId())
                 .toString();
     }