Support STT tunneling protocol at kubevirt networking app

Change-Id: Icbef76dbfb842ce1cf6893bf18ee80c4b1b26006
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
index 3408ed1..00aa0bf 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
@@ -82,6 +82,7 @@
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_PHYSICAL_PREFIX;
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_TUNNEL;
 import static org.onosproject.kubevirtnode.api.Constants.PHYSICAL_TO_INTEGRATION_SUFFIX;
+import static org.onosproject.kubevirtnode.api.Constants.STT;
 import static org.onosproject.kubevirtnode.api.Constants.TENANT_BRIDGE_PREFIX;
 import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_BRIDGE;
 import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_TO_INTEGRATION;
@@ -244,6 +245,10 @@
             if (node.dataIp() != null && !isIntfEnabled(node, GENEVE)) {
                 createGeneveTunnelInterface(node);
             }
+
+            if (node.dataIp() != null && !isIntfEnabled(node, STT)) {
+                createSttTunnelInterface(node);
+            }
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e);
         }
@@ -362,6 +367,10 @@
         createTunnelInterface(node, GENEVE, GENEVE);
     }
 
+    private void createSttTunnelInterface(KubevirtNode node) {
+        createTunnelInterface(node, STT, STT);
+    }
+
     /**
      * Creates a tunnel interface in a given kubernetes node.
      *
@@ -396,7 +405,7 @@
      */
     private TunnelDescription buildTunnelDesc(String type, String intfName) {
         TunnelKey<String> key = new TunnelKey<>(FLOW_KEY);
-        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type)) {
+        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type) || STT.equals(type)) {
             TunnelDescription.Builder tdBuilder =
                     DefaultTunnelDescription.builder()
                             .deviceId(TUNNEL_BRIDGE)
@@ -414,6 +423,9 @@
                 case GENEVE:
                     tdBuilder.type(TunnelDescription.Type.GENEVE);
                     break;
+                case STT:
+                    tdBuilder.type(TunnelDescription.Type.STT);
+                    break;
                 default:
                     return null;
             }
@@ -557,6 +569,8 @@
             return false;
         }
 
+        // we make the STT tunnel port check optional
+
         for (KubevirtPhyInterface phyIntf : node.phyIntfs()) {
             if (phyIntf == null) {
                 log.warn("Physnet interface is invalid");
@@ -963,7 +977,8 @@
             if (node.state() == DEVICE_CREATED && (
                     Objects.equals(portName, VXLAN) ||
                             Objects.equals(portName, GRE) ||
-                            Objects.equals(portName, GENEVE))) {
+                            Objects.equals(portName, GENEVE) ||
+                            Objects.equals(portName, STT))) {
                 log.info("Interface {} added or updated to {}",
                         portName, device.id());
                 bootstrapNode(node);
@@ -985,7 +1000,8 @@
             if (node.state() == COMPLETE && (
                     Objects.equals(portName, VXLAN) ||
                             Objects.equals(portName, GRE) ||
-                            Objects.equals(portName, GENEVE))) {
+                            Objects.equals(portName, GENEVE) ||
+                            Objects.equals(portName, STT))) {
                 log.warn("Interface {} removed from {}", portName, device.id());
                 setState(node, INCOMPLETE);
             }