Add node IP attribute in k8s node class with minor code refactoring

Change-Id: I4c1c86c95acfeb38569b91c1677e4ce8af90460f
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
index ebed390..938629f 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
@@ -400,7 +400,7 @@
         nodeService.completeNodes().forEach(n -> {
             K8sNetwork network = networkService.network(n.hostname());
             if (network != null) {
-                ipMap.put(n.dataIp().toString(), network.gatewayIp().toString());
+                ipMap.put(n.nodeIp().toString(), network.gatewayIp().toString());
             }
         });
 
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
index cc19ff7..fd174d7 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
@@ -29,12 +29,14 @@
     private final IpAddress extBridgeIp;
     private final IpAddress extGatewayIp;
     private final MacAddress extGatewayMac;
+    private final String extIntf;
 
     protected DefaultK8sExternalNetwork(IpAddress extBridgeIp, IpAddress extGatewayIp,
-                                        MacAddress extGatewayMac) {
+                                        MacAddress extGatewayMac, String extIntf) {
         this.extBridgeIp = extBridgeIp;
         this.extGatewayIp = extGatewayIp;
         this.extGatewayMac = extGatewayMac;
+        this.extIntf = extIntf;
     }
 
     @Override
@@ -52,6 +54,11 @@
         return extGatewayMac;
     }
 
+    @Override
+    public String extIntf() {
+        return extIntf;
+    }
+
     /**
      * Returns new builder instance.
      *
@@ -71,12 +78,13 @@
         }
         DefaultK8sExternalNetwork that = (DefaultK8sExternalNetwork) o;
         return extBridgeIp.equals(that.extBridgeIp) &&
-                extGatewayIp.equals(that.extGatewayIp);
+                extGatewayIp.equals(that.extGatewayIp) &&
+                extIntf.equals(that.extIntf);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(extBridgeIp, extGatewayIp, extGatewayMac);
+        return Objects.hash(extBridgeIp, extGatewayIp, extGatewayMac, extIntf);
     }
 
     @Override
@@ -85,6 +93,7 @@
                 .add("extBridgeIp", extBridgeIp)
                 .add("extGatewayIp", extGatewayIp)
                 .add("extGatewayMac", extGatewayMac)
+                .add("extIntf", extIntf)
                 .toString();
     }
 
@@ -93,6 +102,7 @@
         private IpAddress extBridgeIp;
         private IpAddress extGatewayIp;
         private MacAddress extGatewayMac;
+        private String extIntf;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -100,7 +110,7 @@
 
         @Override
         public K8sExternalNetwork build() {
-            return new DefaultK8sExternalNetwork(extBridgeIp, extGatewayIp, extGatewayMac);
+            return new DefaultK8sExternalNetwork(extBridgeIp, extGatewayIp, extGatewayMac, extIntf);
         }
 
         @Override
@@ -120,5 +130,11 @@
             this.extGatewayMac = extGatewayMac;
             return this;
         }
+
+        @Override
+        public Builder extIntf(String extIntf) {
+            this.extIntf = extIntf;
+            return this;
+        }
     }
 }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
index 9613bef..b73c118 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
@@ -80,8 +80,8 @@
     private final DeviceId tunBridge;
     private final IpAddress managementIp;
     private final IpAddress dataIp;
+    private final IpAddress nodeIp;
     private final K8sNodeState state;
-    private final String extIntf;
     private final K8sExternalNetwork extNetwork;
     private final String podCidr;
 
@@ -101,9 +101,9 @@
      * @param extBridge         external bridge
      * @param localBridge       local bridge
      * @param tunBridge         tunnel bridge
-     * @param extIntf           external interface
      * @param managementIp      management IP address
      * @param dataIp            data IP address
+     * @param nodeIp            node IP address
      * @param state             node state
      * @param extNetwork        external network
      * @param podCidr           POD CIDR
@@ -111,8 +111,8 @@
     protected DefaultK8sNode(String clusterName, String hostname, Type type,
                              int segmentId, Mode mode, DeviceId intgBridge,
                              DeviceId extBridge, DeviceId localBridge,
-                             DeviceId tunBridge, String extIntf, IpAddress managementIp,
-                             IpAddress dataIp, K8sNodeState state,
+                             DeviceId tunBridge, IpAddress managementIp,
+                             IpAddress dataIp, IpAddress nodeIp, K8sNodeState state,
                              K8sExternalNetwork extNetwork, String podCidr) {
         this.clusterName = clusterName;
         this.hostname = hostname;
@@ -123,9 +123,9 @@
         this.extBridge = extBridge;
         this.localBridge = localBridge;
         this.tunBridge = tunBridge;
-        this.extIntf = extIntf;
         this.managementIp = managementIp;
         this.dataIp = dataIp;
+        this.nodeIp = nodeIp;
         this.state = state;
         this.extNetwork = extNetwork;
         this.podCidr = podCidr;
@@ -220,7 +220,7 @@
 
     @Override
     public String extIntf() {
-        return extIntf;
+        return extNetwork.extIntf();
     }
 
     @Override
@@ -235,13 +235,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -258,13 +259,14 @@
                 .extBridge(deviceId)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -281,13 +283,14 @@
                 .extBridge(extBridge)
                 .localBridge(deviceId)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -304,13 +307,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(deviceId)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -326,6 +330,11 @@
     }
 
     @Override
+    public IpAddress nodeIp() {
+        return nodeIp;
+    }
+
+    @Override
     public K8sNodeState state() {
         return state;
     }
@@ -347,13 +356,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(newState)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -370,13 +380,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(newMac)
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -516,7 +527,7 @@
 
     @Override
     public PortNumber extIntfPortNum() {
-        if (this.extIntf == null) {
+        if (this.extIntf() == null) {
             return null;
         }
         return portNumber(extBridge, extIntf());
@@ -807,9 +818,9 @@
                     extBridge.equals(that.extBridge) &&
                     localBridge.equals(that.localBridge) &&
                     tunBridge.equals(that.tunBridge) &&
-                    extIntf.equals(that.extIntf) &&
                     managementIp.equals(that.managementIp) &&
                     dataIp.equals(that.dataIp) &&
+                    nodeIp.equals(that.nodeIp) &&
                     extNetwork.equals(that.extNetwork) &&
                     podCidr.equals(that.podCidr) &&
                     state == that.state;
@@ -821,7 +832,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
-                localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
+                localBridge, tunBridge, managementIp, dataIp, nodeIp, state, extNetwork, podCidr);
     }
 
     @Override
@@ -836,13 +847,14 @@
                 .add("extBridge", extBridge)
                 .add("localBridge", localBridge)
                 .add("tunBridge", tunBridge)
-                .add("extIntf", extIntf)
                 .add("managementIp", managementIp)
                 .add("dataIp", dataIp)
+                .add("nodeIp", nodeIp)
                 .add("state", state)
                 .add("extBridgeIp", extNetwork.extBridgeIp())
                 .add("extGatewayIp", extNetwork.extGatewayIp())
                 .add("extGatewayMac", extNetwork.extGatewayMac())
+                .add("extIntf", extNetwork.extIntf())
                 .add("podCidr", podCidr)
                 .toString();
     }
@@ -902,10 +914,12 @@
                 .extIntf(node.extIntf())
                 .managementIp(node.managementIp())
                 .dataIp(node.dataIp())
+                .nodeIp(node.nodeIp())
                 .state(node.state())
                 .extBridgeIp(node.extBridgeIp())
                 .extGatewayIp(node.extGatewayIp())
                 .extGatewayMac(node.extGatewayMac())
+                .extIntf(node.extIntf())
                 .podCidr(node.podCidr());
     }
 
@@ -922,6 +936,7 @@
         private DeviceId tunBridge;
         private IpAddress managementIp;
         private IpAddress dataIp;
+        private IpAddress nodeIp;
         private K8sNodeState state;
         private K8sApiConfig apiConfig;
         private String extIntf;
@@ -940,6 +955,7 @@
             checkArgument(type != null, NOT_NULL_MSG, "type");
             checkArgument(state != null, NOT_NULL_MSG, "state");
             checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
+            checkArgument(nodeIp != null, NOT_NULL_MSG, "node IP");
 
             if (StringUtils.isEmpty(clusterName)) {
                 clusterName = DEFAULT_CLUSTER_NAME;
@@ -953,6 +969,7 @@
                     .extBridgeIp(extBridgeIp)
                     .extGatewayIp(extGatewayIp)
                     .extGatewayMac(extGatewayMac)
+                    .extIntf(extIntf)
                     .build();
 
             return new DefaultK8sNode(clusterName,
@@ -964,9 +981,9 @@
                     extBridge,
                     localBridge,
                     tunBridge,
-                    extIntf,
                     managementIp,
                     dataIp,
+                    nodeIp,
                     state,
                     extNetwork,
                     podCidr);
@@ -1027,12 +1044,6 @@
         }
 
         @Override
-        public Builder extIntf(String intf) {
-            this.extIntf = intf;
-            return this;
-        }
-
-        @Override
         public Builder managementIp(IpAddress managementIp) {
             this.managementIp = managementIp;
             return this;
@@ -1045,6 +1056,12 @@
         }
 
         @Override
+        public Builder nodeIp(IpAddress nodeIp) {
+            this.nodeIp = nodeIp;
+            return this;
+        }
+
+        @Override
         public Builder state(K8sNodeState state) {
             this.state = state;
             return this;
@@ -1069,6 +1086,12 @@
         }
 
         @Override
+        public Builder extIntf(String intf) {
+            this.extIntf = intf;
+            return this;
+        }
+
+        @Override
         public Builder podCidr(String podCidr) {
             this.podCidr = podCidr;
             return this;
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
index 3462ad0..6649837 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
@@ -45,6 +45,13 @@
     MacAddress extGatewayMac();
 
     /**
+     * Returns the external interface name.
+     *
+     * @return interface name
+     */
+    String extIntf();
+
+    /**
      * Builder of new network entity.
      */
     interface Builder {
@@ -57,27 +64,35 @@
         K8sExternalNetwork build();
 
         /**
-         * Returns kubernetes node builder with supplied external bridge IP.
+         * Returns kubernetes external network builder with supplied external bridge IP.
          *
          * @param extBridgeIp external bridge IP
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extBridgeIp(IpAddress extBridgeIp);
 
         /**
-         * Returns kubernetes node builder with supplied gateway IP.
+         * Returns kubernetes external network builder with supplied gateway IP.
          *
          * @param extGatewayIp external gateway IP
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extGatewayIp(IpAddress extGatewayIp);
 
         /**
-         * Returns kubernetes node builder with supplied external gateway MAC.
+         * Returns kubernetes external network builder with supplied external gateway MAC.
          *
          * @param extGatewayMac external gateway MAC address
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extGatewayMac(MacAddress extGatewayMac);
+
+        /**
+         * Returns kubernetes external network builder with supplied external interface.
+         *
+         * @param extIntf external interface name
+         * @return kubernetes external network builder
+         */
+        Builder extIntf(String extIntf);
     }
 }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
index 6631e55..eabb13a 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
@@ -187,6 +187,13 @@
     IpAddress dataIp();
 
     /**
+     * Returns the kubernetes node IP address.
+     *
+     * @return ip address; null if node has no IP address
+     */
+    IpAddress nodeIp();
+
+    /**
      * Returns the initialization state of the node.
      *
      * @return node state
@@ -647,6 +654,14 @@
         Builder dataIp(IpAddress dataIp);
 
         /**
+         * Returns the kubernetes node builder with supplied node IP address.
+         *
+         * @param nodeIp node IP address
+         * @return kubernetes node builder
+         */
+        Builder nodeIp(IpAddress nodeIp);
+
+        /**
          * Returns kubernetes node builder with supplied node state.
          *
          * @param state kubernetes node state
diff --git a/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sNodeTest.java b/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sNodeTest.java
index 26553a8..dec1d48 100644
--- a/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sNodeTest.java
+++ b/apps/k8s-node/api/src/test/java/org/onosproject/k8snode/api/DefaultK8sNodeTest.java
@@ -51,6 +51,7 @@
 
     private static final IpAddress MANAGEMENT_IP = IpAddress.valueOf("10.10.10.10");
     private static final IpAddress DATA_IP = IpAddress.valueOf("20.20.20.20");
+    private static final IpAddress NODE_IP = IpAddress.valueOf("30.30.30.30");
 
     private static final String BRIDGE_INTF_1 = "eth1";
     private static final String BRIDGE_INTF_2 = "eth2";
@@ -124,6 +125,7 @@
                 .segmentId(SEGMENT_ID_1)
                 .managementIp(MANAGEMENT_IP)
                 .dataIp(DATA_IP)
+                .nodeIp(NODE_IP)
                 .intgBridge(DEVICE_1.id())
                 .extBridge(DEVICE_1.id())
                 .localBridge(DEVICE_1.id())
@@ -196,6 +198,7 @@
                 .extIntf(BRIDGE_INTF_1)
                 .managementIp(TEST_IP)
                 .dataIp(TEST_IP)
+                .nodeIp(NODE_IP)
                 .state(INIT)
                 .extBridgeIp(EXT_BRIDGE_IP_1)
                 .extGatewayIp(EXT_GATEWAY_IP_1)
@@ -219,6 +222,7 @@
                 .extIntf(BRIDGE_INTF_1)
                 .managementIp(TEST_IP)
                 .dataIp(TEST_IP)
+                .nodeIp(NODE_IP)
                 .state(INIT)
                 .extBridgeIp(EXT_BRIDGE_IP_1)
                 .extGatewayIp(EXT_GATEWAY_IP_1)
@@ -243,6 +247,7 @@
                 .tunBridge(DEVICE_1.id())
                 .extIntf(BRIDGE_INTF_1)
                 .dataIp(TEST_IP)
+                .nodeIp(NODE_IP)
                 .state(INIT)
                 .extBridgeIp(EXT_BRIDGE_IP_1)
                 .extGatewayIp(EXT_GATEWAY_IP_1)
@@ -256,6 +261,7 @@
         assertEquals(node.type(), MINION);
         assertEquals(node.managementIp(), MANAGEMENT_IP);
         assertEquals(node.dataIp(), DATA_IP);
+        assertEquals(node.nodeIp(), NODE_IP);
     }
 
     private static Device createDevice(long devIdNum) {
@@ -287,6 +293,7 @@
                 .extIntf(bridgeIntf)
                 .managementIp(ipAddr)
                 .dataIp(ipAddr)
+                .nodeIp(ipAddr)
                 .state(state)
                 .extBridgeIp(extBridgeIp)
                 .extGatewayIp(extGatewayIp)
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
index 2a938e0..4f4e6bf 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
@@ -48,6 +48,7 @@
     private static final String SEGMENT_ID = "segmentId";
     private static final String MANAGEMENT_IP = "managementIp";
     private static final String DATA_IP = "dataIp";
+    private static final String NODE_IP = "nodeIp";
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
     private static final String EXTERNAL_BRIDGE = "externalBridge";
     private static final String LOCAL_BRIDGE = "localBridge";
@@ -71,7 +72,8 @@
                 .put(MODE, node.mode().name())
                 .put(SEGMENT_ID, node.segmentId())
                 .put(STATE, node.state().name())
-                .put(MANAGEMENT_IP, node.managementIp().toString());
+                .put(MANAGEMENT_IP, node.managementIp().toString())
+                .put(NODE_IP, node.nodeIp().toString());
 
         if (node.intgBridge() != null) {
             result.put(INTEGRATION_BRIDGE, node.intgBridge().toString());
@@ -130,13 +132,16 @@
                 TYPE + MISSING_MESSAGE);
         String mIp = nullIsIllegal(json.get(MANAGEMENT_IP).asText(),
                 MANAGEMENT_IP + MISSING_MESSAGE);
+        String nIp = nullIsIllegal(json.get(NODE_IP).asText(),
+                NODE_IP + MISSING_MESSAGE);
 
         DefaultK8sNode.Builder nodeBuilder = DefaultK8sNode.builder()
                 .clusterName(clusterName)
                 .hostname(hostname)
                 .type(K8sNode.Type.valueOf(type))
                 .state(K8sNodeState.INIT)
-                .managementIp(IpAddress.valueOf(mIp));
+                .managementIp(IpAddress.valueOf(mIp))
+                .nodeIp(IpAddress.valueOf(nIp));
 
         if (json.get(DATA_IP) != null) {
             nodeBuilder.dataIp(IpAddress.valueOf(json.get(DATA_IP).asText()));
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
index bf81f85a..30606f0 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
@@ -203,6 +203,7 @@
         String hostname = node.getMetadata().getName();
         IpAddress managementIp = null;
         IpAddress dataIp = null;
+        IpAddress nodeIp = null;
 
         // pass-through mode: we use host IP as the management and data IP
         // normal mode: we use K8S node's internal IP as the management and data IP
@@ -215,11 +216,17 @@
                 managementIp = info.hostIp();
                 dataIp = info.hostIp();
             }
+            for (NodeAddress nodeAddress:node.getStatus().getAddresses()) {
+                if (nodeAddress.getType().equals(INTERNAL_IP)) {
+                    nodeIp = IpAddress.valueOf(nodeAddress.getAddress());
+                }
+            }
         } else {
             for (NodeAddress nodeAddress:node.getStatus().getAddresses()) {
                 if (nodeAddress.getType().equals(INTERNAL_IP)) {
                     managementIp = IpAddress.valueOf(nodeAddress.getAddress());
                     dataIp = IpAddress.valueOf(nodeAddress.getAddress());
+                    nodeIp = IpAddress.valueOf(nodeAddress.getAddress());
                 }
             }
         }
@@ -267,6 +274,7 @@
                 .hostname(hostname)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .extIntf(extIntf)
                 .type(nodeType)
                 .segmentId(config.segmentId())
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeCodecTest.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeCodecTest.java
index 6b2689d..ae31130 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeCodecTest.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeCodecTest.java
@@ -86,6 +86,7 @@
                 .state(K8sNodeState.INIT)
                 .managementIp(IpAddress.valueOf("10.10.10.1"))
                 .dataIp(IpAddress.valueOf("20.20.20.2"))
+                .nodeIp(IpAddress.valueOf("30.30.30.3"))
                 .intgBridge(DeviceId.deviceId("kbr-int"))
                 .extIntf("eth1")
                 .extBridgeIp(IpAddress.valueOf("10.10.10.5"))
@@ -112,6 +113,7 @@
         assertEquals(100, node.segmentId());
         assertEquals("172.16.130.4", node.managementIp().toString());
         assertEquals("172.16.130.4", node.dataIp().toString());
+        assertEquals("172.16.130.5", node.nodeIp().toString());
         assertEquals("of:00000000000000a1", node.intgBridge().toString());
         assertEquals("eth1", node.extIntf());
         assertEquals("172.16.130.5", node.extBridgeIp().toString());
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeJsonMatcher.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeJsonMatcher.java
index 71c5ca9..d0d97a8 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeJsonMatcher.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/codec/K8sNodeJsonMatcher.java
@@ -35,6 +35,7 @@
     private static final String SEGMENT_ID = "segmentId";
     private static final String MANAGEMENT_IP = "managementIp";
     private static final String DATA_IP = "dataIp";
+    private static final String NODE_IP = "nodeIp";
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
     private static final String STATE = "state";
     private static final String EXTERNAL_INTF = "externalInterface";
@@ -91,6 +92,14 @@
             return false;
         }
 
+        // check node IP
+        String jsonNodeIp = jsonNode.get(NODE_IP).asText();
+        String nodeIp = node.nodeIp().toString();
+        if (!jsonNodeIp.equals(nodeIp)) {
+            description.appendText("node IP was " + jsonNodeIp);
+            return false;
+        }
+
         // check integration bridge
         JsonNode jsonIntgBridge = jsonNode.get(INTEGRATION_BRIDGE);
         if (jsonIntgBridge != null) {
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/impl/K8sNodeManagerTest.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/impl/K8sNodeManagerTest.java
index 0bb0258..e336164 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/impl/K8sNodeManagerTest.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/impl/K8sNodeManagerTest.java
@@ -360,6 +360,7 @@
                 .tunBridge(tunBridge.id())
                 .managementIp(ipAddr)
                 .dataIp(ipAddr)
+                .nodeIp(ipAddr)
                 .state(state)
                 .build();
     }
diff --git a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
index 1005ab2..9908e99 100644
--- a/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
+++ b/apps/k8s-node/app/src/test/java/org/onosproject/k8snode/web/K8sNodeWebResourceTest.java
@@ -97,6 +97,7 @@
                 .type(K8sNode.Type.MINION)
                 .dataIp(IpAddress.valueOf("10.134.34.222"))
                 .managementIp(IpAddress.valueOf("10.134.231.30"))
+                .nodeIp(IpAddress.valueOf("30.30.30.3"))
                 .intgBridge(DeviceId.deviceId("of:00000000000000a1"))
                 .extBridge(DeviceId.deviceId("of:00000000000000b1"))
                 .state(K8sNodeState.INIT)
diff --git a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sMinionNode.json b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sMinionNode.json
index fb01b77..ca78a90 100644
--- a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sMinionNode.json
+++ b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/codec/K8sMinionNode.json
@@ -5,6 +5,7 @@
   "segmentId": 100,
   "managementIp": "172.16.130.4",
   "dataIp": "172.16.130.4",
+  "nodeIp": "172.16.130.5",
   "integrationBridge": "of:00000000000000a1",
   "externalBridge": "of:00000000000000b1",
   "externalInterface": "eth1",
diff --git a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/web/k8s-node-minion-config.json b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/web/k8s-node-minion-config.json
index 1e7d4a4..08aa1b1 100644
--- a/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/web/k8s-node-minion-config.json
+++ b/apps/k8s-node/app/src/test/resources/org/onosproject/k8snode/web/k8s-node-minion-config.json
@@ -6,6 +6,7 @@
       "type" : "MINION",
       "managementIp" : "10.134.231.32",
       "dataIp" : "10.134.34.224",
+      "nodeIp" : "30.30.30.3",
       "integrationBridge" : "of:00000000000000a2",
       "externalBridge" : "of:00000000000000b2"
     }