[ONOS-7863] Initial support GENEVE tunnel at SONA

Change-Id: Ia85d32e8068c22d59082dceccc0d911f8acb5f02
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 1b93499..c2c3d57 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -79,6 +79,8 @@
 import static org.onlab.packet.TpPort.tpPort;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.onosproject.openstacknode.api.Constants.GENEVE;
+import static org.onosproject.openstacknode.api.Constants.GENEVE_TUNNEL;
 import static org.onosproject.openstacknode.api.Constants.GRE;
 import static org.onosproject.openstacknode.api.Constants.GRE_TUNNEL;
 import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
@@ -235,6 +237,11 @@
                 createGreTunnelInterface(osNode);
             }
 
+            if (osNode.dataIp() != null &&
+                    !isIntfEnabled(osNode, GENEVE_TUNNEL)) {
+                createGeneveTunnelInterface(osNode);
+            }
+
             if (osNode.dpdkConfig() != null && osNode.dpdkConfig().dpdkIntfs() != null) {
                 osNode.dpdkConfig().dpdkIntfs().stream()
                         .filter(dpdkintf -> dpdkintf.deviceName().equals(TUNNEL_BRIDGE))
@@ -260,7 +267,7 @@
                             osNode.vlanIntf(), deviceService, true);
             }
         } catch (Exception e) {
-            log.error("Exception occurred because of {}", e.toString());
+            log.error("Exception occurred because of {}", e);
         }
     }
 
@@ -365,6 +372,15 @@
     }
 
     /**
+     * Creates a GENEVE tunnel interface in a given openstack node.
+     *
+     * @param osNode openstack node
+     */
+    private void createGeneveTunnelInterface(OpenstackNode osNode) {
+        createTunnelInterface(osNode, GENEVE, GENEVE_TUNNEL);
+    }
+
+    /**
      * Creates a tunnel interface in a given openstack node.
      *
      * @param osNode openstack node
@@ -394,7 +410,7 @@
      * @return tunnel description
      */
     private TunnelDescription buildTunnelDesc(String type, String intfName) {
-        if (VXLAN.equals(type) || GRE.equals(type)) {
+        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type)) {
             TunnelDescription.Builder tdBuilder =
                     DefaultTunnelDescription.builder()
                     .deviceId(INTEGRATION_BRIDGE)
@@ -409,6 +425,9 @@
                 case GRE:
                     tdBuilder.type(TunnelDescription.Type.GRE);
                     break;
+                case GENEVE:
+                    tdBuilder.type(TunnelDescription.Type.GENEVE);
+                    break;
                 default:
                     return null;
             }
@@ -462,6 +481,10 @@
                         !isIntfEnabled(osNode, GRE_TUNNEL)) {
                     return false;
                 }
+                if (osNode.dataIp() != null &&
+                        !isIntfEnabled(osNode, GENEVE_TUNNEL)) {
+                    return false;
+                }
                 if (osNode.vlanIntf() != null &&
                         !isIntfEnabled(osNode, osNode.vlanIntf())) {
                     return false;
@@ -819,6 +842,7 @@
                         if (osNode.state() == DEVICE_CREATED && (
                                 Objects.equals(portName, VXLAN_TUNNEL) ||
                                 Objects.equals(portName, GRE_TUNNEL) ||
+                                Objects.equals(portName, GENEVE_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
                                 Objects.equals(portName, osNode.uplinkPort()) ||
                                         containsPhyIntf(osNode, portName)) ||
@@ -847,6 +871,7 @@
                         if (osNode.state() == COMPLETE && (
                                 Objects.equals(portName, VXLAN_TUNNEL) ||
                                 Objects.equals(portName, GRE_TUNNEL) ||
+                                Objects.equals(portName, GENEVE_TUNNEL) ||
                                 Objects.equals(portName, osNode.vlanIntf()) ||
                                 Objects.equals(portName, osNode.uplinkPort()) ||
                                         containsPhyIntf(osNode, portName)) ||