CORD-247 Add host management network interface to integration bridge

- Node can have management network connectivity by adding "hostManagementIface"
field to the network config "nodes" block, it's optional field
- Added Builder of CordVtnNode
- Improved cordvtn-node-check result
- Some renamings, intBrId -> integrationBridgeId, dpIp -> dataIp,
dpIntf -> dataIface, and dpPort -> dataPort

Change-Id: I7a54edfb273181f0cb35b69fcfc7a448015734bf
diff --git a/src/main/java/org/opencord/cordvtn/api/CordVtnConfig.java b/src/main/java/org/opencord/cordvtn/api/CordVtnConfig.java
index 10bc6a1..29ffaea 100644
--- a/src/main/java/org/opencord/cordvtn/api/CordVtnConfig.java
+++ b/src/main/java/org/opencord/cordvtn/api/CordVtnConfig.java
@@ -16,14 +16,13 @@
 package org.opencord.cordvtn.api;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.Config;
 import org.onosproject.xosclient.api.OpenStackAccess;
 import org.onosproject.xosclient.api.XosAccess;
@@ -51,9 +50,10 @@
     private static final String CORDVTN_NODES = "nodes";
     private static final String HOSTNAME = "hostname";
     private static final String HOST_MANAGEMENT_IP = "hostManagementIp";
-    private static final String DATA_PLANE_IP = "dataPlaneIp";
-    private static final String DATA_PLANE_INTF = "dataPlaneIntf";
-    private static final String BRIDGE_ID = "bridgeId";
+    private static final String HOST_MANAGEMENT_IFACE = "hostManagementIface";
+    private static final String DATA_IP = "dataPlaneIp";
+    private static final String DATA_IFACE = "dataPlaneIntf";
+    private static final String INTEGRATION_BRIDGE_ID = "bridgeId";
 
     private static final String SSH = "ssh";
     private static final String SSH_PORT = "sshPort";
@@ -68,6 +68,8 @@
     private static final String USER = "user";
     private static final String PASSWORD = "password";
 
+    // TODO implement isValid
+
     /**
      * Returns the set of nodes read from network config.
      *
@@ -77,6 +79,7 @@
 
         Set<CordVtnNode> nodes = Sets.newHashSet();
 
+        // TODO implement isValid and move these blocks to it
         JsonNode cordvtnNodes = object.get(CORDVTN_NODES);
         if (cordvtnNodes == null) {
             log.debug("No CORD VTN nodes found");
@@ -90,37 +93,42 @@
         }
 
         for (JsonNode cordvtnNode : cordvtnNodes) {
-            try {
-                NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(cordvtnNode, HOST_MANAGEMENT_IP));
-                NetworkAddress localMgmt = NetworkAddress.valueOf(getConfig(object, LOCAL_MANAGEMENT_IP));
-                if (hostMgmt.prefix().contains(localMgmt.prefix()) ||
-                        localMgmt.prefix().contains(hostMgmt.prefix())) {
-                    log.error("hostMamt and localMgmt cannot be overlapped, skip this node");
-                    continue;
-                }
-
-                Ip4Address hostMgmtIp = hostMgmt.ip().getIp4Address();
-                SshAccessInfo sshInfo = new SshAccessInfo(
-                        hostMgmtIp,
-                        TpPort.tpPort(Integer.parseInt(getConfig(sshNode, SSH_PORT))),
-                        getConfig(sshNode, SSH_USER), getConfig(sshNode, SSH_KEY_FILE));
-
-                String hostname = getConfig(cordvtnNode, HOSTNAME);
-                CordVtnNode newNode = new CordVtnNode(
-                        hostname, hostMgmt, localMgmt,
-                        NetworkAddress.valueOf(getConfig(cordvtnNode, DATA_PLANE_IP)),
-                        TpPort.tpPort(Integer.parseInt(getConfig(object, OVSDB_PORT))),
-                        sshInfo,
-                        DeviceId.deviceId(getConfig(cordvtnNode, BRIDGE_ID)),
-                        getConfig(cordvtnNode, DATA_PLANE_INTF),
-                        CordVtnNodeState.noState());
-
-                nodes.add(newNode);
-            } catch (IllegalArgumentException | NullPointerException e) {
-                log.error("{}", e);
+            // TODO implement isValid and move this block to it
+            NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(cordvtnNode, HOST_MANAGEMENT_IP));
+            NetworkAddress localMgmt = NetworkAddress.valueOf(getConfig(object, LOCAL_MANAGEMENT_IP));
+            if (hostMgmt.prefix().contains(localMgmt.prefix()) ||
+                    localMgmt.prefix().contains(hostMgmt.prefix())) {
+                log.error("hostMamt and localMgmt cannot be overlapped, skip this node");
+                continue;
             }
-        }
 
+            String hostname = getConfig(cordvtnNode, HOSTNAME);
+            SshAccessInfo sshInfo = new SshAccessInfo(
+                    hostMgmt.ip().getIp4Address(),
+                    TpPort.tpPort(Integer.parseInt(getConfig(sshNode, SSH_PORT))),
+                    getConfig(sshNode, SSH_USER), getConfig(sshNode, SSH_KEY_FILE));
+
+            CordVtnNode.Builder nodeBuilder = CordVtnNode.builder()
+                    .hostname(hostname)
+                    .hostMgmtIp(hostMgmt)
+                    .localMgmtIp(localMgmt)
+                    .dataIp(getConfig(cordvtnNode, DATA_IP))
+                    .sshInfo(sshInfo)
+                    .integrationBridgeId(getConfig(cordvtnNode, INTEGRATION_BRIDGE_ID))
+                    .dataIface(getConfig(cordvtnNode, DATA_IFACE));
+
+            String ovsdbPort = getConfig(object, OVSDB_PORT);
+            if (!Strings.isNullOrEmpty(ovsdbPort)) {
+                nodeBuilder.ovsdbPort(Integer.parseInt(ovsdbPort));
+            }
+
+            String hostMgmtIface = getConfig(cordvtnNode, HOST_MANAGEMENT_IFACE);
+            if (!Strings.isNullOrEmpty(hostMgmtIface)) {
+                nodeBuilder.hostMgmtIface(hostMgmtIface);
+            }
+
+            nodes.add(nodeBuilder.build());
+        }
         return nodes;
     }
 
@@ -135,7 +143,7 @@
         jsonNode = jsonNode.path(path);
 
         if (jsonNode.isMissingNode()) {
-            log.error("{} is not configured", path);
+            log.debug("{} is not configured", path);
             return null;
         } else {
             return jsonNode.asText();