Tunnel Service  extenstion to support to create tunnel from APP and also to carry Label stack as network resource

Change-Id: Ie69fd2d824bd40a14012406be3eea5b1449b5cf2
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultLabelStack.java b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultLabelStack.java
new file mode 100644
index 0000000..71de4b7
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultLabelStack.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.incubator.net.tunnel;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Default implementation of label stack.
+ */
+public class DefaultLabelStack implements LabelStack {
+
+    private final List<LabelResourceId> labelResources;
+
+    /**
+     * Creates label stack.
+     *
+     * @param labelResources contiguous label ids that comprise the path
+     */
+    public DefaultLabelStack(List<LabelResourceId> labelResources) {
+        this.labelResources = ImmutableList.copyOf(labelResources);
+    }
+
+    @Override
+    public List<LabelResourceId> labelResources() {
+        return labelResources;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("labelResources", labelResources)
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return labelResources.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultLabelStack) {
+            final DefaultLabelStack other = (DefaultLabelStack) obj;
+            return Objects.equals(this.labelResources, other.labelResources);
+        }
+        return false;
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnel.java b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnel.java
index 122474f..c533cf9 100755
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnel.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnel.java
@@ -45,6 +45,7 @@
                                      // ONOS as primary key
     private final TunnelName tunnelName; // name of a tunnel
     private final Path path;
+    private final NetworkResource networkRes; // network resource to carry label stack
 
     /**
      * Creates an active infrastructure tunnel using the supplied information.
@@ -94,6 +95,61 @@
         this.tunnelId = tunnelId;
         this.tunnelName = tunnelName;
         this.path = path;
+        this.networkRes = null;
+    }
+
+    /**
+     * Creates an active infrastructure tunnel using the supplied information.
+     *
+     * @param producerName provider identity
+     * @param src tunnel source
+     * @param dst tunnel destination
+     * @param type tunnel type
+     * @param groupId groupId
+     * @param tunnelId tunnelId
+     * @param tunnelName tunnel name
+     * @param path the path of tunnel
+     * @param networkRes network resource of tunnel
+     * @param annotations optional key/value annotations
+     */
+    public DefaultTunnel(ProviderId producerName, TunnelEndPoint src,
+                         TunnelEndPoint dst, Type type, DefaultGroupId groupId,
+                         TunnelId tunnelId, TunnelName tunnelName, Path path,
+                         NetworkResource networkRes, Annotations... annotations) {
+        this(producerName, src, dst, type, Tunnel.State.ACTIVE, groupId,
+                tunnelId, tunnelName, path, networkRes, annotations);
+    }
+
+    /**
+     * Creates an tunnel using the supplied information.
+     *
+     * @param producerName provider identity
+     * @param src tunnel source
+     * @param dst tunnel destination
+     * @param type tunnel type
+     * @param state tunnel state
+     * @param groupId groupId
+     * @param tunnelId tunnelId
+     * @param tunnelName tunnel name
+     * @param path the path of tunnel
+     * @param networkRes network resource of tunnel
+     * @param annotations optional key/value annotations
+     */
+    public DefaultTunnel(ProviderId producerName, TunnelEndPoint src,
+                         TunnelEndPoint dst, Type type, State state,
+                         DefaultGroupId groupId, TunnelId tunnelId,
+                         TunnelName tunnelName, Path path, NetworkResource networkRes,
+                         Annotations... annotations) {
+        super(producerName, annotations);
+        this.src = src;
+        this.dst = dst;
+        this.type = type;
+        this.state = state;
+        this.groupId = groupId;
+        this.tunnelId = tunnelId;
+        this.tunnelName = tunnelName;
+        this.path = path;
+        this.networkRes = networkRes;
     }
 
     @Override
@@ -118,7 +174,7 @@
 
     @Override
     public NetworkResource resource() {
-        return null;
+        return networkRes;
     }
 
     @Override
@@ -145,7 +201,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(src, dst, type, groupId, tunnelId, tunnelName,
-                            state, path);
+                            state, path, networkRes);
     }
 
     @Override
@@ -162,7 +218,8 @@
                     && Objects.equals(this.tunnelId, other.tunnelId)
                     && Objects.equals(this.tunnelName, other.tunnelName)
                     && Objects.equals(this.state, other.state)
-                    && Objects.equals(this.path, other.path);
+                    && Objects.equals(this.path, other.path)
+                    && Objects.equals(this.networkRes, other.networkRes);
         }
         return false;
     }
@@ -173,6 +230,7 @@
                 .add("type", type).add("state", state).add("groupId", groupId)
                 .add("producerTunnelId", tunnelId)
                 .add("tunnelName", tunnelName)
-                .add("path", path).toString();
+                .add("path", path)
+                .add("networkResource", networkRes).toString();
     }
 }
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnelDescription.java b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnelDescription.java
index 077c0d9..62f7646 100755
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnelDescription.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/DefaultTunnelDescription.java
@@ -18,6 +18,7 @@
 import com.google.common.annotations.Beta;
 import org.onosproject.core.DefaultGroupId;
 import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.NetworkResource;
 import org.onosproject.net.Path;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.provider.ProviderId;
@@ -41,6 +42,7 @@
     private final ProviderId producerName; // tunnel producer name
     private final TunnelName tunnelName; // name of a tunnel
     private final Path path;
+    private final NetworkResource networkRes;
 
     /**
      * Creates a tunnel description using the supplied information.
@@ -71,6 +73,41 @@
         this.producerName = producerName;
         this.tunnelName = tunnelName;
         this.path = path;
+        this.networkRes = null;
+    }
+
+    /**
+     * Creates a tunnel description using the supplied information.
+     *
+     * @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 path the path of tunnel
+     * @param networkRes network resource of tunnel
+     * @param annotations optional key/value annotations
+     */
+    public DefaultTunnelDescription(TunnelId id, TunnelEndPoint src,
+                                    TunnelEndPoint dst, Tunnel.Type type,
+                                    DefaultGroupId groupId,
+                                    ProviderId producerName,
+                                    TunnelName tunnelName,
+                                    Path path,
+                                    NetworkResource networkRes,
+                                    SparseAnnotations... annotations) {
+        super(annotations);
+        this.tunnelId = id;
+        this.src = src;
+        this.dst = dst;
+        this.type = type;
+        this.groupId = groupId;
+        this.producerName = producerName;
+        this.tunnelName = tunnelName;
+        this.path = path;
+        this.networkRes = networkRes;
     }
 
     @Override
@@ -115,6 +152,11 @@
     }
 
     @Override
+    public NetworkResource resource() {
+        return networkRes;
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("tunnelId", id())
@@ -125,6 +167,7 @@
                 .add("producerName", producerName())
                 .add("groupId", groupId())
                 .add("path", path)
+                .add("resource", networkRes)
                 .toString();
     }
 }
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/LabelStack.java b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/LabelStack.java
new file mode 100644
index 0000000..a529cce
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/LabelStack.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.incubator.net.tunnel;
+
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.net.NetworkResource;
+
+import java.util.List;
+
+/**
+ * Representation of a label stack in a network which represents the network path.
+ */
+public interface LabelStack extends NetworkResource {
+
+    /**
+     * Returns sequence of label resources comprising the path.
+     *
+     * @return list of links
+     */
+    List<LabelResourceId> labelResources();
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/TunnelDescription.java b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/TunnelDescription.java
index 044533d..fd73846 100755
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/TunnelDescription.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/tunnel/TunnelDescription.java
@@ -20,6 +20,7 @@
 import org.onosproject.incubator.net.tunnel.Tunnel.Type;
 import org.onosproject.net.Annotated;
 import org.onosproject.net.Description;
+import org.onosproject.net.NetworkResource;
 import org.onosproject.net.Path;
 import org.onosproject.net.provider.ProviderId;
 
@@ -84,4 +85,11 @@
      * @return the path of the tunnel
      */
     Path path();
+
+    /**
+     * Returns the network resource backing the tunnel, e.g. lambda, VLAN id, MPLS tag, label stack.
+     *
+     * @return backing resource
+     */
+    NetworkResource resource();
 }