Refactored tunnel and interface config behavior

- Added tunnel interface configuratoin to interfaceConfig and
  deprecated tunnelConfig
- OVSDB client service provides interface create/remove APIs instead
  of tunnel interface create/remove, and this APIs can be used to
  create/remove various types of interfaces like tunnel, patch, tap and so on
- Use tunnel description when create tunnel interface so that we can extend
  more config options later
- Some cleaup OVSDB client

Change-Id: I4653595504a27b18384a92ebe4b31ce9d99237cd
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
index c011fc3..a645ec5 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/OpenstackNodeManager.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.openstacknode;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -30,19 +28,18 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Port;
 import org.onosproject.net.behaviour.BridgeConfig;
 import org.onosproject.net.behaviour.BridgeDescription;
-import org.onosproject.net.behaviour.BridgeName;
 import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
 import org.onosproject.net.behaviour.DefaultTunnelDescription;
-import org.onosproject.net.behaviour.TunnelConfig;
+import org.onosproject.net.behaviour.InterfaceConfig;
 import org.onosproject.net.behaviour.TunnelDescription;
-import org.onosproject.net.behaviour.TunnelName;
+import org.onosproject.net.behaviour.TunnelEndPoints;
+import org.onosproject.net.behaviour.TunnelKeys;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
@@ -72,7 +69,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
@@ -97,9 +93,6 @@
     private static final String OPENSTACK_NODESTORE = "openstacknode-nodestore";
     private static final String OPENSTACK_NODEMANAGER_ID = "org.onosproject.openstacknode";
 
-    private static final Map<String, String> DEFAULT_TUNNEL_OPTIONS
-            = ImmutableMap.of("key", "flow", "remote_ip", "flow");
-
     private static final int DPID_BEGIN = 3;
     private static final int OFPORT = 6653;
 
@@ -390,26 +383,22 @@
             return;
         }
 
-        List<ControllerInfo> controllers = new ArrayList<>();
-        Sets.newHashSet(clusterService.getNodes()).stream()
-                .forEach(controller -> {
-                    ControllerInfo ctrlInfo = new ControllerInfo(controller.ip(), OFPORT, "tcp");
-                    controllers.add(ctrlInfo);
-                });
+        List<ControllerInfo> controllers = clusterService.getNodes().stream()
+                .map(controller -> new ControllerInfo(controller.ip(), OFPORT, "tcp"))
+                .collect(Collectors.toList());
         String dpid = node.intBrId().toString().substring(DPID_BEGIN);
 
+        BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
+                .name(DEFAULT_BRIDGE)
+                .failMode(BridgeDescription.FailMode.SECURE)
+                .datapathId(dpid)
+                .disableInBand()
+                .controllers(controllers)
+                .build();
+
         try {
             DriverHandler handler = driverService.createHandler(node.ovsdbId());
             BridgeConfig bridgeConfig =  handler.behaviour(BridgeConfig.class);
-
-            BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
-                    .name(DEFAULT_BRIDGE)
-                    .failMode(BridgeDescription.FailMode.SECURE)
-                    .datapathId(dpid)
-                    .disableInBand()
-                    .controllers(controllers)
-                    .build();
-
             bridgeConfig.addBridge(bridgeDesc);
         } catch (ItemNotFoundException e) {
             log.warn("Failed to create integration bridge on {}", node.ovsdbId());
@@ -426,17 +415,17 @@
             return;
         }
 
-        DefaultAnnotations.Builder optionBuilder = DefaultAnnotations.builder();
-        for (String key : DEFAULT_TUNNEL_OPTIONS.keySet()) {
-            optionBuilder.set(key, DEFAULT_TUNNEL_OPTIONS.get(key));
-        }
-        TunnelDescription description =
-                new DefaultTunnelDescription(null, null, VXLAN, TunnelName.tunnelName(DEFAULT_TUNNEL),
-                        optionBuilder.build());
+        TunnelDescription description = DefaultTunnelDescription.builder()
+                .deviceId(DEFAULT_BRIDGE)
+                .ifaceName(DEFAULT_TUNNEL)
+                .type(VXLAN)
+                .remote(TunnelEndPoints.flowTunnelEndpoint())
+                .key(TunnelKeys.flowTunnelKey())
+                .build();
         try {
             DriverHandler handler = driverService.createHandler(node.ovsdbId());
-            TunnelConfig tunnelConfig =  handler.behaviour(TunnelConfig.class);
-            tunnelConfig.createTunnelInterface(BridgeName.bridgeName(DEFAULT_BRIDGE), description);
+            InterfaceConfig ifaceConfig =  handler.behaviour(InterfaceConfig.class);
+            ifaceConfig.addTunnelMode(DEFAULT_TUNNEL, description);
         } catch (ItemNotFoundException e) {
             log.warn("Failed to create tunnel interface on {}", node.ovsdbId());
         }
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
index 2b794dc..f2971bf 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
@@ -487,7 +487,7 @@
     private void programTunnelConfig(DeviceId localDeviceId, IpAddress localIp,
                                      DriverHandler localHandler) {
         if (mastershipService.isLocalMaster(localDeviceId)) {
-            VtnConfig.applyTunnelConfig(localHandler, localIp, IpAddress.valueOf(DEFAULT_IP));
+            VtnConfig.applyTunnelConfig(localHandler, localIp);
             log.info("Add tunnel on {}", localIp);
         }
     }
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
index e4b0767..9796e14 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/util/VtnConfig.java
@@ -27,11 +27,10 @@
 import org.onosproject.net.behaviour.BridgeName;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
 import org.onosproject.net.behaviour.DefaultTunnelDescription;
-import org.onosproject.net.behaviour.IpTunnelEndPoint;
-import org.onosproject.net.behaviour.TunnelConfig;
+import org.onosproject.net.behaviour.InterfaceConfig;
 import org.onosproject.net.behaviour.TunnelDescription;
-import org.onosproject.net.behaviour.TunnelEndPoint;
-import org.onosproject.net.behaviour.TunnelName;
+import org.onosproject.net.behaviour.TunnelEndPoints;
+import org.onosproject.net.behaviour.TunnelKeys;
 import org.onosproject.net.driver.DriverHandler;
 
 /**
@@ -95,43 +94,34 @@
      *
      * @param handler DriverHandler
      * @param srcIp the ipAddress of the local controller device
-     * @param dstIp the ipAddress of the remote controller device
      */
-    public static void applyTunnelConfig(DriverHandler handler, IpAddress srcIp,
-                                  IpAddress dstIp) {
+    public static void applyTunnelConfig(DriverHandler handler, IpAddress srcIp) {
         DefaultAnnotations.Builder optionBuilder = DefaultAnnotations.builder();
         for (String key : DEFAULT_TUNNEL_OPTIONS.keySet()) {
             optionBuilder.set(key, DEFAULT_TUNNEL_OPTIONS.get(key));
         }
-        TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
-        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp);
-        TunnelDescription tunnel = new DefaultTunnelDescription(
-                                                                tunnelAsSrc,
-                                                                null,
-                                                                TunnelDescription.Type.VXLAN,
-                                                                TunnelName.tunnelName(DEFAULT_TUNNEL),
-                                                                optionBuilder.build());
-        tunnelConfig.createTunnelInterface(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), tunnel);
+
+        InterfaceConfig interfaceConfig = handler.behaviour(InterfaceConfig.class);
+        TunnelDescription tunnel = DefaultTunnelDescription.builder()
+                .deviceId(DEFAULT_BRIDGE_NAME)
+                .ifaceName(DEFAULT_TUNNEL)
+                .type(TunnelDescription.Type.VXLAN)
+                .local(TunnelEndPoints.ipTunnelEndpoint(srcIp))
+                .remote(TunnelEndPoints.flowTunnelEndpoint())
+                .key(TunnelKeys.flowTunnelKey())
+                .otherConfigs(optionBuilder.build())
+                .build();
+        interfaceConfig.addTunnelMode(DEFAULT_TUNNEL, tunnel);
     }
 
     /**
      * Creates or update tunnel in the controller device.
      *
      * @param handler DriverHandler
-     * @param srcIp the ipAddress of the local controller device
-     * @param dstIp the ipAddress of the remote controller device
      */
-    public static void removeTunnelConfig(DriverHandler handler, IpAddress srcIp,
-                                   IpAddress dstIp) {
-        TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
-        TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp);
-        TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dstIp);
-        TunnelDescription tunnel = new DefaultTunnelDescription(
-                                                                tunnelAsSrc,
-                                                                tunnelAsDst,
-                                                                TunnelDescription.Type.VXLAN,
-                                                                null);
-        tunnelConfig.removeTunnel(tunnel);
+    public static void removeTunnelConfig(DriverHandler handler) {
+        InterfaceConfig interfaceConfig = handler.behaviour(InterfaceConfig.class);
+        interfaceConfig.removeTunnelMode(DEFAULT_TUNNEL);
     }
 
     /**