Refer to external bridge and gateway IP from k8s node store

Change-Id: I7dab97ead59e3746b67e6e3bedc3a2c6fea41bf1
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 6676847..7c7b32b 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
@@ -44,6 +44,9 @@
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
     private static final String EXTERNAL_BRIDGE = "externalBridge";
     private static final String STATE = "state";
+    private static final String EXTERNAL_INTF = "externalInterface";
+    private static final String EXTERNAL_BRIDGE_IP = "externalBridgeIp";
+    private static final String EXTERNAL_GATEWAY_IP = "externalGatewayIp";
 
     private static final String MISSING_MESSAGE = " is required in K8sNode";
 
@@ -69,6 +72,18 @@
             result.put(DATA_IP, node.dataIp().toString());
         }
 
+        if (node.extIntf() != null) {
+            result.put(EXTERNAL_INTF, node.extIntf());
+        }
+
+        if (node.extBridgeIp() != null) {
+            result.put(EXTERNAL_BRIDGE_IP, node.extBridgeIp().toString());
+        }
+
+        if (node.extGatewayIp() != null) {
+            result.put(EXTERNAL_GATEWAY_IP, node.extGatewayIp().toString());
+        }
+
         return result;
     }
 
@@ -105,6 +120,21 @@
             nodeBuilder.extBridge(DeviceId.deviceId(extBridgeJson.asText()));
         }
 
+        JsonNode extIntfJson = json.get(EXTERNAL_INTF);
+        if (extIntfJson != null) {
+            nodeBuilder.extIntf(extIntfJson.asText());
+        }
+
+        JsonNode extBridgeIpJson = json.get(EXTERNAL_BRIDGE_IP);
+        if (extBridgeIpJson != null) {
+            nodeBuilder.extBridgeIp(IpAddress.valueOf(extBridgeIpJson.asText()));
+        }
+
+        JsonNode extGatewayIpJson = json.get(EXTERNAL_GATEWAY_IP);
+        if (extGatewayIpJson != null) {
+            nodeBuilder.extGatewayIp(IpAddress.valueOf(extGatewayIpJson.asText()));
+        }
+
         log.trace("node is {}", nodeBuilder.build().toString());
 
         return nodeBuilder.build();
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 ab04556..5119500 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
@@ -38,6 +38,7 @@
 import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 
@@ -60,6 +61,9 @@
 
     private static final String INTERNAL_IP = "InternalIP";
     private static final String K8S_ROLE = "node-role.kubernetes.io";
+    private static final String EXT_BRIDGE_IP = "external.bridge.ip";
+    private static final String EXT_GATEWAY_IP = "external.gateway.ip";
+    private static final String EXT_INTF_NAME = "external.interface.name";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
@@ -156,12 +160,22 @@
             }
         }
 
+        Map<String, String> annots = node.getMetadata().getAnnotations();
+
+        String extIntf = annots.get(EXT_INTF_NAME);
+        String extGatewayIpStr = annots.get(EXT_GATEWAY_IP);
+        String extBridgeIpStr = annots.get(EXT_BRIDGE_IP);
+
         return DefaultK8sNode.builder()
                 .hostname(hostname)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
-                .type(nodeType)  // need to get correct node type
+                .extIntf(extIntf)
+                .type(nodeType)
                 .state(INIT)
+                .extBridgeIp(IpAddress.valueOf(extBridgeIpStr))
+                .extGatewayIp(IpAddress.valueOf(extGatewayIpStr))
+                .podCidr(node.getSpec().getPodCIDR())
                 .build();
     }
 
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 7f156e8..556e462 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
@@ -84,6 +84,9 @@
                 .managementIp(IpAddress.valueOf("10.10.10.1"))
                 .dataIp(IpAddress.valueOf("20.20.20.2"))
                 .intgBridge(DeviceId.deviceId("kbr-int"))
+                .extIntf("eth1")
+                .extBridgeIp(IpAddress.valueOf("10.10.10.5"))
+                .extGatewayIp(IpAddress.valueOf("10.10.10.1"))
                 .build();
 
         ObjectNode nodeJson = k8sNodeCodec.encode(node, context);
@@ -104,6 +107,9 @@
         assertEquals("172.16.130.4", node.managementIp().toString());
         assertEquals("172.16.130.4", node.dataIp().toString());
         assertEquals("of:00000000000000a1", node.intgBridge().toString());
+        assertEquals("eth1", node.extIntf());
+        assertEquals("172.16.130.5", node.extBridgeIp().toString());
+        assertEquals("172.16.130.1", node.extGatewayIp().toString());
     }
 
     private K8sNode getK8sNode(String resourceName) throws IOException {
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 58b15d2..b953f54 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
@@ -18,6 +18,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onlab.packet.IpAddress;
 import org.onosproject.k8snode.api.K8sNode;
 
 /**
@@ -33,6 +34,9 @@
     private static final String DATA_IP = "dataIp";
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
     private static final String STATE = "state";
+    private static final String EXTERNAL_INTF = "externalInterface";
+    private static final String EXTERNAL_BRIDGE_IP = "externalBridgeIp";
+    private static final String EXTERNAL_GATEWAY_IP = "externalGatewayIp";
 
     private K8sNodeJsonMatcher(K8sNode node) {
         this.node = node;
@@ -93,6 +97,36 @@
             }
         }
 
+        // check external interface
+        JsonNode jsonExtIntf = jsonNode.get(EXTERNAL_INTF);
+        if (jsonExtIntf != null) {
+            String extIntf = node.extIntf();
+            if (!jsonExtIntf.asText().equals(extIntf)) {
+                description.appendText("External interface was " + jsonExtIntf.asText());
+                return false;
+            }
+        }
+
+        // check external bridge IP
+        JsonNode jsonExtBridgeIp = jsonNode.get(EXTERNAL_BRIDGE_IP);
+        if (jsonExtBridgeIp != null) {
+            IpAddress extBridgeIp = node.extBridgeIp();
+            if (!jsonExtBridgeIp.asText().equals(extBridgeIp.toString())) {
+                description.appendText("External bridge IP was " + jsonExtBridgeIp.asText());
+                return false;
+            }
+        }
+
+        // check external gateway IP
+        JsonNode jsonExtGatewayIp = jsonNode.get(EXTERNAL_GATEWAY_IP);
+        if (jsonExtGatewayIp != null) {
+            IpAddress extGatewayIp = node.extGatewayIp();
+            if (!jsonExtGatewayIp.asText().equals(extGatewayIp.toString())) {
+                description.appendText("External gateway IP was " + jsonExtGatewayIp.asText());
+                return false;
+            }
+        }
+
         return true;
     }
 
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 9ed649e..2930bfd 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
@@ -4,5 +4,8 @@
   "managementIp": "172.16.130.4",
   "dataIp": "172.16.130.4",
   "integrationBridge": "of:00000000000000a1",
-  "externalBridge": "of:00000000000000b1"
+  "externalBridge": "of:00000000000000b1",
+  "externalInterface": "eth1",
+  "externalBridgeIp": "172.16.130.5",
+  "externalGatewayIp": "172.16.130.1"
 }
\ No newline at end of file