Support to add/update/remove kubevirt node, and add node watcher

Change-Id: I3cae33625b2dd6deb88f7bca2d0252d65667f2c9
(cherry picked from commit b9eb11d5b7012ea1619f512b27766dc04f657f72)
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeManager.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeManager.java
index 99c8244..4e7e39e 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeManager.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeManager.java
@@ -57,9 +57,10 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_BRIDGE;
+import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_BRIDGE;
 import static org.onosproject.kubevirtnode.impl.OsgiPropertyConstants.OVSDB_PORT;
 import static org.onosproject.kubevirtnode.impl.OsgiPropertyConstants.OVSDB_PORT_NUM_DEFAULT;
-import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.genDpid;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -91,6 +92,8 @@
 
     private static final String NOT_DUPLICATED_MSG = "% cannot be duplicated";
 
+    private static final String OF_PREFIX = "of:";
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KubevirtNodeStore nodeStore;
 
@@ -167,7 +170,7 @@
         KubevirtNode tunNode;
 
         if (node.intgBridge() == null) {
-            String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
+            String deviceIdStr = genDpidFromName(INTEGRATION_BRIDGE + "-" + node.hostname());
             checkNotNull(deviceIdStr, ERR_NULL_DEVICE_ID);
             intNode = node.updateIntgBridge(DeviceId.deviceId(deviceIdStr));
             checkArgument(!hasIntgBridge(intNode.intgBridge(), intNode.hostname()),
@@ -179,7 +182,7 @@
         }
 
         if (node.tunBridge() == null) {
-            String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
+            String deviceIdStr = genDpidFromName(TUNNEL_BRIDGE + "-" + node.hostname());
             checkNotNull(deviceIdStr, ERR_NULL_DEVICE_ID);
             tunNode = intNode.updateTunBridge(DeviceId.deviceId(deviceIdStr));
             checkArgument(!hasTunBridge(tunNode.tunBridge(), tunNode.hostname()),
@@ -291,6 +294,11 @@
     }
 
     @Override
+    public boolean hasNode(String hostname) {
+        return nodeStore.nodes().stream().anyMatch(n -> n.hostname().equals(hostname));
+    }
+
+    @Override
     public KubevirtNode nodeByTunBridge(DeviceId deviceId) {
         return nodeStore.nodes().stream()
                 .filter(node -> Objects.equals(node.tunBridge(), deviceId))
@@ -315,6 +323,15 @@
         return existNode.isPresent();
     }
 
+    private String genDpidFromName(String name) {
+        if (name != null) {
+            String hexString = Integer.toHexString(name.hashCode());
+            return OF_PREFIX + Strings.padStart(hexString, 16, '0');
+        }
+
+        return null;
+    }
+
     private class InternalNodeStoreDelegate implements KubevirtNodeStoreDelegate {
 
         @Override