[ONOS-7863] Initial support GENEVE tunnel at SONA

Change-Id: Ia85d32e8068c22d59082dceccc0d911f8acb5f02
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index bc02119..d1864d7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -96,7 +96,10 @@
 import static org.onosproject.openstacknetworking.api.Constants.STAT_OUTBOUND_TABLE;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.FLAT;
+import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.GENEVE;
+import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.GRE;
 import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.VLAN;
+import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.VXLAN;
 import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT;
 import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT_DEFAULT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.tunnelPortNumByNetType;
@@ -460,21 +463,25 @@
 
         // take ICMP request to a subnet gateway through gateway node group
         Network net = osNetworkAdminService.network(osSubnet.getNetworkId());
+        Type netType = osNetworkAdminService.networkType(osSubnet.getNetworkId());
         Set<Subnet> routableSubnets = routableSubnets(osRouter, osSubnet.getId());
 
-        switch (net.getNetworkType()) {
+        switch (netType) {
             case VXLAN:
                 setGatewayIcmpForVxlan(osSubnet, srcNatGw, net, routableSubnets, install);
                 break;
             case GRE:
                 setGatewayIcmpForGre(osSubnet, srcNatGw, net, routableSubnets, install);
                 break;
+            case GENEVE:
+                setGatewayIcmpForGeneve(osSubnet, srcNatGw, net, routableSubnets, install);
+                break;
             case VLAN:
                 setGatewayIcmpForVlan(osSubnet, srcNatGw, net, routableSubnets, install);
                 break;
             default:
                 final String error = String.format("%s %s", ERR_UNSUPPORTED_NET_TYPE,
-                                                            net.getNetworkType().toString());
+                                                            netType.toString());
                 throw new IllegalStateException(error);
         }
 
@@ -502,7 +509,7 @@
                         network.getProviderSegID(),
                         osSubnet,
                         routableSubnets,
-                        Type.VXLAN,
+                        VXLAN,
                         install));
     }
 
@@ -519,7 +526,24 @@
                         network.getProviderSegID(),
                         osSubnet,
                         routableSubnets,
-                        Type.GRE,
+                        GRE,
+                        install));
+    }
+
+    private void setGatewayIcmpForGeneve(Subnet osSubnet,
+                                         OpenstackNode srcNatGw,
+                                         Network network,
+                                         Set<Subnet> routableSubnets,
+                                         boolean install) {
+        osNodeService.completeNodes(COMPUTE).stream()
+                .filter(cNode -> cNode.dataIp() != null)
+                .forEach(cNode -> setRulesToGatewayWithRoutableSubnets(
+                        cNode,
+                        srcNatGw,
+                        network.getProviderSegID(),
+                        osSubnet,
+                        routableSubnets,
+                        GENEVE,
                         install));
     }
 
@@ -629,6 +653,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 setInternalRouterRulesForTunnel(deviceId, srcSegId, dstSegId,
                                                 srcSubnet, dstSubnet, install);
                 break;
@@ -766,6 +791,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 sBuilder.matchTunnelId(Long.parseLong(segmentId));
                 break;
             case VLAN:
@@ -783,6 +809,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 PortNumber portNum = tunnelPortNumByNetType(networkType, osNode);
                 tBuilder.extension(buildExtension(
                                 deviceService,
@@ -883,6 +910,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 sBuilder.matchTunnelId(Long.parseLong(segmentId));
 
                 PortNumber portNum = tunnelPortNumByNetType(networkType, osNode);
@@ -994,6 +1022,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 sBuilder.matchTunnelId(Long.parseLong(segmentId));
                 break;
             case VLAN:
@@ -1034,6 +1063,7 @@
         switch (networkType) {
             case VXLAN:
             case GRE:
+            case GENEVE:
                 sBuilder.matchTunnelId(Long.parseLong(segmentId));
                 break;
             case VLAN: