[ONOS-1959][ONOS-2007][ONOS-2008][ONOS-2009][ONOS-2010][ONOS-2011][ONOS-2016][ONOS-2017][ONOS-2018]
1.fix bug in query subscription command in Tunnel management
2.add RemoveTunnelByIdCommand
3.add UpdateTunnelBandWithCommand
4.add QueryAllTunnelsCommand
5.add queryAllTunnels api in TunnelService and TunnelStore
6.store the Path of the tunnel in the store
7.remove to check parameters iif they are null in the construtors of
DefaultTunnel.e.g
8.add the method of querying in SB
9.Fix the bug that the src/dst end point of Vlan-type tunnel is the
instance of OpticalTunnelEndPoint
10. invert the verb-noun into noun-verb for tunnel commands and label
commands

Change-Id: I90378b37c2bc73b58e6f8f234f009d64f07f758e
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java
index b110a0c..1405615 100644
--- a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java
@@ -67,14 +67,12 @@
 
     @Activate
     public void activate(ComponentContext context) {
-        cfgService.registerProperties(getClass());
         service = tunnelProviderRegistry.register(this);
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate(ComponentContext context) {
-        cfgService.unregisterProperties(getClass(), false);
         tunnelProviderRegistry.unregister(this);
         log.info("Stopped");
     }
@@ -130,4 +128,9 @@
         service.tunnelUpdated(tunnel);
     }
 
+    @Override
+    public Tunnel tunnelQueryById(TunnelId tunnelId) {
+        return service.tunnelQueryById(tunnelId);
+    }
+
 }
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java
deleted file mode 100644
index 27721e7..0000000
--- a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2014-2015 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.provider.tunnel.cli;
-
-import java.util.Optional;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onlab.packet.IpAddress;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.incubator.net.tunnel.DefaultOpticalTunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.DefaultTunnelDescription;
-import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.OpticalLogicId;
-import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.Tunnel;
-import org.onosproject.incubator.net.tunnel.TunnelDescription;
-import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
-import org.onosproject.incubator.net.tunnel.TunnelProvider;
-
-/**
- * Supports for removing all tunnels by using IP address and optical as tunnel
- * end point now. It's used by producers.
- */
-@Command(scope = "onos", name = "remove-tunnels", description = "Supports for removing all tunnels by using IP address"
-        + " and optical as tunnel end point now. It's used by producers.")
-public class RemoveTunnelCommand extends AbstractShellCommand {
-    @Argument(index = 0, name = "src", description = "Source tunnel point."
-            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
-            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
-            + " Otherwise src means IP address.", required = true, multiValued = false)
-    String src = null;
-    @Argument(index = 1, name = "dst", description = "Destination tunnel point."
-            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
-            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
-            + " Otherwise dst means IP address.", required = true, multiValued = false)
-    String dst = null;
-
-    @Argument(index = 2, name = "type", description = "The type of tunnels,"
-            + " It includes MPLS, VLAN, VXLAN, GRE, ODUK, OCH", required = true, multiValued = false)
-    String type = null;
-
-    @Override
-    protected void execute() {
-        TunnelProvider service = get(TunnelProvider.class);
-        ProviderId producerName = new ProviderId("default",
-                                                 "org.onosproject.provider.tunnel.default");
-        TunnelEndPoint srcPoint = null;
-        TunnelEndPoint dstPoint = null;
-        Tunnel.Type trueType = null;
-        if ("MPLS".equals(type)) {
-            trueType = Tunnel.Type.MPLS;
-            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
-            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
-        } else if ("VLAN".equals(type)) {
-            trueType = Tunnel.Type.VLAN;
-            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
-            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
-        } else if ("VXLAN".equals(type)) {
-            trueType = Tunnel.Type.VXLAN;
-            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
-            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
-        } else if ("GRE".equals(type)) {
-            trueType = Tunnel.Type.GRE;
-            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
-            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
-        } else if ("ODUK".equals(type)) {
-            trueType = Tunnel.Type.ODUK;
-            String[] srcArray = src.split("-");
-            String[] dstArray = dst.split("-");
-            srcPoint = new DefaultOpticalTunnelEndPoint(
-                                                        producerName,
-                                                        Optional.of(DeviceId
-                                                                .deviceId(srcArray[0])),
-                                                        Optional.of(PortNumber
-                                                                .portNumber(srcArray[1])),
-                                                        null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
-                                                        OpticalLogicId
-                                                                .logicId(0),
-                                                        true);
-            dstPoint = new DefaultOpticalTunnelEndPoint(
-                                                        producerName,
-                                                        Optional.of(DeviceId
-                                                                .deviceId(dstArray[0])),
-                                                        Optional.of(PortNumber
-                                                                .portNumber(dstArray[1])),
-                                                        null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
-                                                        OpticalLogicId
-                                                                .logicId(0),
-                                                        true);
-        } else if ("OCH".equals(type)) {
-            trueType = Tunnel.Type.OCH;
-            String[] srcArray = src.split("-");
-            String[] dstArray = dst.split("-");
-            srcPoint = new DefaultOpticalTunnelEndPoint(
-                                                        producerName,
-                                                        Optional.of(DeviceId
-                                                                .deviceId(srcArray[0])),
-                                                        Optional.of(PortNumber
-                                                                .portNumber(srcArray[1])),
-                                                        null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
-                                                        OpticalLogicId
-                                                                .logicId(0),
-                                                        true);
-            dstPoint = new DefaultOpticalTunnelEndPoint(
-                                                        producerName,
-                                                        Optional.of(DeviceId
-                                                                .deviceId(dstArray[0])),
-                                                        Optional.of(PortNumber
-                                                                .portNumber(dstArray[1])),
-                                                        null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
-                                                        OpticalLogicId
-                                                                .logicId(0),
-                                                        true);
-        } else {
-            print("Illegal tunnel type. Please input MPLS, VLAN, VXLAN, GRE, ODUK or OCH.");
-            return;
-        }
-        TunnelDescription tunnel = new DefaultTunnelDescription(null, srcPoint,
-                                                                dstPoint,
-                                                                trueType, null,
-                                                                producerName,
-                                                                null);
-        service.tunnelRemoved(tunnel);
-    }
-
-}
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelCreateCommand.java
similarity index 76%
rename from providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java
rename to providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelCreateCommand.java
index 495402b..4b595f1 100644
--- a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelCreateCommand.java
@@ -15,20 +15,14 @@
  */
 package org.onosproject.provider.tunnel.cli;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 import java.util.Optional;
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.DefaultGroupId;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.provider.ProviderId;
 import org.onosproject.incubator.net.tunnel.DefaultOpticalTunnelEndPoint;
 import org.onosproject.incubator.net.tunnel.DefaultTunnelDescription;
 import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
@@ -40,40 +34,45 @@
 import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.incubator.net.tunnel.TunnelName;
 import org.onosproject.incubator.net.tunnel.TunnelProvider;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.provider.ProviderId;
 
 /**
  * Supports for creating a tunnel by using IP address and optical as tunnel end
  * point.
  */
-@Command(scope = "onos", name = "create-tunnels",
+@Command(scope = "onos", name = "tunnel-create",
 description = "Supports for creating a tunnel by using IP address and optical as tunnel end point now.")
-public class CreateTunnelCommand extends AbstractShellCommand {
+public class TunnelCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "src", description = "Source tunnel point."
             + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
-            + " If creates a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " If creates a ODUK or OCH or VLAN type tunnel, the formatter of this argument is DeviceId-PortNumber."
             + " Otherwise src means IP address.", required = true, multiValued = false)
     String src = null;
 
     @Argument(index = 1, name = "dst", description = "Destination tunnel point."
             + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
-            + " If creates a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " If creates a ODUK or OCH or VLAN type tunnel, the formatter of this argument is DeviceId-PortNumber."
             + " Otherwise dst means IP address.", required = true, multiValued = false)
     String dst = null;
     @Argument(index = 2, name = "type", description = "The type of tunnels,"
             + " It includes MPLS, VLAN, VXLAN, GRE, ODUK, OCH", required = true, multiValued = false)
     String type = null;
-    @Argument(index = 3, name = "groupId",
-            description = "Group flow table id which a tunnel match up", required = true, multiValued = false)
+    @Option(name = "-g", aliases = "--groupId",
+            description = "Group flow table id which a tunnel match up", required = false, multiValued = false)
     String groupId = null;
 
-    @Argument(index = 4, name = "tunnelName",
+    @Option(name = "-n", aliases = "--tunnelName",
             description = "The name of tunnels", required = false, multiValued = false)
     String tunnelName = null;
 
-    @Argument(index = 5, name = "bandWith",
-            description = "The bandWith attribute of tunnel", required = false, multiValued = false)
-    String bandWith = null;
+    @Option(name = "-b", aliases = "--bandwidth",
+            description = "The bandwidth attribute of tunnel", required = false, multiValued = false)
+    String bandwidth = null;
 
     private static final String FMT = "The tunnel identity is %s";
 
@@ -91,8 +90,30 @@
             dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
         } else if ("VLAN".equals(type)) {
             trueType = Tunnel.Type.VLAN;
-            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
-            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+            String[] srcArray = src.split("-");
+            String[] dstArray = dst.split("-");
+            srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(srcArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(srcArray[1])),
+                                                        null,
+                                                        null,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+            dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(dstArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(dstArray[1])),
+                                                        null,
+                                                        null,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
         } else if ("VXLAN".equals(type)) {
             trueType = Tunnel.Type.VXLAN;
             srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
@@ -103,10 +124,8 @@
             dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
         } else if ("ODUK".equals(type)) {
             trueType = Tunnel.Type.ODUK;
-            String[] srcArray = src.split("||");
-            checkArgument(srcArray.length < 2, "Illegal src formatter.");
-            String[] dstArray = dst.split("||");
-            checkArgument(dstArray.length < 2, "Illegal dst formatter.");
+            String[] srcArray = src.split("-");
+            String[] dstArray = dst.split("-");
             srcPoint = new DefaultOpticalTunnelEndPoint(
                                                         producerName,
                                                         Optional.of(DeviceId
@@ -140,7 +159,7 @@
                                                         Optional.of(PortNumber
                                                                 .portNumber(srcArray[1])),
                                                         null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalTunnelEndPoint.Type.TIMESLOT,
                                                         OpticalLogicId
                                                                 .logicId(0),
                                                         true);
@@ -151,7 +170,7 @@
                                                         Optional.of(PortNumber
                                                                 .portNumber(dstArray[1])),
                                                         null,
-                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalTunnelEndPoint.Type.TIMESLOT,
                                                         OpticalLogicId
                                                                 .logicId(0),
                                                         true);
@@ -162,7 +181,7 @@
 
         SparseAnnotations annotations = DefaultAnnotations
                 .builder()
-                .set("bandWith", bandWith == null && "".equals(bandWith) ? "0" : bandWith)
+                .set("bandwidth", bandwidth == null && "".equals(bandwidth) ? "0" : bandwidth)
                 .build();
         TunnelDescription tunnel = new DefaultTunnelDescription(
                                                                 null,
@@ -175,6 +194,7 @@
                                                                 producerName,
                                                                 TunnelName
                                                                         .tunnelName(tunnelName),
+                                                                        null,
                                                                 annotations);
         TunnelId tunnelId = service.tunnelAdded(tunnel);
         print(FMT, tunnelId.id());
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelRemoveCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelRemoveCommand.java
new file mode 100644
index 0000000..fb680ef
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelRemoveCommand.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2014-2015 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.provider.tunnel.cli;
+
+import java.util.Optional;
+
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.tunnel.DefaultOpticalTunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.DefaultTunnelDescription;
+import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.OpticalLogicId;
+import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.Tunnel;
+import org.onosproject.incubator.net.tunnel.TunnelDescription;
+import org.onosproject.incubator.net.tunnel.TunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+import org.onosproject.incubator.net.tunnel.TunnelProvider;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.provider.ProviderId;
+
+/**
+ * Supports for removing tunnels. It's used by producers.
+ */
+@Command(scope = "onos", name = "tunnel-remove", description = "Supports for removing tunnels. It's used by producers.")
+public class TunnelRemoveCommand extends AbstractShellCommand {
+    @Option(name = "-s", aliases = "--src", description = "Source tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise src means IP address.", required = false, multiValued = false)
+    String src = null;
+    @Option(name = "-d", aliases = "--dst", description = "Destination tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise dst means IP address.", required = false, multiValued = false)
+    String dst = null;
+
+    @Option(name = "-t", aliases = "--type", description = "The type of tunnels,"
+            + " It includes MPLS, VLAN, VXLAN, GRE, ODUK, OCH", required = false, multiValued = false)
+    String type = null;
+
+    @Option(name = "-i", aliases = "--tunnelId",
+            description = "the tunnel identity.", required = false, multiValued = false)
+    String tunnelId = null;
+
+    @Override
+    protected void execute() {
+        TunnelDescription tunnel = null;
+        TunnelProvider service = get(TunnelProvider.class);
+        ProviderId producerName = new ProviderId("default",
+                                                 "org.onosproject.provider.tunnel.default");
+        if (!isNull(src) && !isNull(dst) && !isNull(type)) {
+            TunnelEndPoint srcPoint = null;
+            TunnelEndPoint dstPoint = null;
+            Tunnel.Type trueType = null;
+            if ("MPLS".equals(type)) {
+                trueType = Tunnel.Type.MPLS;
+                srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(src));
+                dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(dst));
+            } else if ("VLAN".equals(type)) {
+                trueType = Tunnel.Type.VLAN;
+                srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(src));
+                dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(dst));
+            } else if ("VXLAN".equals(type)) {
+                trueType = Tunnel.Type.VXLAN;
+                srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(src));
+                dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(dst));
+            } else if ("GRE".equals(type)) {
+                trueType = Tunnel.Type.GRE;
+                srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(src));
+                dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                        .valueOf(dst));
+            } else if ("ODUK".equals(type)) {
+                trueType = Tunnel.Type.ODUK;
+                String[] srcArray = src.split("-");
+                String[] dstArray = dst.split("-");
+                srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                            producerName,
+                                                            Optional.of(DeviceId
+                                                                    .deviceId(srcArray[0])),
+                                                            Optional.of(PortNumber
+                                                                    .portNumber(srcArray[1])),
+                                                            null,
+                                                            OpticalTunnelEndPoint.Type.LAMBDA,
+                                                            OpticalLogicId
+                                                                    .logicId(0),
+                                                            true);
+                dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                            producerName,
+                                                            Optional.of(DeviceId
+                                                                    .deviceId(dstArray[0])),
+                                                            Optional.of(PortNumber
+                                                                    .portNumber(dstArray[1])),
+                                                            null,
+                                                            OpticalTunnelEndPoint.Type.LAMBDA,
+                                                            OpticalLogicId
+                                                                    .logicId(0),
+                                                            true);
+            } else if ("OCH".equals(type)) {
+                trueType = Tunnel.Type.OCH;
+                String[] srcArray = src.split("-");
+                String[] dstArray = dst.split("-");
+                srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                            producerName,
+                                                            Optional.of(DeviceId
+                                                                    .deviceId(srcArray[0])),
+                                                            Optional.of(PortNumber
+                                                                    .portNumber(srcArray[1])),
+                                                            null,
+                                                            OpticalTunnelEndPoint.Type.LAMBDA,
+                                                            OpticalLogicId
+                                                                    .logicId(0),
+                                                            true);
+                dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                            producerName,
+                                                            Optional.of(DeviceId
+                                                                    .deviceId(dstArray[0])),
+                                                            Optional.of(PortNumber
+                                                                    .portNumber(dstArray[1])),
+                                                            null,
+                                                            OpticalTunnelEndPoint.Type.LAMBDA,
+                                                            OpticalLogicId
+                                                                    .logicId(0),
+                                                            true);
+            } else {
+                print("Illegal tunnel type. Please input MPLS, VLAN, VXLAN, GRE, ODUK or OCH.");
+                return;
+            }
+
+            tunnel = new DefaultTunnelDescription(null, srcPoint, dstPoint,
+                                                  trueType, null, producerName,
+                                                  null, null);
+            service.tunnelRemoved(tunnel);
+        }
+        if (!isNull(tunnelId)) {
+            TunnelId id = TunnelId.valueOf(tunnelId);
+            tunnel = new DefaultTunnelDescription(id, null, null, null, null,
+                                                  producerName, null, null);
+            service.tunnelRemoved(tunnel);
+        }
+    }
+
+    private boolean isNull(String s) {
+        return s == null || "".equals(s);
+    }
+}
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelUpdateCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelUpdateCommand.java
new file mode 100644
index 0000000..9cd3ddb
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/TunnelUpdateCommand.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2014-2015 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.provider.tunnel.cli;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.tunnel.DefaultTunnelDescription;
+import org.onosproject.incubator.net.tunnel.TunnelDescription;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+import org.onosproject.incubator.net.tunnel.TunnelProvider;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Supports for updating a tunnel by tunnel identity.
+ * It's used by producers.
+ */
+@Command(scope = "onos", name = "tunnel-update",
+description = "Supports for updating a tunnel by tunnel identity."
+        + " It's used by producers.")
+public class TunnelUpdateCommand extends AbstractShellCommand {
+    @Argument(index = 0, name = "tunnelId", description = "the tunnel identity.",
+            required = true, multiValued = false)
+    String tunnelId = null;
+
+    @Option(name = "-b", aliases = "--bandwidth",
+            description = "The bandwidth attribute of tunnel", required = false, multiValued = false)
+    String bandwidth = null;
+
+    @Override
+    protected void execute() {
+        TunnelProvider service = get(TunnelProvider.class);
+        TunnelId id = TunnelId.valueOf(tunnelId);
+        SparseAnnotations annotations = DefaultAnnotations
+                .builder()
+                .set("bandwidth", bandwidth)
+                .build();
+        TunnelDescription tunnel = new DefaultTunnelDescription(id, null,
+                                                                null,
+                                                                null, null,
+                                                                null,
+                                                                null, null, annotations);
+        service.tunnelUpdated(tunnel);
+    }
+
+}