Fix: allow to invoke service IP from local k8s node

Change-Id: I8c39703f35319bb51bbd175e7ff717d5e6ec5250
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
index 122a27b..5b3f353 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
@@ -158,6 +158,7 @@
 
         K8sNode intNode;
         K8sNode extNode;
+        K8sNode localNode;
 
         if (node.intgBridge() == null) {
             String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
@@ -183,7 +184,19 @@
                     NOT_DUPLICATED_MSG, extNode.extBridge());
         }
 
-        nodeStore.createNode(extNode);
+        if (node.localBridge() == null) {
+            String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
+            checkNotNull(deviceIdStr, ERR_NULL_DEVICE_ID);
+            localNode = extNode.updateLocalBridge(DeviceId.deviceId(deviceIdStr));
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        } else {
+            localNode = extNode;
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        }
+
+        nodeStore.createNode(localNode);
         log.info(String.format(MSG_NODE, extNode.hostname(), MSG_CREATED));
     }
 
@@ -193,6 +206,7 @@
 
         K8sNode intNode;
         K8sNode extNode;
+        K8sNode localNode;
 
         K8sNode existingNode = nodeStore.node(node.hostname());
         checkNotNull(existingNode, ERR_NULL_NODE);
@@ -221,7 +235,19 @@
                     NOT_DUPLICATED_MSG, extNode.extBridge());
         }
 
-        nodeStore.updateNode(extNode);
+        DeviceId existLocalBridge = nodeStore.node(node.hostname()).localBridge();
+
+        if (extNode.localBridge() == null) {
+            localNode = extNode.updateLocalBridge(existLocalBridge);
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        } else {
+            localNode = extNode;
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        }
+
+        nodeStore.updateNode(localNode);
         log.info(String.format(MSG_NODE, extNode.hostname(), MSG_UPDATED));
     }
 
@@ -295,6 +321,15 @@
         return existNode.isPresent();
     }
 
+    private boolean hasLocalBridge(DeviceId deviceId, String hostname) {
+        Optional<K8sNode> existNode = nodeStore.nodes().stream()
+                .filter(n -> !n.hostname().equals(hostname))
+                .filter(n -> deviceId.equals(n.localBridge()))
+                .findFirst();
+
+        return existNode.isPresent();
+    }
+
     private class InternalNodeStoreDelegate implements K8sNodeStoreDelegate {
 
         @Override