Some improvements on cordvtn

- Removed unnecessary CordVtnNodeConfig class
- Don't allow local and host management IP range overlapping
- Check node init state saved in the store instead of really check when a
  VM is detected or vanished since it's too slow

Change-Id: I076780bdc3946b2000176cb05805003ba7c8724d
diff --git a/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java b/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
index 9dd8c24..954e55b 100644
--- a/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
+++ b/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
@@ -24,7 +24,6 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.TpPort;
 import org.onlab.util.ItemNotFoundException;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
@@ -64,6 +63,7 @@
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
@@ -300,6 +300,22 @@
     }
 
     /**
+     * Returns if current node state saved in nodeStore is COMPLETE or not.
+     *
+     * @param node cordvtn node
+     * @return true if it's complete state, otherwise false
+     */
+    private boolean isNodeStateComplete(CordVtnNode node) {
+        checkNotNull(node);
+
+        // the state saved in nodeStore can be wrong if IP address settings are changed
+        // after the node init has been completed since there's no way to detect it
+        // getNodeState and checkNodeInitState always return correct answer but can be slow
+        Versioned<NodeState> state = nodeStore.get(node);
+        return state != null && state.value().equals(NodeState.COMPLETE);
+    }
+
+    /**
      * Returns detailed node initialization state.
      *
      * @param node cordvtn node
@@ -771,7 +787,7 @@
             log.debug("Port {} is added to {}", portName, node.hostname());
 
             if (portName.startsWith(VPORT_PREFIX)) {
-                if (isNodeInitComplete(node)) {
+                if (isNodeStateComplete(node)) {
                     cordVtnService.addServiceVm(node, getConnectPoint(port));
                 } else {
                     log.debug("VM is detected on incomplete node, ignore it.", portName);
@@ -799,7 +815,7 @@
             log.debug("Port {} is removed from {}", portName, node.hostname());
 
             if (portName.startsWith(VPORT_PREFIX)) {
-                if (isNodeInitComplete(node)) {
+                if (isNodeStateComplete(node)) {
                     cordVtnService.removeServiceVm(getConnectPoint(port));
                 } else {
                     log.debug("VM is vanished from incomplete node, ignore it.", portName);
@@ -847,36 +863,12 @@
      */
     private void readConfiguration() {
         CordVtnConfig config = configRegistry.getConfig(appId, CordVtnConfig.class);
-
         if (config == null) {
             log.debug("No configuration found");
             return;
         }
 
-        NetworkAddress localMgmtIp = config.localMgmtIp();
-        TpPort ovsdbPort = config.ovsdbPort();
-        TpPort sshPort = config.sshPort();
-        String sshUser = config.sshUser();
-        String sshKeyFile = config.sshKeyFile();
-
-        config.cordVtnNodes().forEach(node -> {
-            log.debug("Read node {}", node.hostname());
-            CordVtnNode cordVtnNode = new CordVtnNode(
-                    node.hostname(),
-                    node.hostMgmtIp(),
-                    localMgmtIp,
-                    node.dpIp(),
-                    ovsdbPort,
-                    new SshAccessInfo(node.hostMgmtIp().ip().getIp4Address(),
-                                      sshPort,
-                                      sshUser,
-                                      sshKeyFile),
-                    node.bridgeId(),
-                    node.dpIntf());
-
-            addNode(cordVtnNode);
-        });
-
+        config.cordVtnNodes().forEach(this::addNode);
         // TODO remove nodes if needed
     }