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
}