Add the logic of generating ovs bridges on bootstrap kubevirt node

Change-Id: Id691738ee31b509a143143103152111dfb47a606
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
index 09451dd..f4ffd0b 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
@@ -32,5 +32,17 @@
     public static final String GRE = "gre";
     public static final String GENEVE = "geneve";
 
+    public static final String INTEGRATION_BRIDGE = "br-int";
+    public static final String TUNNEL_BRIDGE = "br-tun";
+
+    public static final String INTEGRATION_TO_TUNNEL = "int-to-tun";
+    public static final String TUNNEL_TO_INTEGRATION = "tun-to-int";
+
+    public static final String BRIDGE_PREFIX = "br-";
+    public static final String INTEGRATION_TO_PHYSICAL_PREFIX = "int-to-";
+    public static final String PHYSICAL_TO_INTEGRATION_SUFFIX = "-to-int";
+
+    public static final String FLOW_KEY = "flow";
+
     public static final String DEFAULT_CLUSTER_NAME = "default";
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
index 3815ff3..246d6c4 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -39,6 +39,7 @@
     private final String hostname;
     private final Type type;
     private final DeviceId intgBridge;
+    private final DeviceId tunBridge;
     private final IpAddress managementIp;
     private final IpAddress dataIp;
     private final KubevirtNodeState state;
@@ -51,19 +52,22 @@
      * @param hostname          hostname
      * @param type              node type
      * @param intgBridge        integration bridge
+     * @param tunBridge         tunnel bridge
      * @param managementIp      management IP address
      * @param dataIp            data IP address
      * @param state             node state
      * @param phyIntfs          physical interfaces
      */
     protected DefaultKubevirtNode(String clusterName, String hostname, Type type,
-                                  DeviceId intgBridge, IpAddress managementIp,
-                                  IpAddress dataIp, KubevirtNodeState state,
+                                  DeviceId intgBridge, DeviceId tunBridge,
+                                  IpAddress managementIp, IpAddress dataIp,
+                                  KubevirtNodeState state,
                                   Collection<KubevirtPhyInterface> phyIntfs) {
         this.clusterName = clusterName;
         this.hostname = hostname;
         this.type = type;
         this.intgBridge = intgBridge;
+        this.tunBridge = tunBridge;
         this.managementIp = managementIp;
         this.dataIp = dataIp;
         this.state = state;
@@ -96,6 +100,11 @@
     }
 
     @Override
+    public DeviceId tunBridge() {
+        return tunBridge;
+    }
+
+    @Override
     public IpAddress managementIp() {
         return managementIp;
     }
@@ -117,6 +126,7 @@
                 .clusterName(clusterName)
                 .type(type)
                 .intgBridge(intgBridge)
+                .tunBridge(tunBridge)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .state(newState)
@@ -131,6 +141,22 @@
                 .clusterName(clusterName)
                 .type(type)
                 .intgBridge(deviceId)
+                .tunBridge(tunBridge)
+                .managementIp(managementIp)
+                .dataIp(dataIp)
+                .state(state)
+                .phyIntfs(phyIntfs)
+                .build();
+    }
+
+    @Override
+    public KubevirtNode updateTunBridge(DeviceId deviceId) {
+        return new Builder()
+                .hostname(hostname)
+                .clusterName(clusterName)
+                .type(type)
+                .intgBridge(intgBridge)
+                .tunBridge(deviceId)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .state(state)
@@ -168,9 +194,11 @@
                 .clusterName(node.clusterName())
                 .type(node.type())
                 .intgBridge(node.intgBridge())
+                .tunBridge(node.tunBridge())
                 .managementIp(node.managementIp())
                 .dataIp(node.dataIp())
-                .state(node.state());
+                .state(node.state())
+                .phyIntfs(node.phyIntfs());
     }
 
     @Override
@@ -186,13 +214,14 @@
                 hostname.equals(that.hostname) &&
                 type == that.type &&
                 intgBridge.equals(that.intgBridge) &&
+                tunBridge.equals(that.tunBridge) &&
                 managementIp.equals(that.managementIp) &&
                 dataIp.equals(that.dataIp);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(clusterName, hostname, type, intgBridge,
+        return Objects.hash(clusterName, hostname, type, intgBridge, tunBridge,
                 managementIp, dataIp);
     }
 
@@ -203,9 +232,11 @@
                 .add("hostname", hostname)
                 .add("type", type)
                 .add("intgBridge", intgBridge)
+                .add("tunBridge", tunBridge)
                 .add("managementIp", managementIp)
                 .add("dataIp", dataIp)
                 .add("state", state)
+                .add("phyIntfs", phyIntfs)
                 .toString();
     }
 
@@ -215,6 +246,7 @@
         private String hostname;
         private Type type;
         private DeviceId intgBridge;
+        private DeviceId tunBridge;
         private IpAddress managementIp;
         private IpAddress dataIp;
         private KubevirtNodeState state;
@@ -240,6 +272,7 @@
                     hostname,
                     type,
                     intgBridge,
+                    tunBridge,
                     managementIp,
                     dataIp,
                     state,
@@ -272,6 +305,12 @@
         }
 
         @Override
+        public Builder tunBridge(DeviceId deviceId) {
+            this.tunBridge = deviceId;
+            return this;
+        }
+
+        @Override
         public Builder managementIp(IpAddress managementIp) {
             this.managementIp = managementIp;
             return this;
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
index 402d0f9..2cbb471 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -76,6 +76,13 @@
     DeviceId intgBridge();
 
     /**
+     * Returns the device ID of the tunnel bridge at the node.
+     *
+     * @return device id
+     */
+    DeviceId tunBridge();
+
+    /**
      * Returns the management network IP address of the node.
      *
      * @return ip address
@@ -113,6 +120,14 @@
     KubevirtNode updateIntgBridge(DeviceId deviceId);
 
     /**
+     * Returns new kubevirt node instance with given tunnel bridge.
+     *
+     * @param deviceId  tunnel bridge device ID
+     * @return updated kubevirt node
+     */
+    KubevirtNode updateTunBridge(DeviceId deviceId);
+
+    /**
      * Returns a collection of physical interfaces.
      *
      * @return physical interfaces
@@ -163,6 +178,14 @@
         KubevirtNode.Builder intgBridge(DeviceId deviceId);
 
         /**
+         * Returns kubevirt node builder with supplied tunnel bridge name.
+         *
+         * @param deviceId tunnel bridge device ID
+         * @return kubevirt node builder
+         */
+        KubevirtNode.Builder tunBridge(DeviceId deviceId);
+
+        /**
          * Returns kubevirt node builder with supplied management IP address.
          *
          * @param managementIp management IP address
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java
index d3833c1..e1b795a 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeHandler.java
@@ -19,4 +19,42 @@
  * Service handling KubeVirt node state.
  */
 public interface KubevirtNodeHandler {
+
+    /**
+     * Processes the given node for init state.
+     * It creates required bridges on OVS by referring to node type.
+     *
+     * @param node kubevirt node
+     */
+    void processInitState(KubevirtNode node);
+
+    /**
+     * Processes the given node for device created state.
+     * It creates required ports on the bridges based on the node type.
+     *
+     * @param node kubevirt node
+     */
+    void processDeviceCreatedState(KubevirtNode node);
+
+    /**
+     * Processes the given node for complete state.
+     * It performs post-init jobs for the complete node.
+     *
+     * @param node kubevirt node
+     */
+    void processCompleteState(KubevirtNode node);
+
+    /**
+     * Processes the given node for incomplete state.
+     *
+     * @param node kubevirt node
+     */
+    void processIncompleteState(KubevirtNode node);
+
+    /**
+     * Processes the given node for on boarded state.
+     *
+     * @param node kubevirt node
+     */
+    void processOnBoardedState(KubevirtNode node);
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeService.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeService.java
index e032ba3..480969d 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeService.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeService.java
@@ -82,4 +82,13 @@
      * @return kubevirt node
      */
     KubevirtNode node(IpAddress mgmtIp);
+
+    /**
+     * Returns the node with the specified tunnel device ID.
+     * The device ID tunnel bridge.
+     *
+     * @param deviceId device id
+     * @return kubevirt node
+     */
+    KubevirtNode nodeByTunBridge(DeviceId deviceId);
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java
index 87d921e..5baf3f9 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNodeState.java
@@ -26,12 +26,11 @@
     PRE_ON_BOARD {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return ON_BOARDED;
         }
     },
     /**
@@ -40,12 +39,12 @@
     ON_BOARDED {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
+            handler.processOnBoardedState(node);
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return ON_BOARDED;
         }
     },
     /**
@@ -54,12 +53,12 @@
     INIT {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
+            handler.processInitState(node);
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return DEVICE_CREATED;
         }
     },
     /**
@@ -68,12 +67,12 @@
     DEVICE_CREATED {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
+            handler.processDeviceCreatedState(node);
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return COMPLETE;
         }
     },
     /**
@@ -82,12 +81,12 @@
     COMPLETE {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
+            handler.processCompleteState(node);
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return COMPLETE;
         }
     },
     /**
@@ -96,12 +95,12 @@
     INCOMPLETE {
         @Override
         public void process(KubevirtNodeHandler handler, KubevirtNode node) {
-
+            handler.processIncompleteState(node);
         }
 
         @Override
-        public KubevirtNodeState nodeState() {
-            return null;
+        public KubevirtNodeState nextState() {
+            return INIT;
         }
     };
 
@@ -118,5 +117,5 @@
      *
      * @return the next kubevirt node state
      */
-    public abstract KubevirtNodeState nodeState();
+    public abstract KubevirtNodeState nextState();
 }